2014-09-19 1 views
3

기본적으로 사용자에게 숫자 입력 만 허용해야하는 입력 가능성이 있습니다. 그렇지 않으면 사용자가 입력 내용이 잘못되었다는 경고를 받게됩니다.스몰 토크 : 문자열에 숫자 만 들어있는 지 확인하는 방법은 무엇입니까?

콜백을 사용하여 입력을 읽을 때 입력이 문자열로 간주됩니다. 이제 문자열 (숫자를 포함해야 함)이 실제로 숫자 만 포함하는지 확인하고 싶지만 이미 구현 된 솔루션을 찾지 못했습니다. 내가

theString isInteger 

문자열

theString asNumber 

에 대한 사실 결코 -is없는 시도 -이 편지를 무시하지만 나는 문자 거세한 숫양 명확한 출력

theString isNumber 
를 문자열에 포함되지 않았거나 갖고 싶어

- 항상 거짓

답변

3

정규식을 사용하여 문자열 c ontains 숫자 만 :

theString matchesRegex: '\d+' 

또는 더 복잡한 정규 표현식은 또한 선택적 부호와 소수점 수 있도록 : 가족 이죠 및 Pharo에서

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

을, 당신은 정확하게 당신이 원하는 않는 메시지 #isAllDigits이 :

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

'# isAllDigits' 아마 더 빨리 정규식을 사용하는 것보다. 다른 한편으로는 정규식을 먼저 초기화해야하고 정규식 검사는 많은 코드를 거쳐야합니다. –

1

불행하게도, 나는 메시지 '를 isAllDigits'를 찾을 수 없습니다 또는 Cincom Smalltalk에 'matchesRegex'. 그러나 문자열에서 단어를 추출하고 asNumber을 사용하여 숫자로 변환 할 수 있습니다. 반환 값이 0(zero)이면 number이 실제로 0 (추가 조건으로 확인할 수 있음)이거나 stringdigit/number이 포함되지 않았 음을 의미합니다.

1

이 많은 Smalltalks 방언으로 작동합니다 : 몇 메시지 중 일부는 컴파일러에 의해 인라인 될 수 있으며, 관련 전송이 있기 때문에

(aString detect: [:c| c isDigit not ]) isNil ifTrue: [ "it's a number" ].