如何检查字符串是否为数字 Julia
How to check if a string is numeric Julia
一直在网上搜索以试图解决这个问题。已尝试 isnumeric
,但这仅适用于 AbstractChar
。如果可能的话,我宁愿不必使用 tryparse
,但如果这是唯一的解决方案,那就这样吧......如果是,为什么还没有实现检查字符串是否为数字的函数?
您通常使用正则表达式来检查字符串是否为数字:
julia> re = r"^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)$";
julia> occursin(re,"123.")
true
julia> occursin(re,"123.0")
true
julia> occursin(re,"123.012")
true
julia> occursin(re,"123")
true
julia> occursin(re,"ab")
false
julia> occursin(re,"ab123.1")
false
julia> occursin(re,"123.1e")
false
注意:我已经使用了在 Regular expression for floating point numbers 找到的正则表达式 如果您只想拥有整数部分或包括指数,这样现成的正则表达式也很容易找到。
编辑:基准测试。
让我们考虑以下函数来检查字符串是否为数字:
function check_str(a)
try
parse(Float64,a)
true
catch
false
end
end
这是基准测试。请注意,正则表达式大约快 200 倍(如果我们决定也寻找指数部分,增加的幅度会更小)并且不分配。
julia> using BenchmarkTools
julia> @btime check_str("60.0a")
15.359 μs (18 allocations: 816 bytes)
false
julia> @btime occursin($re,"60.0a")
67.023 ns (0 allocations: 0 bytes)
false
当 String
成功解析后,速度差距会小得多:
julia> @btime check_str("60.0")
298.833 ns (0 allocations: 0 bytes)
true
julia> @btime occursin($re,"60.0")
58.865 ns (0 allocations: 0 bytes)
true
我发现最快的解决方案是按照建议使用 tryparse
。
function check_str2(a)
return tryparse(Float64, a) !== nothing
end
与正则表达式的 40 纳秒相比,平均耗时 20 纳秒。
无法在不进行转换的情况下检查字符串作为 int 是否有效的主要原因是,在性能很重要的地方,这样做并没有太多令人信服的用例。在大多数地方,您想知道是否可以将某些东西解析为数字以将其用作数字,并且在极少数情况下,额外的几个 ns 可能并不重要。
这对我有用:
isa(tryparse(Float64,"StringNumber"), Number) # true | false
正如 OP 在评论中建议的那样,他们只需要检查整数,您仍然可以使用 isnumeric
(或者最好使用 isdigit
):
isintstring(str) = all(isdigit(c) for c in str)
这似乎比此处的其他答案更快地进行基准测试。在我的机器上,这个基准测试大约为 37/38 ns,而 tryparse
解决方案的基准测试大约为 64/65 ns。
一直在网上搜索以试图解决这个问题。已尝试 isnumeric
,但这仅适用于 AbstractChar
。如果可能的话,我宁愿不必使用 tryparse
,但如果这是唯一的解决方案,那就这样吧......如果是,为什么还没有实现检查字符串是否为数字的函数?
您通常使用正则表达式来检查字符串是否为数字:
julia> re = r"^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)$";
julia> occursin(re,"123.")
true
julia> occursin(re,"123.0")
true
julia> occursin(re,"123.012")
true
julia> occursin(re,"123")
true
julia> occursin(re,"ab")
false
julia> occursin(re,"ab123.1")
false
julia> occursin(re,"123.1e")
false
注意:我已经使用了在 Regular expression for floating point numbers 找到的正则表达式 如果您只想拥有整数部分或包括指数,这样现成的正则表达式也很容易找到。
编辑:基准测试。
让我们考虑以下函数来检查字符串是否为数字:
function check_str(a)
try
parse(Float64,a)
true
catch
false
end
end
这是基准测试。请注意,正则表达式大约快 200 倍(如果我们决定也寻找指数部分,增加的幅度会更小)并且不分配。
julia> using BenchmarkTools
julia> @btime check_str("60.0a")
15.359 μs (18 allocations: 816 bytes)
false
julia> @btime occursin($re,"60.0a")
67.023 ns (0 allocations: 0 bytes)
false
当 String
成功解析后,速度差距会小得多:
julia> @btime check_str("60.0")
298.833 ns (0 allocations: 0 bytes)
true
julia> @btime occursin($re,"60.0")
58.865 ns (0 allocations: 0 bytes)
true
我发现最快的解决方案是按照建议使用 tryparse
。
function check_str2(a)
return tryparse(Float64, a) !== nothing
end
与正则表达式的 40 纳秒相比,平均耗时 20 纳秒。
无法在不进行转换的情况下检查字符串作为 int 是否有效的主要原因是,在性能很重要的地方,这样做并没有太多令人信服的用例。在大多数地方,您想知道是否可以将某些东西解析为数字以将其用作数字,并且在极少数情况下,额外的几个 ns 可能并不重要。
这对我有用:
isa(tryparse(Float64,"StringNumber"), Number) # true | false
正如 OP 在评论中建议的那样,他们只需要检查整数,您仍然可以使用 isnumeric
(或者最好使用 isdigit
):
isintstring(str) = all(isdigit(c) for c in str)
这似乎比此处的其他答案更快地进行基准测试。在我的机器上,这个基准测试大约为 37/38 ns,而 tryparse
解决方案的基准测试大约为 64/65 ns。