入力フォームに数値を入力したものを三桁でカンマ区切り、全角数値を半角に変換、入力した値同士で足し算した合計のものを表示、数値以外は表示させないことを実装したいのですが、合計金額の表示が上手くいきません。三桁までの数字は上手く足されるのでカンマ区切りの処理が邪魔をしているみたいです……
html
1 //数値を入力するフォーム 2 <input class="money1 js-money" style="width:100%; box-sizing:border-box" name="money1"> 3 <input class="money2 js-money" style="width:100%; box-sizing:border-box" name="money2"> 4 <input class="money3 js-money" style="width:100%; box-sizing:border-box" name="money3"> 5 6 //合計金額を表示させる場所 7 <span class="total-money"></span>
JavaScript
1//文字列にカンマを追加 2function addComma(val) { 3 return val.replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,'); 4} 5 6//文字列からカンマを除去 7function deleteComma(val) { 8 return val.replace(/,/g, ''); 9} 10 11document.addEventListener( 'DOMContentLoaded', () => { 12 document.querySelectorAll('.js-money').forEach((el) => { 13 14 /***** フォームに入力された数値を集計し、表示する *****/ 15 el.addEventListener('change', (e) => { 16 17 /***** フォームがフォーカスされた時にカンマを除去 *****/ 18 el.addEventListener('focus', (e) => { 19 const val = e.target.value; 20 e.target.value = deleteComma(val); 21 }); 22 23 /***** フォームからフォーカスが外れた時にカンマを表示 *****/ 24 el.addEventListener('blur', (e) => { 25 const val = e.target.value; 26 e.target.value = addComma(val);0 27 }); 28 29 //0以上の整数、半角と全角の数字以外が入力されたら、フォームを初期化する 30 let inputVal = e.target.value; 31 const pattern = /^([0-90-9]*|0)$/; 32 if(!pattern.test(inputVal)){ 33 e.target.value = ""; 34 inputVal = ""; 35 } 36 37 //全角数字を半角数字に変換 38 e.target.value = inputVal.replace(/[0-9]/g,(s) => { 39 return String.fromCharCode(s.charCodeAt(0) - 0xFEE0); 40 }); 41 42 //合計金額の表示 43 let money1 = 0; 44 if(document.querySelector('.money1').value){ 45 money1 = parseInt(document.querySelector('.money1').value); 46 } 47 let money2 = 0; 48 if(document.querySelector('.money2').value){ 49 money2 = parseInt(document.querySelector('.money2').value); 50 } 51 let money3 = 0; 52 if(document.querySelector('.money3').value){ 53 money3 = parseInt(document.querySelector('.money3').value); 54 } 55 56 let totle = money1 + money2 + money3; 57 58 let money_sum = document.querySelector('.total-money'); 59 money_sum.innerHTML = totle +"円"; 60 61 }); 62 63 }); 64 65});
上記のフォームに入力を行うと三桁のカンマ区切り、数値以外は入力しない、全角数値を半角に変換は上手くいきます。
spanタグに合計数値を表示するときに三桁以上入力すると変な表示になってしまいます。
入力例:
inputタグのclass="money1”~class="money3"に11,111と入力すると合計が表示されるspanタグ部分には11133と表示されてしまいます。
また、let totle = money1 + money2 + money3;時点でconsole.log(totle)とするとspanタグ表示される変な値と同じ表示になります。
console.logにて値がおかしくなる所を探したところ次のようなことが判明しました。
↓↓↓
class="money1"に11111を入力→console.log(money1)でコンソールに11111と表示。
続けてclass="money2"に11111を入力→console.log(money1)でコンソールに11と表示,console.log(money2)でコンソールに11111と表示。
続けてclass="money3"に11111を入力→console.log(money1)でコンソールに11と表示,console.log(money2)でコンソールに11と表示,console.log(money3)でコンソールに11111と表示。
このことからinputに値を入力した時点では数値として代入されるが、
他のinputに値を代入した時(イベント発生時)にはカンマを含むため文字列に反映されるのかなと思います。
試しにcosole.log(parseInt(111,111))とやってみたら111と表示されました。
↓のJSコードを取り除いた状態で入力すると上手くいきます。
ですが、カンマ区切りがなくなります…あちらがたてばこちらが立たず状態です。
JavaScript
1//文字列にカンマを追加 2function addComma(val) { 3 return val.replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,'); 4} 5 6//文字列からカンマを除去 7function deleteComma(val) { 8 return val.replace(/,/g, ''); 9}
カンマ区切りとしつつ、数値を合計させるいい方法があればご教授いただきたいです。
回答4件
あなたの回答
tips
プレビュー