Скажем '123'
, у меня есть строка, и я хочу преобразовать ее в целое число 123
.
Я знаю , что вы можете просто сделать some_string.to_i
, но обращенные 'lolipops'
к 0
, который не является эффект , который я имею в виду. Я хочу, чтобы это взорвалось мне в лицо, когда я пытаюсь преобразовать что-то недействительное, с хорошим и болезненным Exception
. В противном случае, я не могу различить действительное 0
и то, что просто не является числом вообще.
РЕДАКТИРОВАТЬ: Я искал стандартный способ сделать это, без обмана регулярных выражений.
^
и$
имеют несколько иное значение как метачары, чем в большинстве других разновидностей регулярных выражений. Вы, вероятно, хотите использовать\A
и\Z
вместо.\z
вместо того, чтобы\Z
в качестве описания для якоря Z с заглавной буквы использовалось следующее: «Соответствует концу строки. Если строка заканчивается новой строкой, она совпадает непосредственно перед новой строкойТакже следует учитывать влияние, которое текущее принятое решение может оказать на синтаксический анализ шестнадцатеричных, восьмеричных и двоичных чисел:
В Ruby числа, которые начинаются с
0x
или0X
являются шестнадцатеричными,0b
или0B
двоичными, и просто0
восьмеричными. Если это нежелательное поведение, вы можете объединить его с некоторыми другими решениями, которые проверяют, соответствует ли строка шаблону. Как/\d+/
регулярные выражения и т. Д.источник
Еще одно неожиданное поведение с принятым решением (с 1.8, 1.9 в порядке):
так что если вы не уверены, что именно передается, обязательно добавьте
.to_s
.источник
Мне нравится ответ Мирона, но он страдает от болезни Руби "Я больше не использую Java / C #, поэтому я никогда не буду использовать наследование снова" . Открытие любого класса может быть чревато опасностью и должно использоваться с осторожностью, особенно когда оно входит в состав основной библиотеки Ruby. Я не говорю, никогда не используйте его, но обычно его легко избежать, и что есть лучшие варианты, например,
Затем, когда вы хотите использовать строку, которая может быть числом, становится ясно, что вы делаете, и вы не затираете какой-либо основной класс, например
В инициализацию можно добавлять всевозможные другие проверки, такие как проверка двоичных чисел и т. Д. Главное, однако, заключается в том, что Ruby предназначен для людей, а наличие для людей означает ясность . Присвоение имени объекта через его имя переменной и ее имя класса делает вещи гораздо яснее.
источник
Мне пришлось иметь дело с этим в моем последнем проекте, и моя реализация была похожей, но немного другой:
источник
Вероятно, не самый чистый способ сделать это, но должен работать.
источник
Re: Крис ответ
Ваша реализация позволяет вещам типа «1a» или «b2» до конца. Как насчет этого вместо этого:
Это выводит:
источник
\z
вместо того, чтобы\Z
в качестве описания для якоря Z с заглавной буквы использовалось следующее: «Соответствует концу строки. Если строка заканчивается новой строкой, она совпадает непосредственно перед новой строкой