Julia: Преобразование числовой строки в 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)
...
Учитывая, что я знаю, что данные являются числовыми, есть ли способ, которым я могу преобразовать его перед нажатием?
p.s. Я использую версию 0.4.0
Ответы
Ответ 1
Вы можете parse(Float64,"1")
из строки. Или в случае вектора
map(x->parse(Float64,x),stringvec)
будет анализировать весь вектор.
BTW рассмотрите возможность использования 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]
Ответ 2
Используйте parse(Float64,"1")
.
См. больше: описать разбор