メインメニュー
検索
ログイン
ユーザ名:

パスワード:


パスワードを忘れた

新規登録
Squeak関連書籍
Smalltalk関連書籍
メイン
   Squeakプログラミング
     文字列の数値判断について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
saiki
投稿日時: 2007-5-18 16:34
新米
登録日: 2007-4-6
居住地:
投稿: 15
文字列の数値判断について
教えてください

入力された文字列に対して、数値判断を行いたいのですが
簡単な方法がわかりません

現状は以下のとおりです

半角入力の場合
***************

num001 := 0 asNumber.
ans3 := 0.
ans22 := 0.
targetString := '0.123456789'.
ans4 := ( ans asString size) asNumber.
ans4 timesRepeat: [
ans6 := ReadStream on: ans asString.
ans6 position: num001.
ans5 := ( ans6 next: 1 ) asString.
ans2 := targetString findString: ans5 startingAt: 1.
( ans2 = 2) ifTrue: [ ans22 := ans22 + 1 ].
( ans2 > 0 ) ifFalse: [ ans3 := 'NG4' ].
( ans22 > 1 ) ifTrue: [ ans3 := 'NG5' ].
num001 := num001 + 1. ].

( ans3 = 0 ) ifTrue: [ 数値であると判断して処理を行う
......

***************

asNumberを使用した場合は
'r4' asNumber でエラーが発生してしまいます
エラーを発生させない判断方法があれば教えてください

以上 よろしくお願いします

abee
投稿日時: 2007-5-19 8:08
半人前
登録日: 2004-11-21
居住地:
投稿: 28
Re: 文字列の数値判断について
たとえば、

(ans3 isKindOf: Number) ifTrue: [...]

のようにする手がありますが、そもそもans3がエラーコードだったり、データだったりする設計に問題があるように思います。

また、全体に無駄なキャスト(asString, asNumber)が多く、ReadStreamの使い方もちょっとおかしいように思います。ReadStreamもオブジェクトですから、通常はサイズを別の変数に取ってtimesRepeat:で回す必要はありません。

stream := ReadStream on: 'abc'.
[stream atEnd] whileFalse: [foo := stream next. ...]

のように書くのが常套です。

あと、変数にans22のような意味を表していない名前をつけるのはあまりおすすめできません。
webmaster
投稿日時: 2007-5-19 14:13
管理人
登録日: 2004-11-16
居住地:
投稿: 85
Re: 文字列の数値判断について
abeeさんも書かれていますが、ちょっと推敲が必要だと思います

-変数の役割に応じて説明的な名前を付ける
 入力された文字列、エラーコード、文字列のインデックスなどが、どれもansXXなのは問題アリです
-処理の意図を明確にする
 どのようなケースを"NG"としたいのか?
-無駄な処理を行わない
 ループの外でできることは、ループの外で
 asNumber、asStringは必要なときにだけ


また、主なCollectionクラスの使い方を一通り確認されるのが良いと思います。
文字列の取扱いがかなり楽になりますよ。


以下はサンプルコードです。ご参考まで。
'12345' isAllDigits.
'0.987' isAllDigits.
'-123' isAllDigits.
'123abc' isAllDigits.


sampleStr := '-123abc'.
sampleStr do: [:each | Transcript cr; show: each isDigit printString].

(1 to: sampleStr size) do: [:index |
    Transcript cr; show: (sampleStr at: index) printString].

allowedCharacters := '1234567890+-.'.
filtered := sampleStr select: [:each | allowedCharacters includes: each].
Transcript cr; show: ('pre: {1} , post: {2}' format: {sampleStr. filtered}).
saiki
投稿日時: 2007-5-19 16:02
新米
登録日: 2007-4-6
居住地:
投稿: 15
Re: 文字列の数値判断について
ありがとうございます

1)処理内容をもう一度整理したいと思います
2)整理した時点で、Collectionクラスを調べるようにしたいとおもいます


Squeakが、簡単に実行できて、簡単に修正できるので構造を十分に検討しないでデータ処理を追加し続けてしまいました
気をつけたいとおもいます

以上
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Google
新着リンク