追加情報 : 入力文字列の形式が正しくありません。 と表示されてしまいます

解決


よし  2006-12-15 01:55:41  No: 63969

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に数値を入力し、それを利用して計算するプログラムなのですが・・・。
どなたかよろしくお願いします。


Blue  2006-12-15 02:13:34  No: 63970

Parseメソッドは失敗すると例外を投げます。
ですので、try〜catchして対処ください。

# 2005からはとっても便利な TryParse がありますけれど。


よし  2006-12-15 09:37:08  No: 63971

返信ありがとうございます。
Parse以外に入力したものを数値にして、計算させるようなものってないですか?
try catchでどんな文にするとうまく計算できますか?


Blue  2006-12-15 09:55:04  No: 63972

>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のほうが正確な計算を得ることができます。


よし  2006-12-15 10:27:17  No: 63973

textboxに1000や100.28などを入力してもエラーがでてしまうんですけど・・・、このような数値でもエラーは出てしまうものなんですか?


Blue  2006-12-15 17:38:46  No: 63974

> このような数値でもエラーは出てしまうものなんですか?
試してみては?

>double risk1 = Double::Parse(textRisk1->Text);

double risk1 = Double::Parse("1000");

これでエラーがでなければ、textRisk1->Textが十中八九間違っているんでしょう。
・前後に空白や改行がある
・全角文字を使っている
・1000% とか単位がついている
とか、原因を調べてみてください。
(調べるのはアナタです。方法はいくらでもあるでしょう。)


よし  2006-12-16 01:58:33  No: 63975

いろいろ試してみたところdouble risk1 = Double::Parse(textRisk1->Text);
ではなく
String *out = String::Format("銘柄:{0} 銘柄:{1] リスク:{2}",
 name1, name2, out2 );
がおかしかったみたいです。
どうおかしかったのかはあまり理解できてないのですが・・・。
Blueさん今回はいろいろ助けていただきありがとうございました。


Blue  2006-12-16 02:02:01  No: 63976

あーそっちだったのか。  orz

>どうおかしかったのかはあまり理解できてないのですが・・・。

>"銘柄:{0} 銘柄:{1] リスク:{2}"

の 2番目の {1} が ] になっているところでしょうね。
それで閉じ括弧の } までがフォーマットの指定形式になって

"1] リスク : {2"

ってのがコンパイラで解釈できなかったのでしょう。


よし  2006-12-16 08:17:50  No: 63977

あ〜、ほんとですねw
今言われるまで気づきませんでした。
一度書き直したときに正しく書き直したから問題なくなったんだと思います。
ほんとにお騒がせしました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加