- ベストアンサー
複数のダイナミックテキストに1000桁ごとのカンマの打ち方
- 1000桁ごとのカンマの入れ方を教えていただき、上手くいったのですが、複数のテキストボックスにカンマを打ちたいと思い、Array を使ったのですがうまくいきません。
- 根本的に何かが違うのだと思いますが、何処が違うのか教えていただきたく投稿しました。
- 質問の詳細はスクリプトの記述です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
まず、配列の使い方ですが。 普通の変数で、 gonendrieki = 1234567890; このようにすると、gonendrieki の中には値は1つしか入れることができません。 配列変数も1つあたりの変数に1つの値しか入らない点は同じなのですが、同じ名前でいくつもの値を管理できる点が、普通の変数とは異なります。名前は同じで番号だけが違う、倉庫群や団地のようなものを想像していただくと分かりやすいかと思います。 例えば rieki = new Array( 111 , 222 , 333 ); とすると、 rieki[ 0 ] → 111 rieki[ 1 ] → 222 rieki[ 2 ] → 333 このように、rieki という名前に管理番号が付いた変数が3つできます。○○倉庫No.××や□□団地△号棟といった管理の仕方と、ちょっと似ています。 それぞれの変数の管理番号(インデックス)である [ ] の中の番号は、変数で指定することもできます。 配列内に変数がいくつあるかは、この配列の管理人である rieki という Array クラスのオブジェクトが知っていて、rieki.length とすると知ることができます。 これらを合わせて for( i = 0 ; i < rieki.length ; i++ ) { trace( rieki[ i ] ); } として、配列の数だけ何かの処理をさせることもできます。 配列のインデックスは0から始まることにも注意しましょう。 上記の場合、length(配列の長さ)は、変数が3つあるので3ですが、インデックスは0から始まっているため、変数は rieki[ 0 ] から rieki[ 2 ] までしかありません。 ちなみに、配列のインデックスの数だけ何かをさせる別の表現として、for...in という制御文もあります。詳しくはヘルプ等をご参照ください。 ------------------------------------------- カンマを入れる方法につきましては、前回 http://okweb.jp/kotaeru.php3?q=1356984 でご紹介した通りです。 今回は、数値と表示するテキストフィールド名が変わるだけで、処理は全く同じですので、カンマを入れる処理を関数にし、数値とテキストフィールドのインスタンス名を配列変数に入れて、for ループを使って処理する方法はいかがでしょう。 変数やテキストフィールドの名前を通し番号で付けると、配列で値や名前を管理しなくても何とかなりますが、計算の時に分かりにくいかと思いますので、今回は配列を使った例をご紹介します。 関数は、変化する部分だけを引数として受け取れるようにします。 今回は変数名とテキストフィールドのインスタンス名ですから、この2つを引数で受け取る設計にします。 関数は1度定義すれば充分ですので、フレームアクションとして記述します。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください) //3桁ごとにカンマを入れる関数 //引数 // rieki : 元の数字 // field_name : テキストフィールドインスタンスへの参照 function Figures( rieki , field_name ) { var org , temp , i; //作業用変数の初期化 org = new String( String( rieki ) ); 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文字ずつコピー field_name.text = ""; for( i = start_index; i >= 0 ; i-- ) { field_name.text += temp.charAt( i ); } } 前回との相違点は、String オブジェクトの org で加工する元となる数値と、加工後の文字列を表示するテキストフィールドのインスタンス名が、引数で渡されてくる点だけです。 データには数値や文字列など、様々な型があります。 例えば 123456 とあった場合、これを数値として読むか文字列として読むかで、できることが変わってきます。 数値であれば計算はできますが、文字列のように「○番目の桁を取り出す」といったことは簡単にはできません。データの型の違いは、このような時に問題になります。 この関数では、第1引数 rieki は数値( Number 型)、第2引数は TextField 型となります。 Flash MX 2004 からは、データの型を明示できるようになりました。 MX 2004 をお使いであれば、関数の最初の部分を function Figures( rieki:Number , field_name:TextField ) としておくと、引数の型が分かりやすくなります。 ただし、String クラスである org を初期化する値は、文字列でなければならない決まりがあります。 しかし、今回は(本当は前回もそうだったのですが)引数の rieki は数値になっているため、そのまま org の初期値として使おうとすると、パブリッシュの時にエラーになります。 そこで今回は、String という関数を使って、rieki の値を数値から文字列として見るように変換しています。 ちょっと面倒な話になりますけれど、スクリプトとしてはより安全になります。 関数ができたら、あとは、加工したい数値と、加工後の数値を表示したいテキストフィールド名を配列に入れ、ループを使って先の関数を繰り返し呼び出します。 ボタンのスクリプトは、次のようになります。 on(press) { var i , value_tbl , field_tbl; /*ここに計算式を書く*/ //加工する数値と表示用テキストフィールド名を保持する配列の定義 value_tbl = new Array( ninendrieki , sannendrieki , yonendrieki , gonendrieki ); field_tbl = new Array( ninendriekiQ , sannendriekiQ , yonendriekiQ , gonendriekiQ ); //カンマを入れて、それぞれのテキストフィールドに表示 for( i = 0 ; i < value_tbl.length ; i++ ) { Figures( value_tbl[ i ] , field_tbl[ i ] ); } } 配列変数 value_tbl に入っているのは5つ分の変数の値であり、計算に使ったのですからデータの型は数値( Number 型)になります。 計算の結果を入れますので、配列に入れる処理は必ず計算の後に実行してください。 前回も問題になりましたが、変数やテキストフィールドの名前・階層の間違いにはご注意ください。 なお、上記のスクリプトでは、計算の結果とテキストフィールドの名前が数値および参照として配列に入っていますが、名前を文字列として管理し、関数の方で文字列を元に変数やテキストフィールドの参照に変換して操作するといった方法もあります。 この話は長くなりますので、またの機会に。
お礼
どうも有難う御座いました。成功しました。 まだまだ勉強不足で、内容を全て把握できませんが、これからDPEさんの説明文とスクリプトの本を見ながら理解していこうと思います。 本当に丁寧に教えていただきどうも有難う御座いました。 自分も早く上達出来る様頑張っていこうと思います。