textBox(Multiline)の文字列を配列処理するには?

解決


Mt.Fuji  2006-11-29 03:40:26  No: 63744  IP: 192.*.*.*

はじめましてVC++の初心者です。
String型で表示されるtextBoxの文字配列をdouble型の変数にし、この変数に計算処理をしようとしています。

for(int i=0; i<textBox1->Lines->Length; i++){

        double a=Convert::ToDouble(textBox1->Lines[i]);
        double b=0.5*a;
        c =Convert::ToString(b);
        textBox2->Text=c;}

上記ではaaが一つの値しか持たず、textBox2にはtextBox1のi番目の数(最後の数)の0.5倍しか表記されません。
String型の文字配列をdouble型の配列へ変更し、0〜iまで一括計算しString型へ戻したいです。

書籍やWebで探してみましたが力不足で解決策が見つかりませんでした。ご教授よろしくお願いします。

編集 削除
Mt.Fuji  2006-11-29 03:49:33  No: 63745  IP: 192.*.*.*

↑aaではなくaでした;;
VC++2005  WFAで作っています。
拙い文章で申し訳ないです(><。)

編集 削除
モーヲタ  2006-11-29 05:44:38  No: 63746  IP: 192.*.*.*

TextBoxのMultiLineをtextBox1->Lines->Lengthで取得できるんですね。
今までMultiLineを使ってLine毎取得する事がなかったんで勉強に
なりました(^^;;;

で、本題ですが、
>textBox2にはtextBox1のi番目の数(最後の数)の0.5倍しか表記されません。
はその通りです。コード見る限りtextBox2->Text=c;としてますので
最後の値しか反映されないでしょう。

>0〜iまで一括計算しString型へ・・・
こんな感じ?(結果がどのようになるのか分からないので勝手な想像で
書いてます。)

※尚、コンパイル、動作確認はしてない(レス時に直接書いてるので)ので
  意図しない動作になるかもしれません。あくまで参考程度に。

double    dblValue = (double)0.0;
String    ^strMoji = "";

for ( int i = 0; i < textBox1->Lines->Length; i++ ) {
    try {
        dblValue  = Convert::ToDouble(textBox1->Lines[i]->ToString()) * (double)0.5;
        strMoji = String::Concat(strMoji, Convert::ToString(dblValue));
        if ( i < textBox1->Lines->Length - 1 ) 
            strMoji = String::Concat(strMoji, "\r\n");
    } catch( System::Exception ^ex ) {
        //エラー時どうする?(変換不可な文字があったりとか?)
    }
}

textBox2->Text = strMoji;

#数値変換はInt::Phaseでもできたような・・・イイか(^^;;;

編集 削除
επιστημη  2006-11-29 05:57:28  No: 63747  IP: 192.*.*.*

- WFAってなんですか?
- for-loop中、毎回 textBox2->Text = c しているのだから最後の値しか残らないのはアタリマエ。
- Convert::ToDouble()で変換できない文字が入っていたときのコトが考慮されていない。

編集 削除
Blue  2006-11-29 07:10:49  No: 63748  IP: 192.*.*.*

>- WFAってなんですか?
Windows フォーム アプリケーション 

だったりして。
まぁ、こんな略し方しませんけど。

それと、本当にdouble型でいいのかな。
場合によっては、System::Decimalも考えていたほうがよさそう。

>Convert::ToDouble
dobule::TryParseってのもあります。

編集 削除
επιστημη  2006-11-29 11:34:09  No: 63749  IP: 192.*.*.*

>>- WFAってなんですか?
> Windows フォーム アプリケーション 
> だったりして。

あー…

↓変換できない行は"?"に置き換えてみた。

  void 変換汁(System::Object^  sender, System::EventArgs^  e) {
    System::Collections::Generic::List<System::String^> results;
    for each ( System::String^ line in textBox1->Lines ) {
      double value;
      results.Add(double::TryParse(line, value) ? (value*0.5).ToString() : "?");
    }
    textBox2->Lines = results.ToArray();          
  }

編集 削除
Mt.Fuji  2006-11-29 17:21:41  No: 63750  IP: 192.*.*.*

>>皆様へ
勝手に言葉を作ってたみたいです、ごめんなさい…。
WFAはWindows  フォーム  アプリケーションのことですm(T0T)m
また数字だけを読み込むので読み込みでエラーは起らないはずです(^^)♪
たくさんのことを考慮してくださって感激ですッ!!
Parse  TryParse  Convertを使い変換することは自分で調べて勉強してました。丁寧に教えてくださってほんとにありがとうございます。考えているような処理ができました♪♪

>モーヲタ様
正常に意図している動作をしました♪ありがとうございます!
Lines[i]をToStringで読み取るんですね…ほんとに目から鱗です♪
ありがとうございます!このような返答がすぐに思いつくのはすごいです!!

>Blue様
ご指摘ありがとうございます!恥ずかしいかぎりです。
System::Decimalは符号や浮動小数点値を考慮するときに使う??
とりあえず今回はdoubleでいきます!まだまだ勉強不足ですね…;;

>επιστημη様
確かに今考えてみると最後の値しかでないのは当たり前ですね(^^;;
私が初心者なのも原因ですが非常に勉強になります。
ほんとうにありがとうございます!試してみたんですがかなり早いですね。
一つ一つ調べて自分のものにしますッ♪

編集 削除
Blue  2006-11-29 17:29:30  No: 63751  IP: 192.*.*.*

> System::Decimalは符号や浮動小数点値を考慮するときに使う??
double型は浮動小数点型ということで、誤差が発生してしまいます。
ですので10進型であるDecimalを使えば誤差なく計算できるかなと。
(範囲が狭いですけど)

編集 削除
Mt.Fuji  2006-12-01 11:56:53  No: 63752  IP: 192.*.*.*

今のところ誤差が問題…ってことはないです。
これから必要になるかもなんで助かります♪

もっとたくさん勉強して質問に答えられる人を目指しますッ!!!
ありがとうございます!

編集 削除