カンマ編集はできますか?

[上に] [前に] [次に]
ばーばぱぱ 1999/06/24(木) 13:35:45
例えば、テキストに「1,000」と入力されていて
セットフォーカスでカンマ編集を外し、
ロストフォーカスでカンマ編集をする方法は
あるのでしょうか?

Tmb 1999/06/24(木) 16:43:30
おもしろそうだったのでカンマを加える関数をぱっと考えてみました。
数字かどうかのチェックは省略してますが,1,000,000の単位のカンマにまで対応し,
小数にも対応させてます。不要なら解読して適当に改変してください。
それと,NN3で作ったので(動作確認済み)substringを使ってますが,
substrを使ったりすればもっときれいなソースになると思います。

カンマを除く方は,replaceでやれば簡単ではないかと思いますが,NN3
未対応の命令なので確認してません。

<script language="javascript">
function func(str){

Num=parseFloat(str);
RetStr="";

     if (Num>=1000000){
       a=Math.floor(Num/1000000);
       a.toString;
       RetStr=RetStr+a+",";
       OFflag=true;
     }

     if(Num>=1000){
       a=Math.floor(Num/1000)%1000000;
       a.toString;
          if (Num>=1000000){
            a='00'+a;
            a=a.substring(a.length-3,a.length)
            OFflag=true;
          }
       RetStr=RetStr+a+",";
     }
a=Math.floor(Num%1000);
a.toString
     if (Num>=1000){
       a='00'+a;
       a=a.substring(a.length-3,a.length)
     }
RetStr=RetStr+a;

     if (str.indexOf('.') != -1) {
       RetStr=RetStr+str.substring(str.indexOf('.'),str.length);
     }

return RetStr;
}
</script>

<form name="form1">
<input type="text" name="text1" value="10000">
<input type="button" name="button2" onClick="this.form.text1.value=func(this.form.text1.value);" value="Push">
</form>

Tmb 1999/06/24(木) 16:50:00
半角スペースで頭下げしてたせいで無効になってしまった(涙)
それとOFflag=trueというのが2箇所に出てきてますが,不要です(消し忘れ)

Tmb 1999/06/24(木) 17:46:07
改良版。ループ処理にしてソース短縮&上限アップ&負数に対応

function func(str){

Num=parseFloat(str);
RetStr=(str.indexOf(".")==-1)?"":str.substring(str.indexOf("."),str.length);
i=1000;
while (Math.abs(Num) >= i) {
a=Math.floor((Math.abs(Num) / i*1000) % i);
a.toString;
a="00"+a;
RetStr=","+a.substring(a.length-3,a.length)+RetStr;
i=i*1000;
}
a=Math.floor(Math.abs(Num) / i*1000);
a.toString;
RetStr=a+RetStr;

if (Num<0) {
RetStr="-"+RetStr;
}

return RetStr;
}

Nobu3 1999/06/24(木) 17:53:43

function func(str){
var dot=0;
if(-1<str.indexOf('.')){
dot=str.indexOf('.');
}else{
dot=str.length;
}
for(i=1;i<dot/3;i++){
str=str.substring(0,dot-i*3)+','+str.substring(dot-i*3,str.length);
}
return str;
}

こういうのはどうでしょう?
抜くのは簡単なのであえて書きませんが。

Nobu3 1999/06/24(木) 18:06:13

function func(str){
var sig='';
var renum='';
num=parseFloat(str);
if(num<0)sig='-';
numstr=num.toString();
if(sig=='-')numstr=numstr.substring(1);
var dot=0;
if(-1<numstr.indexOf('.')){
dot=numstr.indexOf('.');
}else{
dot=numstr.length;
}
if(1<dot/3){
for(i=1;i<dot/3;i++){
renum=numstr.substring(0,dot-i*3)+','+numstr.substring(dot-i*3,numstr.length);
}
}else{
renum=numstr;
}
renum=sig+renum;
return renum;
}

欠陥だらけでした。
たぶん直ってると思う・・・。
不要な「0」は消えるようにしたのと、負の数にも対応。

Nobu3 1999/06/24(木) 18:12:31
そう言えば、最初のは1000未満だと消えてしまいました(笑)
あのままだと恥ずかしいので一応訂正しました。
Tmbさんは、少し仕組みが違うので面白いですね。
他の人のスクリプトを見ると勉強になります。

Nobu3 1999/06/24(木) 18:22:15

