• ベストアンサー

料金計算→3桁でカンマを入れたい

料金計算で合計の数字にカンマを入れたいと思います。何とか本を読み読みここまで来たのですが・・ on (press) { total = _root.pretotal.text; _root.pretotal.text = total.length; //文字数を取得 if (total.length>3) { _root.total.text = (total.substr(0, -3))+","+total.substr(-3); } } ↑これだと「3ケタ目にカンマを追加」だと思うので、12346,789となってしまいます。 どんどんカンマを追加するにはどうしたらういいのでしょうか。。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.2

次のように考えてはいかがでしょう。 1の位は、数値として数える時は最下位で、最初に着目する位なのですが、数字をひと続きの文字列として見た場合は最後の文字といえます。 for ループのループカウンタを工夫して、1の位、つまり最後の文字から順に1文字ずつ取り出し、作業用の変数にコピーします。 この時、ループカウンタとは別に、コピーした字数のカウントを別に取ります。 このカウンタを if 文で見て、3文字ごとに” , ”を挿入しながら、元の数字をコピーしていきます。 出来上がった文字列は、1の位が左に来ている、つまり数値の並び方が反転している状態になります。 例えば、元の数字が 1234567890 であれば、  098,765,432,1 このようになっています。 表示する時は、同様に for ループのカウンタを工夫して、出来上がった文字列を後ろから1文字ずつコピーし、順序を戻すという仕組みです。 例えば、オリジナルの金額が表示されているテキストフィールド”pre_total”と、カンマを入れた数字を表示するテキストフィールド”total”があるとします。 ボタンが押された時、pre_total に入力された数値に” , ”を入れ、total に表示するスクリプトは、大体、次のようになります。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)  on(press)  {   org = new String( _root.pre_total.text );   temp = new String( "" );   //3桁ごとに”,”を挿入   cnt = 0;   for( i = org.length - 1 ; i >= 0 ; i-- , cnt++ )   {    //文字列の後ろから1文字ずつコピー    temp += org.charAt( i );    //3文字コピーするごとに”,”を挿入    if( cnt % 3 == 2 )    {     temp += ",";    }   }   //tempを逆方向に並べ替えて表示   //先頭に”,”が来ている場合は、最後の1つ前の文字からコピー   if( temp.charAt( temp.length - 1 ) == "," )   {    start_index = temp.length - 2;   }   else   {    start_index = temp.length - 1;   }   //tempの最後から順に1文字ずつコピー   total.text = "";   for( i = start_index; i >= 0 ; i-- )   {    total.text += temp.charAt( i );   }  } 3文字ごとに” , ”を挿入する仕組みについてですが。 元の金額の文字列を、最後から1文字ずつ切り取っていく際、cnt という変数で、ループカウンタとは別にカウントを取っています。 1文字目の時0、2文字目で1、3文字目で2・・・と変わり、3文字目の次には更に” , ”を追加します。 つまり、cnt が 2、5、8・・・の時” , ”を挿入することであり、cnt を3で割った余りが2である時に” , ”を挿入するといえます。 剰余は % 演算子を使って求めることができます。 例えば、元の金額が  123456 このように桁数が3の倍数だった場合、temp 中身は  654,321, と、先頭に” , ”が付いてしまいます。 そこで、temp の並びを反転させて表示する時に、temp 最後の文字が” , ”だった時は最後の文字の手前から、それ以外は最後の文字からコピーするようにしています。 まあ・・・ちょっと力技ですけど(^^;)、よろしければご参考までに。

banshee90
質問者

お礼

ご回答ありがとうございます。 お返事が遅くなってしまい申し訳ありませんでした。 分りやすいご説明と頂いたソースで試した所、うまく行きました!! しっかりカンマ付けされています。 重ねて、ありがとうございました!

その他の回答 (1)

noname#35109
noname#35109
回答No.1

非常に原始的な方法ですが,良かったら参考にしてください。 変数「string」に入る数の桁を10桁までと仮定します。 それ以上になる場合は変更してください。 (「string」は「pretotal.text」の部分です。) on (press) { //フラグを立てて以下を10回繰り返す //変数「B1」~「B10」に「string」をバラして入れる A = "0"; while (Number(A)<=10) { A = Number(A)+1; set("B" add A, substring(string, A, 1)); } //もし10桁,7桁4桁目に何か入っていたら //C1~C3には "," を入れる if (Number(B10)<>Number("")) { C1 = ","; } if (Number(B7)<>Number("")) { C2 = ","; } if (Number(B4)<>Number("")) { C3 = ","; } //変数Dにはハイフン入りの数を入れる D = B10 add C1 add B9 add B8 add B7 add C2 add B6 add B5 add B4 add C3 add B3 add B2 add B1; } 以上をボタンのスクリプトとして書き込みます。

banshee90
質問者

お礼

ご回答ありがとうございます! バージョン等の記載がない、お返事が遅れたこと申し訳ございません。(あと度重なるタイムアウト) 遅れながらFLASH MX(6),WIN XPです。 上記を元にカスタマイズしたところ、スクリプトが原因でロードできない、 みたいな事を言われパブリッシュできませんでした・・・ でも、おっしゃりたい事は分りますし、ソースの短さも魅力的ですので、 引き続き試してみたいと思います!

関連するQ&A