複数のダイナミックテキストに1000桁ごとのカンマの打ち方

このQ&Aのポイント
  • 1000桁ごとのカンマの入れ方を教えていただき、上手くいったのですが、複数のテキストボックスにカンマを打ちたいと思い、Array を使ったのですがうまくいきません。
  • 根本的に何かが違うのだと思いますが、何処が違うのか教えていただきたく投稿しました。
  • 質問の詳細はスクリプトの記述です。
回答を見る
  • ベストアンサー

複数のダイナミックテキストに1000桁ごとのカンマの打ち方

先日、1000桁ごとのカンマの入れ方を教えていただき、上手くいったのですが、複数のテキストボックスにカンマを打ちたいと思い、Array を使ったのですがうまくいきません。根本的に何かが違うのだと思いますが、何処が違うのか教えていただきたく投稿しました。 どうぞよろしく御願いします。 on (press) { 計算式が入っています my_array[1] = new Array( ninendrieki , sannendrieki , gonendrieki , yonendrieki ) my_array[2] = new Array( _root.gonendriekiQ.text , _root.yonendriekiQ.text , _root.ninendriekiQ.text , _root.sannendriekiQ.text ) org = new String( my_array[1] ) temp = new String( "" ); cnt = 0; for( i = org.length - 1 ; i >= 0 ; i-- , cnt++ ) { temp += org.charAt( i ); if( cnt % 3 == 2 ) { temp += ","; } } if( temp.charAt( temp.length - 1 ) == "," ) { start_index = temp.length - 2; } else{ start_index = temp.length - 1; } my_array[2] = ""; for( i = start_index; i >= 0 ; i-- ) { my_array[2] += temp.charAt( i ); } }

  • Flash
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.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 型)になります。 計算の結果を入れますので、配列に入れる処理は必ず計算の後に実行してください。 前回も問題になりましたが、変数やテキストフィールドの名前・階層の間違いにはご注意ください。 なお、上記のスクリプトでは、計算の結果とテキストフィールドの名前が数値および参照として配列に入っていますが、名前を文字列として管理し、関数の方で文字列を元に変数やテキストフィールドの参照に変換して操作するといった方法もあります。 この話は長くなりますので、またの機会に。

ohirosi
質問者

お礼

どうも有難う御座いました。成功しました。 まだまだ勉強不足で、内容を全て把握できませんが、これからDPEさんの説明文とスクリプトの本を見ながら理解していこうと思います。 本当に丁寧に教えていただきどうも有難う御座いました。 自分も早く上達出来る様頑張っていこうと思います。

