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所指示的行为。但是,JuliaBase
中的tryparse
没有相同的行为(即,它工作),实际上比下面的check\u str
更快。我编辑此解决方案以使用Base
版本。