2014-09-19 7 views
3

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

Ввод считается строкой, когда я прочитал ее с помощью обратного вызова. Теперь я хочу проверить, действительно ли строка (которая ДОЛЖНА содержать числа) ТОЛЬКО содержит числа, но я не нашел уже реализованного решения. я попытался

theString isInteger 

не -это никогда верно для строки

theString asNumber 

- игнорирует письма, но я хочу, чтобы иметь четкий выход кастрированный баран буквы включены в строку или не

theString isNumber 

- всегда false

ответ

3

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

theString matchesRegex: '\d+' 

или более сложное регулярное выражение также позволяет дополнительный знак и десятичную точку:

theString matchesRegex: '-?\\d+(\\.\\d+)?' 
9

В Squeak и Pharo, у вас есть сообщение #isAllDigits, что делает именно то, что вы хотите :

'1233248539487523' isAllDigits "--> true" 
+1

'# isAllDigits', вероятно, даже быстрее, чем при использовании регулярных выражений, потому что есть только несколько сообщений посылает участие, некоторые из которых могут быть встраиваемыми компилятором. С другой стороны, регулярное выражение должно быть инициализировано сначала, а регулярное выражение проверяется на большом количестве кода. –

1

К сожалению, я не смог найти Messages 'isAllDigits' или 'matchesRegex' на Cincom Smalltalk. Однако, что вы можете сделать, это извлечь слово из строки и преобразовать его в число, используя asNumber. Итак, если возвращаемое значение равно 0(zero), то это означает, что либо number на самом деле является 0 (что могло бы быть проверено с дополнительным условием), либо string не содержит digit/number.

1

Это должно работать со многими диалектами Smalltalks:

(aString detect: [:c| c isDigit not ]) isNil ifTrue: [ "it's a number" ]. 
Смежные вопросы