public:
int risk;
private: System::Void buttonAdd_Click(System::Object * sender, System::EventArgs * e)
{
Debug::WriteLine("追加ボタンをクリックしました");
// 銘柄A、リスク、銘柄B、リスクを取得する
String *name1 = textName1->Text;
double risk1 = Double::Parse(textRisk1->Text);
String *name2 = textName2->Text;
double risk2 = Double::Parse(textRisk2->Text);
System::Double risk=risk1-risk2;
// フォーマット
String *out2 = risk.ToString();
String *out = String::Format("銘柄:{0} 銘柄:{1] リスク:{2}",
name1, name2, out2 );
Debug::WriteLine( out );
// リストに追加する
listRisk->Items->Add( out );
}
上記をビルドするとエラーはでないのですが、デバッグして動かすと
'System.FormatException' のハンドルされていない例外が mscorlib.dll で発生しました。
追加情報 : 入力文字列の形式が正しくありません。
と表示されてしまいます。
プログラムとしては2つのtextboxに数値を入力し、それを利用して計算するプログラムなのですが・・・。
どなたかよろしくお願いします。
Parseメソッドは失敗すると例外を投げます。
ですので、try〜catchして対処ください。
# 2005からはとっても便利な TryParse がありますけれど。
返信ありがとうございます。
Parse以外に入力したものを数値にして、計算させるようなものってないですか?
try catchでどんな文にするとうまく計算できますか?
>Parse以外に入力したものを数値にして
他にはConvertクラスのToDoubleでしょうか。(同じ結果になりますが。)
というか、数値に変換できない文字列があるときに、
>'System.FormatException'
が発生します。
このときどのように動作してほしいのでしょうか?
0にして進める?数字の部分だけを解釈させる?(1a2とか1,234.5とかはどうなるのか?)
>try catchでどんな文にするとうまく計算できますか?
System::Decimal d = 0;
try
{
d = System::Decimal::Parse("0.5");
}
catch (System::FormatException* ex)
{
System::Console::WriteLine(ex->Message);
}
System::Console::WriteLine("{0}", (d + 10).ToString());
エラーが発生したら、0として計算させるようにしています。
double型よりもDecimalのほうが正確な計算を得ることができます。
textboxに1000や100.28などを入力してもエラーがでてしまうんですけど・・・、このような数値でもエラーは出てしまうものなんですか?
> このような数値でもエラーは出てしまうものなんですか?
試してみては?
>double risk1 = Double::Parse(textRisk1->Text);
↓
double risk1 = Double::Parse("1000");
これでエラーがでなければ、textRisk1->Textが十中八九間違っているんでしょう。
・前後に空白や改行がある
・全角文字を使っている
・1000% とか単位がついている
とか、原因を調べてみてください。
(調べるのはアナタです。方法はいくらでもあるでしょう。)
いろいろ試してみたところdouble risk1 = Double::Parse(textRisk1->Text);
ではなく
String *out = String::Format("銘柄:{0} 銘柄:{1] リスク:{2}",
name1, name2, out2 );
がおかしかったみたいです。
どうおかしかったのかはあまり理解できてないのですが・・・。
Blueさん今回はいろいろ助けていただきありがとうございました。
あーそっちだったのか。 orz
>どうおかしかったのかはあまり理解できてないのですが・・・。
>"銘柄:{0} 銘柄:{1] リスク:{2}"
の 2番目の {1} が ] になっているところでしょうね。
それで閉じ括弧の } までがフォーマットの指定形式になって
"1] リスク : {2"
ってのがコンパイラで解釈できなかったのでしょう。
あ〜、ほんとですねw
今言われるまで気づきませんでした。
一度書き直したときに正しく書き直したから問題なくなったんだと思います。
ほんとにお騒がせしました。
ツイート | ![]() |