通常使用正则表达式来检查字符串是否为数字:
\n\njulia> 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\nRun Code Online (Sandbox Code Playgroud)\n\n注意:我使用了浮点数正则表达式中的正则表达式中的正则表达式如果您只想拥有整数部分或包含指数,那么现成的正则表达式也很容易找到。
\n\n编辑:基准测试。
\n\n让我们考虑以下函数来检查字符串是否为数字:
\n\nfunction check_str(a)\n try\n parse(Float64,a)\n true\n catch\n false\n end\nend\nRun Code Online (Sandbox Code Playgroud)\n\n以下是基准测试。请注意,正则表达式大约快 200 倍(如果我们决定同时查找指数部分,则增量会更小)并且不会分配。
\n\njulia> 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\nRun Code Online (Sandbox Code Playgroud)\n\n当String成功解析时,速度差距要小得多:
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\nRun Code Online (Sandbox Code Playgroud)\n
我找到的最快的解决方案是tryparse按照推荐使用。
function check_str2(a)
return tryparse(Float64, a) !== nothing
end
Run Code Online (Sandbox Code Playgroud)
与正则表达式的平均 40 纳秒相比,它平均为 20 纳秒。
没有办法在不转换的情况下检查字符串是否作为 int 有效的主要原因是,在性能很重要的地方这样做的用例并不多。在大多数地方,您想知道是否可以将某些内容解析为数字以将其用作数字,并且在极少数情况下,额外的几个 ns 可能无关紧要。
| 归档时间: |
|
| 查看次数: |
1890 次 |
| 最近记录: |