2010-08-30 3 views
3

Je veux convertir la valeur d'entrée dans "Prompt invite: aStringPrompt" en une valeur entière, comment puis-je faire cela?string à integer dans smalltalk

+0

Après avoir posté ma réponse, je remarque qu'il s'agit probablement d'un doublon de http://stackoverflow.com/questions/2226029 –

+0

duplication possible de [String to Integer Smalltalk] (http://stackoverflow.com/questions/2226029/string-to-integer-smalltalk) – Mark

Répondre

5

Deux étapes: (a) valider l'entrée, et (b) convertir.

Vous pouvez valider comme suit: myString isAllDigits. La conversion est triviale: '1' asInteger. Dans Squeak, au moins, cela renvoie l'entier 1. 'g1' asInteger renvoie 1, tout comme 'g1' asInteger. g asInteger renvoie zéro.

Donc, en résumé:

"Given some input string s containing a decimal representation of a number, either return s in integer form, or raise an exception." 
s := self getUserInput. 
(s isAllDigits) ifFalse: [ Exception signal: '"', s, '" is not a (decimal) number' ]. 

^ s asInteger. 
+0

monsieur que diriez-vous de dauphin, je n'utilise pas grincer. pouvez-vous l'expliquer dans la syntaxe de dauphin? merci beaucoup – leroj

+0

aString asInteger devrait fonctionner dans tous les Smalltalks. La meilleure façon est d'expérimenter un peu et de regarder la bibliothèque de classe de votre dialecte Smalltalk pour trouver toutes les possibilités. –

+0

@Frank Shearar, merci pour le lien mais j'ai encore résolu mon problème. après que la boîte de dialogue d'entrée est apparue j'ai entré mon numéro mais il ne le change pas en asInteger ou en asNumber variable. mon problème est après que je déclare mon numéro aléatoire il ne le change pas ici est mon code s'il vous plaît commentez dessus si vous avez une idée sur comment le résoudre merci – leroj

1

Juste essayé cela dans Dolphin 6:

(Prompter prompt: 'Enter a number') asInteger 

Exécuter ce (placez le curseur sur le dessus dans un espace de travail et appuyez sur Ctrl-D), entrez 123 dans l'invite qui s'affiche, et vous verrez 123 affiché comme la sortie. Si vous supprimez l'invocation #asInteger, il affichera '123', indiquant qu'une chaîne a été renvoyée. En ce qui concerne votre 'ne comprend pas #nombre', cela signifie que quelque part dans le code, vous exécutez le message #number comme étant envoyé à un objet qui ne savait pas comment le gérer.

Pour le plaisir que je pris votre code et légèrement reformatée il:

| dir | 

[ dir isNil or: [ dir isEmpty ] ] whileTrue: 
    [ dir:= Prompter prompt: 'Enter your number' caption: 'Input the Number' ]. 

MessageBox notify: 'your inputed number is ', (dir) caption: 'Inputed'. 

et trouvé qu'il a couru très bien. Ensuite, je l'ai remarqué ne pas convertir la chaîne retourné à un numéro, donc je l'ai changé:

| dir | 

[ (dir isNil or: [ dir isEmpty ]) or: [ (dir select: [ :c | c isDigit not ]) size > 0 ] ] whileTrue: 
    [ dir:= Prompter prompt: 'Enter your number' caption: 'Input the Number' ]. 

MessageBox notify: 'your inputed number is ', (dir) caption: 'Inputed'. 

Cela a également couru bien, avec l'avantage supplémentaire qu'il n'acceptera des caractères non numériques.

Partagez et appréciez.