本当に初歩的なのですが(1+2=12)

タグの編集
投稿者 七氏  (学生) 投稿日時 2009/8/25 08:22:03
初歩的な質問で申し訳ありません。
TextBox1とTextBox2があり、TextBox1に1を入れてTextBox2に2を入れます。
その後、ボタンをクリックしてTextBox1+TextBox2をTextBox1に書き込みます。
するとTextBox1には12と出てしまうのですが、これを3にするにはどうしたらいいのでしょうか?

TextBox1.Text = TextBox1.Text + TextBox2.Text

と処理しています。
原因はTextBoxがStringだからなのでしょうか?
回答いただけると助かります。よろしくお願いします。
投稿者 (削除されました)  () 投稿日時 2009/8/25 08:46:53
(削除されました)
投稿者 (削除されました)  () 投稿日時 2009/8/25 08:50:15
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/8/25 09:01:12
まず、「数値 + 数値」が「数値」なのは当然ですね。
問題は、文字列が混じった場合かと思います。

VB の場合、「文字列 + 文字列」は「文字列」となります。
そのため、"1" + "2" は、"12" となります。

一方、「文字列 + 数値」や「数値 + 文字列」の場合には数値演算となります。
(数値に変換できない文字が含まれているとエラーとなります) 


> これを3にするにはどうしたらいいのでしょうか?
入力された値を『数値』にすれば良いことになります。

VB.NET であれば、TextBox の代わりに NumericUpDown を使う事ができます。
Text プロパティの代わりに、Value プロパティを使うことで、数値を得ることができます。

NumericUpDown3.Value = NumericUpDown1.Value + NumericUpDown2.Value


あるいは、CInt や CDec 関数などを用いて、文字列を数値に変換するという手もあります。
もし、数値以外の入力がありえる場合には、Decimal.TryParse メソッド等を用いると良いでしょう。
投稿者 七氏  (学生) 投稿日時 2009/8/25 09:09:11
>>魔界の仮面弁士さん
使っているのはVB2008でした。記述せずに質問してしまい申し訳ありません。
「文字列 + 数値」や「数値 + 文字列」の場合に計算できるということで、数値として処理するために
Val(TextBox1.Text)というように表記したところ、うまく計算することができました。

このような質問にお答えいただき、本当にありがとうございました。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/8/25 09:14:42
データ型はとても重要です。
今回のような問題を避けるため、+ 演算子による加算処理を行う際には、
その対象となるデータが、共に数値型である事を確認するよう心がけましょう。

特に、「数値 + 文字列」といった型の混在は避けるようにしてください。

また、文字列の連結として使う場合には、加算処理と区別するために
 TextBox3.Text = TextBox1.Text & TextBox2.Text
のように「& 演算子」を用いる事をお奨めします。



> 本当に初歩的なのですが

初歩といえば初歩なのですが、こうした型の違いは、初心者のうちは
意外と見落としやすいものかと思います。


また、上級者になればなるほど、型を意識したコーディングを心がけるため、
異なるデータ型同士の + 演算となると、上級者でも混乱してしまうようです。


以前、データ型混在の + 演算というネタで、下記のような VB クイズを
出題したことがあるのですが、ベテランの VB 開発者であっても、
これらを正しく即答できた人は意外と少なかったです。

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Q. 変数 A の値が 1530 となる物を全て挙げてください。

1: A = "15" + 15 + 15 
2: A = "15" + (15 + 15) 
3: A = "15" + "15" + "15" 
4: A = "15" + ("15" + 15) 
5: A = ("15" + "15") + 15 
6: A = "15" + (("15") + ("15"))

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Q. 変数 A, B は、いずれも 1530 という値になります。 
 では、各結果の型は、それぞれ何になるでしょうか。

A = "15" & "15" + 15
B = "15" + "15" + 15

TextBox1.Text = TypeName(A) 
TextBox2.Text = TypeName(B)


1: 整数型 
2: 長整数型 
3: 単精度浮動小数点数型 
4: 倍精度浮動小数点数型 
5: 文字列型 
6: その他
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
投稿者 (削除されました)  () 投稿日時 2009/8/25 22:18:20
(削除されました)
投稿者 トマト  (小学生) 投稿日時 2009/8/25 22:19:12
>TextBox1.Text = TextBox1.Text + TextBox2.Text
TextBox1.Text = TextBox1.Text + + TextBox2.Text にすると自動的にDoubleに変換されて計算できるみたいです。
投稿者 よねけん  (社会人) 投稿日時 2009/8/25 23:31:42
>>TextBox1.Text = TextBox1.Text + TextBox2.Text
>TextBox1.Text = TextBox1.Text + + TextBox2.Text にすると自動的にDoubleに変換されて計算できるみたいです。 

Option Strict Off(暗黙の型変換を許可)の設定の場合ですね。

1つ目の+はニ項演算子の+で、2つ目の+は単項演算子で、
以下のような意味として解釈されるからですね。
(TextBox1.Text="1"、TextBox2.Text="2"として説明)

"1" + + "2"
    ↓
"1" + (+ "2")
    ↓
"1" + (+2)
    ↓
"1" + 2
    ↓
1 + 2