2015-10-30 17 views
16

Próbuję zapisać dane numeryczne wyciągnięte z bazy danych do Float64[]. Oryginalne dane w formacie ::ASCIIString, więc starają się wcisnąć go do tablicy daje następujący błąd:Julia: Konwertuj łańcuch liczbowy na wartość float lub int

julia> push!(a, "1") 
ERROR: MethodError: `convert` has no method matching convert(::Type{Float64}, ::ASCIIString) 
This may have arisen from a call to the constructor Float64(...), 
since type constructors fall back to convert methods. 
Closest candidates are: 
    call{T}(::Type{T}, ::Any) 
    convert(::Type{Float64}, ::Int8) 
    convert(::Type{Float64}, ::Int16) 
    ... 
in push! at array.jl:432 

Próba konwersji danych bezpośrednio zaskoczeniem rzuca ten sam błąd:

julia> convert(Float64, "1") 
ERROR: MethodError: `convert` has no method matching convert(::Type{Float64}, ::ASCIIString) 
This may have arisen from a call to the constructor Float64(...), 
since type constructors fall back to convert methods. 
Closest candidates are: 
    call{T}(::Type{T}, ::Any) 
    convert(::Type{Float64}, ::Int8) 
    convert(::Type{Float64}, ::Int16) 
    ... 

Zważywszy, że I wiedzieć, że dane są numeryczne, czy istnieje sposób, w jaki mogę je przekonwertować przed wysłaniem?

p.s. Używam wersji 0.4.0

+2

Można 'parse (Float64 "1")' z ciągiem. Lub w przypadku wektora 'map (x-> pars (Float64, x), stringvec)" przeanalizuje cały wektor. –

+0

To działa, dziękuję! –

+0

BTW rozważ użycie 'tryparse (Float64, x)' zamiast 'parsowania'. Zwraca wartość Nullable Float, która ma wartość NULL w przypadku, gdy łańcuch znaków nie parsuje się dobrze. –

Odpowiedz

23

Można parse(Float64,"1") z ciągiem. Lub w przypadku wektora będzie analizować cały wektor.

BTW należy rozważyć użycie tryparse(Float64,x) zamiast analizować. Zwraca Nullable {Float64}, który ma wartość NULL w łańcuchu przypadku, nie parsuje się dobrze. Na przykład:

isnull(tryparse(Float64,"33.2.1")) == true 

i zazwyczaj można by chcieć wartość domyślną w przypadku błędu parsowania:

strvec = ["1.2","NA","-1e3"] 
map(x->(v = tryparse(Float64,x); isnull(v) ? 0.0 : get(v)),strvec) 
# gives [1.2,0.0,-1000.0]