2010-12-27 3 views

ответ

2

Например, используя re модуль:

1> re:run("1234a56", "^[0-9]*$"). 
nomatch 
2> re:run("123456", "^[0-9]*$"). 
{match,[{0,6}]} 

Или, используя список понимание:

[Char || Char <- String, Char < $0 orelse Char > $9] == []. 

Обратите внимание, что оба решения будут рассматривать пустой список допустимых входных.

3

Использовать regular expression.

+0

re: match (S, "[0-9]) как это? – Bertaud

+0

Я не тестировал его, но я предполагаю, что использование регулярного выражения будет медленнее, чем использование list_to_integer/1. – Tim

+0

Я бы предпочел не есть логика, которая зависит от того, чтобы выбрасывать исключение. Звучит как микро-оптимизация для меня. – duffymo

4

Один из способов - преобразовать его в целое число, и если это не удастся, вы узнаете, что это не целое число.

is_integer(S) -> 
    try 
     _ = list_to_integer(S), 
     true 
    catch error:badarg -> 
     false 
    end. 

Или вы можете просто проверить все цифры, но вы должны проверить края случае пустого списка:

is_integer("") -> 
    false; 
is_integer(S) -> 
    lists:all(fun (D) -> D >= $0 andalso D =< $9 end, S). 
+0

кажется сложным ... – Bertaud

+0

Что это будет делать для ввода «9999999999999999999999999999»? –

+0

Для ввода «999999999999999999999999999999» первое решение создало бы большую –

1
not lists:any(fun(C)->C < $0 or C > $9 end, YourString). 

В производстве, хотя, я бы согласился с list_to_integer, так как он, вероятно, лучше оптимизирован. Я не уверен, существуют ли разные характеристики обхода «любой» и «все» - вы можете реализовать каждый из них в терминах другого, но они, вероятно, оба реализованы в C.

+0

Я собираюсь идти вперед и вниз для себя написания «не перечисляет никакой забавы» о функциональном языке: D –

Смежные вопросы