• ベストアンサー

String型を3つで比較したい!

String型を3つで比較したい! Compare関数は2つしか比較出来ません。 3つだとSelect文を2重に書くしか方法はないのですか? 参考サイト: http://jeanne.wankuma.com/tips/vb.net/string/compare.html ちなみに、やりたいことは電卓で、.が複数回呼ばれたとき1つだけにしたいのです。 本当は、 If Stirng型今回 = Stirng型前回 = "." Else  処理したい内容 End If です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

#2の方が言っている通り連続して「.」が入力されない限りRepleseは意味がなくなります。 自分が回答した奴も同じです。 ではどうするのか。 一番いいのは「.」のキーボードクリックイベントで既に入力した値に「.」が存在するかを確認して存在すれば追記しないようにすればいいのです。 KeyDownとKeyPressイベントの処理を書いてあげる事で実行できます。 ※現在、開発環境が整っていないため正確なコードを書けません。 文字列検索は以下のコードです。 If (strTarget.IndexOf(".") >= 0) Then '文字列内に存在する Else '文字列内に存在しない End If strTargetは検索対象となる文字列です。 KeyDown内で判定してメンバ変数(Boolean)のフラグを立てます。 KeyPrassでフラグが立っていたら、Key入力を無効にしてあげれば実装可能です。 ※KeyDown時でないと判定できない気がしたのですが、KeyPrassだけで実装できるようであればKeyPrassだけで問題ありません。

rescue99
質問者

お礼

ありがとうございます。 KeyDownとKeyPressイベント処理ですが、計算機プログラムが、すべてボタンを押していくタイプなので、 キーボードは使わないです。 ボタンクリックイベントで、文字列プロパティを取得すると値は取得できますが、 既に入力した値に●があるか確認するところがわかりません。 これだと文字列検索と一緒のような気がします・・・ Input = Replace(Input + Data, "..", ".") TextBox1.Text = Input ↓ Input = Input + Data If (Input.IndexOf(".") >= 0) Then   'なにもしない Else TextBox1.Text = Input End If If文って嫌い・・・なんかださくなる気がするのは私だけでしょうか。

rescue99
質問者

補足

間違ってました。 ×誤り Input = Input + Data If (Input.IndexOf(".") >= 0) Then   'なにもしない Else TextBox1.Text = Input End If ○正しい If (Input.IndexOf(".") >= 0 And Data = ".") Then   'なにもしない Else   Input = Input + Data   TextBox1.Text = Input End If

その他の回答 (5)

  • gain5151
  • ベストアンサー率28% (2/7)
回答No.6

あ。書き方が悪かったですね。。すみません。 例えば、●を挿入するボタンの名前を btnPeriod としますと、それをクリックした時のイベントは以下のようになります。 Private sub btnPeriod_Click()   Dim lineStr as String = Me.valueLineText.Text   if lineStr.indexOf('.') > 0 Then     'それ以上何も処理しない   Else     '●がまだ含まれていなかったら、素直に入力文字列に●を添付する     lineStr = lineStr & "."     Me.ValueLineText.Text = lineStr 'いらないかも     Me.ValueLineText.refresh()   End Then End Sub ※最後に付け加えてね!っていう書き方が悪かったですね(^^;) ※ただ、lineStr が見ている参照先が Me.ValueLineText.Text の参照先になるので、これは不要かも・・・(動かしてないから分からないw)。  またぐちゃぐちゃなってきたので、まぁそこはおいといて。。。  言いたかったのはこんな感じです。 で、もし別途、メソッドにするならば、引数と返り値を作って上げてもよいかも。。 以下、参考までに Private Function setP(ByBal str as String) as String   if str.indexOf('.') > 0 Then     'それ以上何も処理しない   Else     '●がまだ含まれていなかったら、素直に入力文字列に●を添付する   str = str & "."        End Then   return str End Sub とか。。。

rescue99
質問者

お礼

ありがとうございました。 If (Input.IndexOf(".") >= 0 And Data = ".") Then   'なにもしない Else   Input = Input + Data   TextBox1.Text = Input End If にして対応しました。 あとBKとCEの機能を付けました。 BKは1つだけしか戻れないわ、CE押したあとに演算子押すとExceptionエラーが出るわ、 =で計算が完了して、=を押したら最後、再計算できないわ、、、 Windowsの標準電卓の方が質がいいという結果に終わりました。 たぶん、メモ帳を作っても同じ結果が待っているような感じですね。。。 1つ気づいたのは、人間ってどこまで馬鹿なんだろうって思いました。 小数点複数打つって、ないわぁ~~

  • gain5151
  • ベストアンサー率28% (2/7)
回答No.5

すみません、前のスレのものです。 ちょっと修正というか訂正。。。 誤)End Then 正)End If あと、更新した文字列は Me.valueLineText.Text = lineStr とかで返してあげてね! ※サンプルソース自体よりも、ソースの意図を重視されてください。

rescue99
質問者

お礼

