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

解決


Mt.Fuji  2006-11-29 12:40:26  No: 63744

はじめまして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 12:49:33  No: 63745

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


モーヲタ  2006-11-29 14:44:38  No: 63746

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 14:57:28  No: 63747

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


Blue  2006-11-29 16:10:49  No: 63748

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

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

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

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


επιστημη  2006-11-29 20:34:09  No: 63749

>>- 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-30 02:21:41  No: 63750

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

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

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

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


Blue  2006-11-30 02:29:30  No: 63751

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


Mt.Fuji  2006-12-01 20:56:53  No: 63752

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

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


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

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






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