関連するQ&A

  • 料金計算→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となってしまいます。 どんどんカンマを追加するにはどうしたらういいのでしょうか。。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 濁点のソート

    PHPで濁点のソートがうまく出来なくて困っております。 データは下記のような形で入っています。 $temp_array=array("じごい","じこあ","しこう"); sort($temp_array); var_dump($temp_array); 結果は下記のようになってしまいます。 array 0 => string 'しこう' (length=9) 1 => string 'じこあ' (length=9) 2 => string 'じごい' (length=9) 本来であれば濁点を無視した下記のようなソート順にしたいのです。 array 0 => string 'じこあ' (length=9) 1 => string 'じごい' (length=9) 2 => string 'しこう' (length=9) どうしたらいいのでしょうか。 教えてください。

    • 締切済み
    • PHP
  • JSPのcharAt()について

    JSPです。text1.txtをBufferedReaderで読み込んで、一文字ごとにchar型のline[]という配列に入れようとしています。 しかし、l.charAt();の部分でエラー起きてしまいます。 原因は何なのでしょう? 文字列をString型に直接(String l = "aaaaaa";のように)書き込むと動くようです。 String path = getServletContext().getRealPath("/WEB-INF/text1.txt"); BufferedReader br = new BufferedReader(new FileReader(path)); String l = ""; char line[]; while((l = br.readLine()) != null){ line = new char[l.length()]; for(int j=0; j <= l.length(); j++){ line[j] = l.charAt(j); out.print(l.charAt(j)); } } どこがおかしいのか、原因がわかる方教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javascriptのスライドショーで、ポイント時に代替テキストを表示するか、ポイントしなくてもキャプションを表示するためには?

    初心者ですが何とかjavascriptで自動のスライドショーを動かしています。写真にポイントした時にalt等で代替テキストを表示するか、ポイントしなくてもキャプションを表示するためにはどのような記述が必要なのでしょうか? スタイルシートは使っていません。 現在はこんな感じです。 根本的に違うのでしょうか?できれば簡単な方法があればと思います。 head部には <SCRIPT> <!-- var img = "1.JPG,2.JPG,3.JPG"; var imgs = img.split(","); var i=0; var pic = new Array(); for(cnt=0; cnt<imgs.length; cnt++){ pic[cnt] = new Image(); pic[cnt].src = imgs[cnt]; } function sulaidoImg1() { i++; i%=imgs.length; imgFil1.filters.blendTrans.Apply(); imgFil1.src = pic[i].src; imgFil1.filters.blendTrans.Play(); } //--> </SCRIPT> 対象部分には <SCRIPT> <!-- imgFil1.src=pic[0].src; setTimeout("sulaidoImg1()", 3000); //--> </SCRIPT>

  • 外部複数テキスト読み込みのについて

    外部複数テキスト読み込みのについて 写真のサムネイルボタンがあり、それをクリックすると外部の写真と、外部のテキストが読み込まれる物を作成しています。 サムネイルボタンが複数あるので、1つずつ表記するのではなくまとめたいと思って四苦八苦しています。 複数あるボタンは下記の様にまとまった記述にできました。 //ボタンクリックで写真読み込み for (var i_pic:int = 0; i_pic < 10; i_pic++) { this["btn"+i_pic].addEventListener(MouseEvent.CLICK, loadPic); } function loadPic(event:MouseEvent):void { var btn_name:String=event.target.name; this.menuPicture.source="menu/menu"+btn_name.charAt(3)+".jpg"; } しかし外部テキストが色々試しましたがうまくいきません。 for (var i_txt:int = 0; i_txt < 10; i_txt++) { this["btn"+i_txt].addEventListener(MouseEvent.CLICK, TextLoad); } function TextLoad(event:MouseEvent):void { var Ureq:URLRequest=new URLRequest("menu/menu_txt"+btn_name_txt.charAt(3)+".txt"); var loaderTxt:URLLoader = new URLLoader(); loaderTxt.load(Ureq); var btn_name_txt:String=event.target.name; setumei.text=loaderTxt.data; } 適当にやってここまでてきて、コンパイルエラーは出ないものの、いざボタンを押すと TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。 at _fla::Timeline_1/TextLoad() とでます。 どうやったら上手くいくのでしょうか? よろしくお願い致します。

  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • 外部のテキストを読み込んで数値として使う。

    下記のような内容のテキストファイルがあり 各行を各フレーム目のクリップのx座標y座標 に当てはめたいのです。 一フレーム目は(x,y)=10,10 5フレーム目は(x,y)=50,50 といった具合に テキスト(ppp.txt)の内容 10,10 20,20 30,30 40,40 50,50 60,60 70,70 80,80 90,90 メインのタイムラインに var load_lv:LoadVars = new LoadVars(); load_lv.load("ppp.txt"); load_lv.onData = function(s) { if (s.length > 0) { myFunction(s); } } function myFunction(s:String):Void { var lines:Array = s.split("\n"); for(i=1;i<9;i++){ var Array_1:Array = lines[i].split(","); clip_1._x = 5*Number(Array_1[0]); clip_1._y = 5*Number(Array_1[1]); } } これでは無理でした、、、 お願いします

    • ベストアンサー
    • Flash
  • テキストファイルからの読み込みにつきまして

    はじめまして。Flash初心者です。 ただいま、「プロとして恥ずかしくないFlashの大原則」のP94ページの 外部テキストからの設定が可能な縦メニューを挑戦しているのですが、テキストファイルからの日本語の読み込みが表示できません。アルファベットでしたら表示ができるので、どこがおかしいのかわからなくなってしまいました。 以下、使用中のロジック // 外部テキストのエンコード設定 System.useCodepage = true; i = 0; // メッセージウィンドウに1文字ずつ表示する関数を作成 function msgWindow( winObj, mObj ){ if( i <= mObj.mMsg.length ){ winObj.msgStr.text = mObj.mMsg.substr( 0, i ); i++; } else{ i = 0; clearInterval( _root.tID ); } } // ロード時に外部テキストを読み込む onLoad = function(){ if( _root.textUrl != null ){ this.loadVariables( _root.textUrl ); } else{ this.loadVariables( "menu.txt" ); } } // データを読み込み後の処理 onData = function(){ // メニューボタンをステージに配置 for( cnt = 1; cnt < 2; cnt++ ){ if( eval( "menu" + cnt ) !== undefined ){ mObj = "mBtn" + cnt; _root.attachMovie( "menuBtn", mObj, cnt ); _root[mObj]._x = 5; _root[mObj]._y = 60 * cnt; _root[mObj].m_name.text = eval( "menu" + cnt ); _root[mObj].mUrl = eval( "url" + cnt ); _root[mObj].mTarget = eval( "target" + cnt ); _root[mObj].mMsg = eval( "msg" + cnt ); } // メニューボタン上でマウスボタンを離した時 _root[mObj].onRelease = function(){ getURL( this.mUrl, this.mTarget ); } // マウスオーバー時の処理 _root[mObj].onRollOver = function(){ eval(this._name).gotoAndStop( 2 ); with(_root) { objMsgWin = "newMsgWin"; attachMovie("msgWin", objMsgWin, 100 ); _root[objMsgWin]._x = this._x; _root[objMsgWin]._y = this._y + 25; tID = setInterval( msgWindow, 20, _root[objMsgWin], this ); } } // ポインタをメニューボタン外に移動した時 _root[mObj].onRollOut = function(){ eval(this._name).gotoAndStop( 1 ); _root[_root.objMsgWin].removeMovieClip(); clearInterval( _root.tID ); } // マウスボタンがメニューボタン外で離された時 _root[mObj].onReleaseOutside = function(){ eval(this._name).gotoAndStop( 1 ); _root[_root.objMsgWin].removeMovieClip(); clearInterval( _root.tID ); } } } stop(); 以下、テキストファイル &menu1=あいうえお& &menu2=123456& &menu3=MENU03& &menu4=MENU04& &menu5=MENU05& &menu6=MENU06& &menu7=MENU07& &menu8=MENU08& &url1=http://www.mdn.co.jp/& &url2=http://www.mdn.co.jp/& &url3=http://www.mdn.co.jp/& &url4=http://www.mdn.co.jp/& &url5=http://www.mdn.co.jp/& &url6=http://www.mdn.co.jp/& &url7=http://www.mdn.co.jp/& &url8=http://www.mdn.co.jp/& &target1=_blank& &target2=_blank& &target3=_blank& &target4=_blank& &target5=_blank& &target6=_blank& &target7=_blank& &target8=_blank& &msg1=現在のページです& &msg2=現在のページです& &msg3=現在のページです& &msg4=ここにメニュー04の説明が入ります。& &msg5=ここにメニュー05の説明が入ります。& &msg6=ここにメニュー06の説明が入ります。& &msg7=ここにメニュー07の説明が入ります。& &msg8=ここにメニュー08の説明が入ります。& 結果 『&menu1=あいうえお&』で出したい、「あいうえお」が表示できません。他の&menuと&msgの日本語は表示されるのですが、どこかおかしいでしょうか。 もしお時間ありましたら宜しくお願い致します。 ちなみにですが、今回のロジックのサンプルはhttp://www.mdn.co.jp/content/view/962からダウンロードしたものです。

    • ベストアンサー
    • Flash
  • 配列の中に複数存在する数がいくつあるか

    お世話になります。配列の中に同じ数が存在する数がいくつあるかを調べたいのですが、途中でつまづいてしまいました。 例えば配列arrayの中に、0, 0, 5, 0, 5, 1, 5といった数が格納されているとしたら 複数ある数は0と5の2つなので、2を返す、というだけのプログラムです。 int n=array.length; int cnt=0; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(array[i]==array[j]){ cnt++; break; } } } return cnt; forループで配列0から同じ数を順番に調べ、もしヒットすればカウントを増やして内側のループをブレイクし、配列1からまた順番に調べようとしたのですが、 上の例の場合、配列0と配列1が同じ数(0)ですので、カウントが余計に増えてしまいます。 どのように組めばうまく動作するでしょうか。宜しくお願いします。

    • ベストアンサー
    • Java
  • JAVAプログラムをWEB表示させるには・・・

    import java.awt.*; import javax.swing.*; class Test { public static void main(String args[]) { Frame frm = new Frame("テスト"); frm.setLayout(null); frm.setSize(new Dimension(450,550)); frm.setVisible(true); JFormattedTextField[] array = new JFormattedTextField[45]; for(int i = 0 ;i < array.length ; i++){ array[i] = new JFormattedTextField (); frm.add(array[i]); array[i].setSize(65, 22); array[i].setLocation(121+(i%3)*66, 130+(i/3)*22); } } } フレームにいくつかのテキストを入れただけの簡単なプログラムなのですが、これをJSPでWEB表示させたいのですが・・・・なかなかうまくいかなく困ってます。色々サイトを見ているのですが、解説だとわかりにくく、サンプルコードを載せてるところを探しているのですが、それも見つかりません。JAVAプログラムをJSPでWEB表示させるには、どのような方法があるのか教えていただけないでしょうか?よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう