web-dev-qa-db-ja.com

ジュリア:数値文字列をfloatまたはintに変換する

データベースから取得した数値データをFloat64[]に書き込もうとしています。元のデータは::ASCIIString形式であるため、配列にプッシュしようとすると次のエラーが発生します。

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

当然のことながら、データを直接変換しようとすると、同じエラーがスローされます。

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

データが数値であることを知っている場合、プッシュする前に変換する方法はありますか?

追伸バージョン0.4.0を使用しています

25
peter-b

文字列からparse(Float64,"1")できます。またはベクトルの場合

_map(x->parse(Float64,x),stringvec)
_

ベクトル全体を解析します。

ところで、解析の代わりにtryparse(Float64,x)の使用を検討してください。文字列が適切に解析されない場合はNullable {Float64}を返します。例えば:

_isnull(tryparse(Float64,"33.2.1")) == true
_

そして通常、解析エラーの場合にはデフォルト値が必要になります:

_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

parse(Float64,"1")を使用します。

詳細は parse specification をご覧ください

7
Maciek Leks