Как проверить, является ли строка числовой Julia - PullRequest
1 голос
/ 12 июня 2019

Я искал в интернете, пытаясь понять это. Пробовал isnumeric, но это работает только для AbstractChar. Я бы предпочел не использовать tryparse, если это возможно, но если это единственное решение, так и будет ... Если это так, почему еще не реализована функция проверки, является ли строка числовой?

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Обычно вы используете регулярное выражение, чтобы проверить, является ли строка числом:

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

Примечание: я использовал регулярное выражение, найденное в Регулярное выражение для чисел с плавающей запятой Если вы просто хотите иметь целую часть или включить экспоненту, такие готовые регулярные выражения также легко найти.

РЕДАКТИРОВАТЬ: контрольный тест.

Давайте рассмотрим следующую функцию, чтобы проверить, является ли String числом:

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
0 голосов
/ 13 июня 2019

Самое быстрое решение, которое я нашел, - это использовать tryparse в соответствии с рекомендациями.

function check_str2(a)
    return Parsers.tryparse(Float64, a)!==nothing
end

Это в среднем 20 нс по сравнению с 40 для регулярного выражения.

Основная причина, по которой нет способа проверить, является ли строка действительной как целое без преобразования, состоит в том, что на самом деле не так много убедительных сценариев использования для этого в местах, где важна производительность. В большинстве мест вы хотите знать, можно ли что-то анализировать как число, чтобы использовать его как число, а в редких случаях, возможно, дополнительные пары не имеют значения.

...