如何检查字符串是否为数字 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。