Реализация Ruby is_numeric? для Строк нуждайтесь в лучших альтернативах

10
задан Andrew Grimm 28 April 2011 в 03:18
поделиться

6 ответов

Убедитесь, что вы используете \ A и \ Z , а не ^ и $ , чтобы сопоставить всю строку, а не только одну строку в строке. Если вы хотите избежать сопоставления строки с завершающим символом новой строки, используйте в конце '\ z'. Для получения дополнительных сведений см. Учебное пособие по регулярным выражениям для якорей .

Например, / ^ [0-9] + $ / успешно соответствует следующему:

foo
1234
bar

но ] / \ A [0-9] + \ Z / - нет.

10
ответ дан 3 December 2019 в 17:59
поделиться

Первый вариант кажется мне нормальным.

Я бы назвал метод числовым? . Я не большой поклонник методов is_foo? . Они имеют смысл на языках, в которых нет вопросительных знаков в именах методов ( is_foo , isFoo ), но с вопросительным знаком is кажется излишним.

5
ответ дан 3 December 2019 в 17:59
поделиться

Я не уверен на 100%, но похоже, что Rails использует / \ A [+ -]? \ D + \ Z / для целых чисел.
Нажмите на источник для validates_numericality_of здесь

3
ответ дан 3 December 2019 в 17:59
поделиться

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

Также проверьте метод String # to_i - возможно, он делает то, что вы хотите:
http://www.ruby-doc.org/core/classes/String.html#M000787

1
ответ дан 3 December 2019 в 17:59
поделиться

Не знаю, быстро ли это, но мне нравится:

class String
 def numeric?
    true if Integer(object) rescue false
 end
end

Обрабатывает отрицательные числа тоже. А если вы когда-нибудь захотите поддерживать поплавки в будущем, просто используйте Float ()

1
ответ дан 3 December 2019 в 17:59
поделиться

Согласно простому тесту, второй подход быстрее, хотя я не являюсь экспертом в тестировании, поэтому этот тест может быть неверным: http://pastie.org/586777

Логика Залуса верна. Необходимо только один раз проверить недопустимую строку.

0
ответ дан 3 December 2019 в 17:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: