与えられた数値を3桁ずつ区切ってコンマ(,)をつけていきます。
お金を扱うときに使えるかもしれませんが利用価値はほとんどないです(・・;)
<script type="text/javascript" charset="Shift_JIS">
function Punctuate(){
var Input,Out,InputLegth,Remainde,Floor,Extract,Decrement,Minority; //変数宣言
Decrement=0; //初期値設定
Out=""; //初期値設定
Input=document.form1.text1.value; //テキストフォームから入力を変数Inputに入れる
InputLegth=Input.length; //入力された文字数を変数InputLegthに入れる
Remainde=InputLegth/3; //その文字数を3で割った数を変数Remaindeに入れる
Floor=Math.floor(Remainde); //文字数を小数点以下を切り捨てた値を変数Floorに入れる
Minority=String(Remainde).charAt(2);//文字数を3で割った数の小数点第一位の値を変数Minorityに入れる
//↓このfor文で数値を3つに区切っていき先頭に , を付けていく
for(i=0;i<Floor;i++){
Extract=Input.substring(InputLegth+Decrement,InputLegth+(Decrement-3));
//↑文字を3つずつ区切っていく
Out=","+Extract+Out; //先頭に , を付けて前回区切った数値を結合する
Decrement-=3; //変数を3つずつ減らしていく
}
//↓この条件分岐で数値の先頭に , がつかないように処理を行う
if(Minority==0){ //小数点1位の値が0だった場合(先頭が3個だった場合)
Out=Out.replace(",",""); //先頭の , を切り取る
}else if(Minority==6){ //小数点1位の値が3だった場合(先頭が2個だった場合)
Out=Input.substring(0,2)+Out; //変数Inputから先頭の1文字を抜き出し変数Outにくっつける。
}else if(Minority==3){ //小数点1位の値が3だった場合(先頭が1個だった場合)
Out=Input.substring(0,1)+Out; //変数Inputから先頭の2文字を抜き出し変数Outにくっつける。
}
document.form1.text2.value=Out; //出力に変数Outの値を出力する
}
</script>
<form name="form1">
入力<input type="text" size="20" name="text1"><br>
出力<input type="text" size="20" name="text2">
<input type="button" name="button1" value="変換" onClick="Punctuate()"> //関数Punctuate()を実行する
</form>
Level.3 では比較的簡単なサンプルを解説していきます。
さぁ、ちょっと長いプログラムですけど流れとしては簡単です。
このプログラムの流れとしては
これがこのプログラムの流れです、やってることはやっぱり簡単なのです。
文字数を3で割り切れなかった場合の処理方法
まず、文字数を3でわる、これで小数点以下の値は0か3か6のどれかとなる。
0の場合は最後のコンマのあとに3つ文字が入る時
3の場合は最後のコンマのあとに2つ文字が入る時
6の場合は最後のコンマのあとに1つ文字が入る時
となるのでこれをif文で行って処理を行っていきます。
では、細かい解説にいきます。
今回新しく使っているのはいろいろありますが解説しながら説明していきたいと思います。
var Input,Out,InputLegth,Remainde,Floor,Extract,Decrement,Minority;
実はこのvar
は省略可能で今まで使っていなかったんですけど今回から入れていくことにしました。
どうもこちらを使った方がプログラムの確実性がますそうなのです。
Input=document.form1.text1.value;
ではフォームの入力された数値を変数Inputに入れてます。
InputLegth=Input.length;
で、入力された文字数を変数InputLegthに入れてます。
Remainde=InputLegth/3;
で、その文字数を3で割った数を変数Remaindeに入れてます。
Floor=Math.floor(Remainde);
で、文字数を小数点以下を切り捨てた値を変数Floorに入れる。3.333とか3.666でも3になります。
Minority=String(Remainde).charAt(2);
で小数点第一位の数を抜き出す。
for(i=0;i<Floor;i++){
Extract=Input.substring(InputLegth+Decrement,InputLegth+(Decrement-3));
Out=","+Extract+Out;
Decrement-=3;
};
で、このfor文で数値を3つに区切っていき先頭に , を付けていく作業を行っています。 この説明では 1234567890 が与えられた数値として説明していきます。
このループは Floor の数だけループします。
Extract=Input.substring(InputLegth+Decrement,InputLegth+(Decrement-3));
これで後ろから3つ数値を抜き出しています。
最初はInputLegthが 10 Decrementが 0 、つまりInput.substring(10,7)となっている。
1234567890 だったら後ろの3つ、つまり 890 が抜き出される。
Out=","+Extract+Out;
これでさっき抜き出された 890 の先頭に , がついて ,890 となる
Decrement-=3;
はDecrement=Decrement-3と同じコトです。
これがループの1回目の流れ。
2回目はDecrementが-3となっていて
Extract=Input.substring(InputLegth+Decrement,InputLegth+(Decrement-3));
はInput.substring(7,4)となっている。
これで 567 が抜き出される。
Out=","+Extract+Out;
で ,567 となってさっきの,890がくっついて ,567,890 となる。
3回目はDecrementが-6となって
Input.substring(3,0)となり234が抜き出される。
Out=","+Extract+Out;
で ,234 になって ,567,890 とくっついて ,234,567,890 となる。
これでループを抜ける。
if(Minority==0){
Out=Out.replace(",","");
}else if(Minority==3){
Out=Input.substring(0,1)+Out;
}else if(Minority==6){
Out=Input.substring(0,2)+Out;
};
↑文字数を3で割った数の小数点第一位の値によって条件分岐させています。
Minority==0の場合は
Out.replace(",","")で先頭に , がついているので , をとってる(正確には置換)しています
Minority==6の場合は先頭の数値が2つになるので、
Out=Input.substring(0,2)+Outで入力された数値の先頭の2つを抜き出してループで出した値にくっつける。
Minority==3の場合は先頭の数値が1つになるので、
Out=Input.substring(0,1)+Outで入力された数値の先頭の1つを抜き出してループで出した値にくっつける。
今回の解説の場合ではMinority==3になるので 最初の一文字、 1 を抜き出してくっつけるので 1,234,567,890 となります。
document.form1.text2.value=Out;
でテキストフォームの出力に出力しています。
あとはフォームの
<input type="button" name="button1" value="変換" onClick="Punctuate()">
を押すことで実行してくれます。
どうでしょうか、結構解説がややこしいかもしれません。 自分でもよくわかんなくなってきちゃった(汗
解説していて思ったんですけどこれは正規表現を使えばもっとスマートに出来たかも。 変数も1個ですんだかもしれない可能性が^^;