2015-10-30 8 views
16

Sto provando a scrivere dati numerici estratti da un database in un Float64[]. I dati originali sono in formato ::ASCIIString, in modo da cercare di spingerlo alla matrice dà il seguente errore:Julia: Converte stringa numerica in virgola mobile o interna

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 

Tentare di convertire i dati direttamente sorprende tiri lo stesso errore:

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) 
    ... 

Dato che ho sapere che i dati sono numerici, c'è un modo per convertirli prima di premere?

p.s. Sto usando la versione 0.4.0

+2

È possibile 'parse (float64, "1")' da una stringa. O nel caso di un vettore 'map (x-> parse (Float64, x), stringvec)' analizzerà l'intero vettore. –

+0

Funziona, grazie! –

+0

BTW considera l'uso di 'tryparse (Float64, x)' invece di 'parse'. Restituisce un Nullable Float che è nullo nel caso in cui la stringa non analizzi bene. –

risposta

23

È possibile parse(Float64,"1") da una stringa. O nel caso di un vettore

map(x->parse(Float64,x),stringvec) 

analizzerà l'intero vettore.

BTW considerare l'utilizzo di tryparse(Float64,x) anziché analisi. Restituisce un Nullabile {Float64} che è null nella stringa del caso che non analizza bene. Per esempio:

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

E di solito ci si vuole un valore di default in caso di un errore di analisi:

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]