function func(str){
var sig='';
var renum='';
num=parseFloat(str);
if(num<0)sig='-';
numstr=num.toString();
if(sig=='-')numstr=numstr.substring(1);
var dot=0;
if(-1<numstr.indexOf('.')){
dot=numstr.indexOf('.');
}else{
dot=numstr.length;
}
for(i=1;i<dot/3;i++){
numstr=numstr.substring(0,dot-i*3)+','+numstr.substring(dot-i*3,numstr.length);
}
renum=sig+numstr;
return renum;
}
すいません。
なんか違ってました。
もう、わけわからない・・・長いのを何度もすいません。

ばーばぱぱ 1999/06/25(金) 10:18:32
Nobu3さん、Tmbさんありがとうございます。
カンマを付けることは出来ました。
しかし、外すのができません。
何度も頼って申し訳ないのですが、
簡単なサンプルがあれば助かります。
よろしくお願いします。

Tmb 1999/06/25(金) 10:35:09
replaceは使ってみましたか?

str="abcabcabc";
alert(str);
str.replace("c","X");
alert(str);
str.replace("X","");
alert(str);

replaceの挙動がテストできないのですが,そちらの環境なら使えるのでは?
駄目ならindexOfとsubstringの合わせ技で解決できます。

Tmb 1999/06/25(金) 10:51:48
あ,そうだ。
カンマを付ける方で,最初にstrをカンマを除く関数に通してやると,
万一入力する人が気を利かせてカンマ付きにした場合でも対応できます。

僕が作ったソースは
a.toString
の部分は変数の型を変化させてしまうので,どうもエレガントではないですから
AddStr=a.toString()
などとした方がよかったです。

たこすけ 1999/06/25(金) 11:09:25
<script language="JavaScript">
function func2(aaa){
bbb = aaa.split(",");ccc = bbb.join("");return ccc
}
</script>

<form>
<input type="text" value="10,000" onFocus="this.value=func2(this.value);">
</form>

カンマ外すだけならこんなもんで・・・
> indexOfとsubstringの合わせ技で解決できます。
ひねくれ者なので使ってません(笑)

ばーばぱぱ 1999/06/25(金) 11:12:17
あのー
str.replace("c","X");
で、cとかxには何が入るのですか?
strはテキストに入力されている値が入るのは
分かるんですが・・・

Tmb 1999/06/25(金) 11:29:45
>cとかXとかには何が入る
何でしょうね(笑) いやいや,これはヒントにすぎないので
"abcabcabc".replace("c","X")
が,"abXabXabX"を返すか,"abXabcabc"を返すかを確認して欲しかったわけでして。

やろうとしていることを整理してみてください。
「カンマ付きの数字」というものは数値と見做されないので,文字列として
扱わねばなりません。
カンマを取り除くには,その文字列の中のカンマを""で置き換えればいいだけです。

>たこすけさん
splitとjoinを使うとは思いつきもしなかったです。まさに目からウロコ。
あいかわらず凄いですね (^^;

ちなみに僕の考えてたアルゴリズムは
function func2(str){
return str.replace(",","")
}
あるいは
function func2(str){
while (str.indexOf(",") != -1){
str=str.substring(0,str.indexOf(","))+str.substring(str.indexOf(",")+1,str.length);
}
return str;
}
でした。

ばーばぱぱ 1999/06/25(金) 13:55:20
[[解決]]
皆様ありがとうございます。無事解決しました。
結局Tmbさんのソースを真似てみました。
ちなみにIE4でreplaceを使ってみたら、
以下のようになりました。

str="abcabcabc";
str.replace("c","X"); ←abxabcabc
str.replace("X",""); ←ababcabc

このやり方だともしカンマが2個以上あったら
1個しか消えないということですね。

ばーばぱぱ 1999/06/25(金) 14:45:20
問題発生です。
テキストに何も入っていない状態でフォーカスを外すと、
'NaN'と入力されてしまうのです。
ちなみにソースはTmbさんのを使いました。

function func2(str){
while (str.indexOf(",") != -1){
str=str.substring(0,str.indexOf(","))+str.substring(str.indexOf(",")+1,str.length);
}
return str;
}

※どのソースを使っても同じ結果になってしまいます。

Tmb 1999/06/25(金) 14:56:33
ああ,そうか。忘れてました。最初に例外処理が必要ですね。
関数の初めに
str==""ならば,return str
という処理を足せばいいですね。

Tmb 1999/06/25(金) 15:00:59
>例外処理
カンマを付ける関数にも同様の処理をしておいてください。
僕のソースだと無限ループに入ってしまうおそれが (^^;

ばーばぱぱ 1999/06/25(金) 15:12:42
ああなるほど。
Tmbさん度々ありがとうございます。
これで本当(?)に解決です。たぶん。

[上に] [前に] [次に]