如何检查字符串是否为数字 Julia

Mas*_*ify 6 string numbers numeric julia

一直在网上搜索试图解决这个问题。尝试过isnumeric,但这仅适用于AbstractChar. tryparse如果可能,我宁愿不必使用,但如果这是唯一的解决方案,那就这样吧……如果是,为什么还没有实现用于检查字符串是否为数字的函数?

Prz*_*fel 5

通常使用正则表达式来检查字符串是否为数字:

\n\n
julia> re = r"^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)$";\n\njulia> occursin(re,"123.")\ntrue\n\njulia> occursin(re,"123.0")\ntrue\n\njulia> occursin(re,"123.012")\ntrue\n\njulia> occursin(re,"123")\ntrue \n\njulia> occursin(re,"ab")\nfalse\n\njulia> occursin(re,"ab123.1")\nfalse\n\njulia> occursin(re,"123.1e")\nfalse\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:我使用了浮点数正则表达式中的正则表达式中的正则表达式如果您只想拥有整数部分或包含指数,那么现成的正则表达式也很容易找到。

\n\n

编辑:基准测试。

\n\n

让我们考虑以下函数来检查字符串是否为数字:

\n\n
function check_str(a)\n    try\n        parse(Float64,a)\n        true\n    catch\n        false\n    end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

以下是基准测试。请注意,正则表达式大约快 200 倍(如果我们决定同时查找指数部分,则增量会更小)并且不会分配。

\n\n
julia> using BenchmarkTools\n\njulia> @btime check_str("60.0a")\n  15.359 \xce\xbcs (18 allocations: 816 bytes)\nfalse\n\njulia> @btime occursin($re,"60.0a")\n  67.023 ns (0 allocations: 0 bytes)\nfalse\n
Run Code Online (Sandbox Code Playgroud)\n\n

String成功解析时,速度差距要小得多:

\n\n
julia> @btime check_str("60.0")\n  298.833 ns (0 allocations: 0 bytes)\ntrue\n\njulia> @btime occursin($re,"60.0")\n  58.865 ns (0 allocations: 0 bytes)\ntrue\n
Run Code Online (Sandbox Code Playgroud)\n


Osc*_*ith 5

我找到的最快的解决方案是tryparse按照推荐使用。

function check_str2(a)
    return tryparse(Float64, a) !== nothing
end
Run Code Online (Sandbox Code Playgroud)

与正则表达式的平均 40 纳秒相比,它平均为 20 纳秒。

没有办法在不转换的情况下检查字符串是否作为 int 有效的主要原因是,在性能很重要的地方这样做的用例并不多。在大多数地方,您想知道是否可以将某些内容解析为数字以将其用作数字,并且在极少数情况下,额外的几个 ns 可能无关紧要。