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

String 如何检查字符串是否为数字字符串,string,numbers,julia,numeric,String,Numbers,Julia,Numeric,我一直在互联网上寻找答案。尝试了isnumeric,但这只适用于AbstractChar。如果可能的话,我宁愿不使用tryparse,但如果这是唯一的解决方案,那就这样吧。。。如果是,为什么还没有实现用于检查字符串是否为数字的函数?您通常使用正则表达式检查字符串是否为数字: julia> re = r"^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)$"; julia> occursin(re,"123.") true julia> occursin

我一直在互联网上寻找答案。尝试了
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
function check_str(a)
    try
        parse(Float64,a)
        true
    catch
        false
    end
end
注意:如果您只想得到整数部分或包含指数,我使用了在中找到的正则表达式,这样的现成正则表达式也很容易找到

编辑:基准测试

让我们考虑下面的函数来检查一个字符串是否是个数字:

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
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
成功解析
字符串时,速度差会小得多:

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
平均为20纳秒,而正则表达式为40纳秒

在没有转换的情况下,无法检查字符串是否作为int有效的主要原因是,在性能重要的地方,这样做并没有太多令人信服的用例。在大多数情况下,您想知道是否可以将某个东西解析为一个数字以将其用作一个数字,而在极少数情况下,额外的两个N可能并不重要。

这对我很有用:

isa(tryparse(Float64,"StringNumber"), Number)    # true | false

为什么不
tryparse
tryparse
是正确的。没有一种可能的实现不涉及将字符串解析为数字。你说的“数字”是什么意思?
1.0e2
是数字吗?
6.2f22
是数字的吗?那么
0x02
呢?还是
0b100101
?或者
0xdead_beef.cap23
?@DNF,因为我个人觉得它有点像黑客。@MattB。这里我指的是整数,但在理论上,我在寻找一种检查任何数值的方法。与
tryparse
相比,它有什么优势吗?它大约快200倍,代码更短,并且不分配。我将用一个例子更新我的答案。如果你使用tryparse而不是从parse中捕获异常,那么它平均只有20纳秒(相比之下,regex只有30纳秒)惊人的工作@PrzemyslawSzufel!不过,我会记住奥斯卡·史密斯关于时间的评论。目前我的问题不需要超级核心优化,所以无论哪种方式都可以。虽然这个答案绝对令人惊讶,并且投入了大量的努力,但奥斯卡·史密斯的答案更具功能性,因为它还考虑了六位小数和科学记数法,正如马特·B所指出的那样。奥斯卡的答案不起作用(见我在下面的评论)——它可能会对
字符串
返回假阳性,例如“`“60xxx”`或
60.0xxx
。您应该使用
Base.parse
(比regex慢)或regex。我使用了benchmarktools中的
@benchmark
。我使用的是julia 1.1.1,但是,您的解决方案不起作用
check_str2(“60.0xxx”)
返回
true
,并且
60.0xxx
不是数字。
解析器的问题。tryparse
可能是它试图从
字符串中提取一个数字,并且在刚开始的时候它很高兴。^据我的测试所知,在最近的Julia上(即1.0版之后),
check_str2(“60.0xxx”)返回
false
我很惊讶它居然返回了
true
)实际上
Parsers.tryparse
(来自
Parsers.jl
包)确实具有@PrzemyslawSzufel所指示的行为。但是,Julia
Base
中的
tryparse
没有相同的行为(即,它工作),实际上比下面的
check\u str
更快。我编辑此解决方案以使用
Base
版本。