Убедитесь, что вы используете \ A
и \ Z
, а не ^
и $
, чтобы сопоставить всю строку, а не только одну строку в строке. Если вы хотите избежать сопоставления строки с завершающим символом новой строки, используйте в конце '\ z'. Для получения дополнительных сведений см. Учебное пособие по регулярным выражениям для якорей .
Например, / ^ [0-9] + $ /
успешно соответствует следующему:
foo
1234
bar
но ] / \ A [0-9] + \ Z /
- нет.
Первый вариант кажется мне нормальным.
Я бы назвал метод числовым?
. Я не большой поклонник методов is_foo?
. Они имеют смысл на языках, в которых нет вопросительных знаков в именах методов ( is_foo
, isFoo
), но с вопросительным знаком is
кажется излишним.
Я не уверен на 100%, но похоже, что Rails использует / \ A [+ -]? \ D + \ Z /
для целых чисел.
Нажмите на источник для validates_numericality_of
здесь
Второй будет быстрее завершаться в случае нечисловой строки, так как он будет отклонен на первом неверном символе.
Также проверьте метод String # to_i - возможно, он делает то, что вы хотите:
http://www.ruby-doc.org/core/classes/String.html#M000787
Не знаю, быстро ли это, но мне нравится:
class String
def numeric?
true if Integer(object) rescue false
end
end
Обрабатывает отрицательные числа тоже. А если вы когда-нибудь захотите поддерживать поплавки в будущем, просто используйте Float ()
Согласно простому тесту, второй подход быстрее, хотя я не являюсь экспертом в тестировании, поэтому этот тест может быть неверным: http://pastie.org/586777
Логика Залуса верна. Необходимо только один раз проверить недопустимую строку.