重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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


Compare関数は2つしか比較出来ません。
3つだとSelect文を2重に書くしか方法はないのですか?

参考サイト:
http://jeanne.wankuma.com/tips/vb.net/string/com …


ちなみに、やりたいことは電卓で、.が複数回呼ばれたとき1つだけにしたいのです。

本当は、

If Stirng型今回 = Stirng型前回 = "."
Else
 処理したい内容
End If

です。

A 回答 (6件)

#2の方が言っている通り連続して「.」が入力されない限りRepleseは意味がなくなります。


自分が回答した奴も同じです。

ではどうするのか。
一番いいのは「.」のキーボードクリックイベントで既に入力した値に「.」が存在するかを確認して存在すれば追記しないようにすればいいのです。

KeyDownとKeyPressイベントの処理を書いてあげる事で実行できます。
※現在、開発環境が整っていないため正確なコードを書けません。

文字列検索は以下のコードです。

If (strTarget.IndexOf(".") >= 0) Then
'文字列内に存在する
Else
'文字列内に存在しない
End If

strTargetは検索対象となる文字列です。
KeyDown内で判定してメンバ変数(Boolean)のフラグを立てます。

KeyPrassでフラグが立っていたら、Key入力を無効にしてあげれば実装可能です。
※KeyDown時でないと判定できない気がしたのですが、KeyPrassだけで実装できるようであればKeyPrassだけで問題ありません。

この回答への補足

間違ってました。

×誤り
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

補足日時:2009/07/18 15:26
    • good
    • 0
この回答へのお礼

ありがとうございます。

KeyDownとKeyPressイベント処理ですが、計算機プログラムが、すべてボタンを押していくタイプなので、
キーボードは使わないです。


ボタンクリックイベントで、文字列プロパティを取得すると値は取得できますが、
既に入力した値に●があるか確認するところがわかりません。
これだと文字列検索と一緒のような気がします・・・


Input = Replace(Input + Data, "..", ".")
TextBox1.Text = Input



Input = Input + Data
If (Input.IndexOf(".") >= 0) Then
  'なにもしない
Else
TextBox1.Text = Input
End If

If文って嫌い・・・なんかださくなる気がするのは私だけでしょうか。

お礼日時:2009/07/18 15:14

あ。

書き方が悪かったですね。。すみません。

例えば、●を挿入するボタンの名前を 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

とか。。。
    • good
    • 0
この回答へのお礼

ありがとうございました。

If (Input.IndexOf(".") >= 0 And Data = ".") Then
  'なにもしない
Else
  Input = Input + Data
  TextBox1.Text = Input
End If

にして対応しました。

あとBKとCEの機能を付けました。

BKは1つだけしか戻れないわ、CE押したあとに演算子押すとExceptionエラーが出るわ、
=で計算が完了して、=を押したら最後、再計算できないわ、、、

Windowsの標準電卓の方が質がいいという結果に終わりました。

たぶん、メモ帳を作っても同じ結果が待っているような感じですね。。。

1つ気づいたのは、人間ってどこまで馬鹿なんだろうって思いました。
小数点複数打つって、ないわぁ~~

お礼日時:2009/07/19 17:42

すみません、前のスレのものです。


ちょっと修正というか訂正。。。

誤)End Then
正)End If

あと、更新した文字列は
Me.valueLineText.Text = lineStr
とかで返してあげてね!
※サンプルソース自体よりも、ソースの意図を重視されてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。

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●以降も処理されないような。。。

お礼日時:2009/07/18 15:34

質問への直接的な回答ではないですが、私なら、


『あとで ● を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 と打ちたかったのか、本人にしか分からないのですから。。
    • good
    • 0
この回答へのお礼

ありがとうございます。

123●4 と打ちたかったのか、それとも1●234 と打ちたかったのか・・・

人間が嫌いになりそうです!!


※Read Me
1●●23や12●●3等、小終点を二回連続で打つと自動で訂正されますが、

1●2●3●4というような小数点を複数にわけて入力する動作には対応していません。

これは仕様です。

ごめんなさい。グレてきました。。。

対応できるようにがんばります。

お礼日時:2009/07/18 14:24

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

    • good
    • 0
この回答へのお礼

ありがとうございます。

朝起きて、ルンルン気分で、教えて!gooを見てみたら・・・

4.4.4 って・・・

そんなアホな~~~~~~~~~



4●4●4って打つ馬鹿まで、相手しないといけないのですか?

あなどれませんね、人間って。。。

お礼日時:2009/07/18 14:08

崩して考えてみて下さい。



■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型前回 = "."の結果が真となる処理を必要としない場合

この回答への補足

今日は大変ありがとうございました。
0除算は出来ませんでしたが、小数点を1つに抑えることが出来るようになり大変満足してます。

あと少数点が2個、3個打てることに気づいたのは、例外処理を学んだお陰だと思っています。

補足日時:2009/07/17 19:09
    • good
    • 0
この回答へのお礼

ありがとうございます。

..を.にしたいということで質問しました。
しかし、結果的には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

で出来ました。

お礼日時:2009/07/17 19:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!