web-dev-qa-db-fra.com

Julia: convertir une chaîne numérique en float ou int

J'essaie d'écrire des données numériques extraites d'une base de données dans un Float64[]. Les données d'origine sont dans ::ASCIIString format, donc essayer de le pousser vers le tableau donne l'erreur suivante:

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

Tenter de convertir les données directement sans surprise lance la même erreur:

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

Étant donné que je sais que les données sont numériques, existe-t-il un moyen de les convertir avant de les pousser?

p.s. J'utilise la version 0.4.0

25
peter-b

Vous pouvez parse(Float64,"1") à partir d'une chaîne. Ou dans le cas d'un vecteur

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

analysera tout le vecteur.

BTW envisage d'utiliser tryparse(Float64,x) au lieu d'analyser. Il retourne un Nullable {Float64} qui est nul dans le cas où la chaîne n'analyse pas bien. Par exemple:

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

Et généralement, on voudrait une valeur par défaut en cas d'erreur d'analyse:

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]
38
Dan Getz

Utilisez parse(Float64,"1").

Voir plus à: spécification d'analyse

7
Maciek Leks