ありがとうございます。 sub setPeriod()   Dim lineStr as String = Me.valueLineText.Text '既に入力済みの文字列を取得   if lineStr.indexOf('.') > 0 Then 'もし、既に●が文字列に含まれていたら     'それ以上何も処理しない   Else     '●がまだ含まれていなかったら、素直に入力文字列に●を添付する     lineStr = lineStr & "."   End If End Sub Me.valueLineText.Text = lineStr なんかおかしい。 じーーーー 4●以降処理されない・・・ ピリオドだけのためのメソッドに飛ばすということか・・・ 変数を作りたくない&If文が嫌いな私はおかしいですか? KeyDownイベントハンドラもきらいだ・・・ コードを分離して書いてないからかな???Form1のタグ?クラスに全部書くからださく見えるのかな??? 44●以降も処理されないような。。。

  • gain5151
  • ベストアンサー率28% (2/7)
回答No.3

質問への直接的な回答ではないですが、私なら、 『あとで ● を1つだけにする』のではなく、 『前段で ● を1つ以上増えさせない方法』を検討するかと思います。 既にスレがありますが、 1●1●1●1 のようなとびとびな場合や、 2●●●●●●2●2 のような場合、或いはもっと変形的な入力をされることを考えると、●が増えた後に取り除くのはかなり力技が必要になると思います。 String.LastIndexOf をループでまわすとか。。。 ならば、電卓の●ボタンが押された際の実装として、私なら次の様なコードにする事を考えます。 ※実際に動かしていないので、適宜修正が必要かと思いますが、ここでは意図を汲み取って頂ければと思います。 '●ボタンが押されたときの実装 sub setPeriod()   Dim lineStr as String = Me.valueLineText.Text '既に入力済みの文字列を取得   if lineStr.indexOf('.') > 0 Then 'もし、既に●が文字列に含まれていたら     'それ以上何も処理しない   Else     '●がまだ含まれていなかったら、素直に入力文字列に●を添付する     lineStr = lineStr & "."   End Then End Sub このように、●を打った時点で、不要な●を増やさないような実装にしておけば、ユーザが寝ぼけて●を100回入力したとしても、はじめの1回の●のみを有効にすることができます。 でなければ、私なら入力済みの文字列を数値に変換できない時点で例外をスローさせるのが正しいのではないかと思います。。。 だって、 1●23●4 って入力された場合、そのユーザは ⇒123●4 と打ちたかったのか、それとも ⇒1●234 と打ちたかったのか、本人にしか分からないのですから。。

rescue99
質問者

お礼

ありがとうございます。 123●4 と打ちたかったのか、それとも1●234 と打ちたかったのか・・・ 人間が嫌いになりそうです!! ※Read Me 1●●23や12●●3等、小終点を二回連続で打つと自動で訂正されますが、 1●2●3●4というような小数点を複数にわけて入力する動作には対応していません。 これは仕様です。 ごめんなさい。グレてきました。。。 対応できるようにがんばります。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

4.4.4 などの入力に対しては無力ですよ ^^

rescue99
質問者

お礼

ありがとうございます。 朝起きて、ルンルン気分で、教えて!gooを見てみたら・・・ 4.4.4 って・・・ そんなアホな~~~~~~~~~ 4●4●4って打つ馬鹿まで、相手しないといけないのですか? あなどれませんね、人間って。。。

回答No.1

崩して考えてみて下さい。 ■IFのみで値1・値2・値3が全て同じか判定する。 値1:10 値2:10 値3:10 If (値1 = 値2 And 値1 = 値3) Then '値1と値2が同じで値1と値3が同じなので値1・値2・値3は全て同じ End If 判定文にはAnd条件とOr条件を書くことが出来ます。 >If Stirng型今回 = Stirng型前回 = "." >Else > 処理したい内容 >End If やるのであれば If (Stirng型今回 <> "." And Stirng型前回 <> ".") Then 処理したい内容 End If ※Stirng型今回 = "." And Stirng型前回 = "."の結果が真となる処理を必要としない場合

rescue99
質問者

お礼

ありがとうございます。 ..を.にしたいということで質問しました。 しかし、結果的にはIf文ではなく、Replaceを使うことに決めました。 >If (値1 = 値2 And 値1 = 値3) Then And を使うのですね。 サンプルは全部2個の比較だったので、初めて知りました。 小数点(.)は見にくいので、ここでは●とします。 今回●ボタンを押すと、絶対●のままです。 前回のは4●4にしようとしたら前回のデータは4●が入っています。 4444●かも444●かも知れません。 この3つの比較では●●を●にすることは出来ませんでした。 そこで、保存 = Replace(前回 + 今回, "●●", "●")にすることで成功しました!! しかも、綺麗です!!コードが!! Input = Replace(Input + Data, "..", ".") TextBox1.Text = Input で出来ました。

rescue99
質問者

補足

今日は大変ありがとうございました。 0除算は出来ませんでしたが、小数点を1つに抑えることが出来るようになり大変満足してます。 あと少数点が2個、3個打てることに気づいたのは、例外処理を学んだお陰だと思っています。