2015-10-30 31 views
16

Tôi đang cố gắng ghi dữ liệu số được lấy từ cơ sở dữ liệu vào một Float64[]. Các dữ liệu ban đầu là ở định dạng ::ASCIIString, vì vậy cố gắng để đẩy nó vào mảng cung cấp cho các lỗi sau:Julia: Chuyển đổi chuỗi số thành float hoặc 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 

Cố gắng để chuyển đổi dữ liệu trực tiếp gì ngạc nhiên ném những lỗi tương tự:

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

Cho rằng tôi biết dữ liệu là số, có cách nào tôi có thể chuyển đổi dữ liệu trước khi đẩy không?

p.s. Tôi đang sử dụng phiên bản 0.4.0

+2

Bạn có thể 'phân tích cú pháp (Float64, "1") 'từ một chuỗi. Hoặc trong trường hợp của một vector 'map (x-> parse (Float64, x), stringvec)' sẽ phân tích cú pháp toàn bộ vectơ. –

+0

Công trình này, cảm ơn! –

+0

BTW xem xét sử dụng 'tryparse (Float64, x)' thay vì 'phân tích cú pháp '. Nó trả về một Nullable Float là null trong chuỗi trường hợp không phân tích tốt. –

Trả lời

23

Bạn có thể parse(Float64,"1") từ một chuỗi. Hoặc trong trường hợp của một vector

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

sẽ phân tích cú pháp toàn bộ vectơ.

BTW xem xét sử dụng tryparse(Float64,x) thay vì phân tích cú pháp. Nó trả về một Nullable {Float64} là null trong chuỗi trường hợp không phân tích tốt. Ví dụ:

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

Và thường người ta sẽ muốn có một giá trị mặc định trong trường hợp có lỗi phân tích cú pháp:

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] 
Các vấn đề liên quan