2

ここや他の場所で数え切れないほどのスレッドを 2 日以上調べましたが、これを正しく機能させることができません。

電卓は必要なとおりに機能していますが、最後の 1 つを完了することができないようです。1000 単位のコンマ区切りと 10 進数。

小数点以下の桁数はありますが、コンマを追加できません。カンマを追加すると、計算が中断したり、値が NaN として表示されたりする前に、1 つまたは 2 つのフィールドを機能させることができます。

ここに作業ページがあります: http://codepen.io/anon/pen/Fauzy

現在これを使用しています:

function FormatAsMoney(mnt) {
mnt -= 0;
mnt = (Math.round(mnt*100))/100;
return (mnt == Math.floor(mnt)) ? mnt + '.00'
: ( (mnt*10 == Math.floor(mnt*10)) ?
mnt + '0' : mnt);
}

これを使おうとすると:

function FormatAsMoney(x)

        {


            var money_value;

            mnt = x.value;

            mnt = mnt.replace(/\,/g,'');

            mnt -= 0;

            mnt = (Math.round(mnt*100))/100;

            money_value = (mnt == Math.floor(mnt)) ? mnt + '.00' : ( (mnt*10 == Math.floor(mnt*10)) ? mnt + '0' : mnt);

            if (isNaN(money_value))
            { 
                money_value ="0.00";

            }else{
        money_value = CommaFormatted(money_value);      
        x.value = money_value.replace(".00", "");
    }

}

まったく機能しません。

を使用して別のテストを行いました:

function FormatAsMoney(str) {
  return (str + "").replace(/\b(\d+)((\.\d+)*)\b/g, function(a, b, c) {
    return (b.charAt(0) > 0 && !(c || ".").lastIndexOf(".") ? b.replace(/(\d)(?=(\d{3})+$)/g, "$1,") : b) + c;
  });
}

最初のフィールドでカンマの書式設定を取得しますが、小数を失い、他の計算を続行しません。

別の例として、次のようなコンマを追加する別の関数を作成しました。

function addCommas(nStr){
    nStr += '';
    c = nStr.split(','); // Split the result on commas
    nStr = c.join('');  // Make it back to a string without the commas
    x = nStr.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}

私はそれを次のように使用します:

document.Rate.RATE.value=addCommas(FormatAsMoney(dasum));

これは私がこれまでに得た最良の結果のようですが、たとえば、 function dosum()多くの if ステートメントに依存する行 (163) では、再び壊れています。値が千単位になるすべての適用可能なフィールドで機能させることはできないようです。

上位 2000 万ドルの「20000000」に「保険金額」を入力できるようにする必要があります (例として、コンマ区切りの値を持つほぼすべての可能なフィールドに小数点以下を入力するため)。

誰かが私の惨めさを終わらせることができますか? 助けてくれてありがとう。

4

3 に答える 3

2

問題をより明確に説明するために、いくつかの入力と対応する出力を提供できたはずです。負でない数値を入力として取得し、小数点と桁区切り記号でフォーマットされた文字列を出力する関数が必要だと思います。私の仮定が正しい場合、firefox 24.0 /Linuxでテストされた以下が役立つかもしれません:

<!DOCTYPE html>
<html>
<head>
    <title>HTML</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script type="text/javascript">
        var decimalSeparator = ".";
        var decimalDefault = decimalSeparator + "00";
        var thousandsSeparator = ",";

        /**
         * @param {String or Number} value The value to format
         * @returns {String} The formatted Number as a String
         */
        function formatMoney(value) {
            var valueStr = String(value);
            var decimalDividerPos = valueStr.indexOf(".");
            var decimalPart = decimalDividerPos == -1 ? decimalDefault : decimalSeparator + valueStr.substr(decimalDividerPos + 1);
            var integerPart = decimalDividerPos == -1 ? valueStr : valueStr.substring(0, decimalDividerPos);
            var integerAry = new Array();
            var lenTemp = 0;
            for (var i = integerPart.length - 1; i >= 0; i--) {
                integerAry.unshift(integerPart.substr(i, 1));
                if (i && (!(++lenTemp % 3))) {
                    integerAry.unshift(thousandsSeparator);
                }
            }
            return integerAry.join("") + decimalPart;
        }
    </script>
<body>
    <script type="text/javascript">
        var testValues = new Array(
                0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
                0.9876, 1.9876, 10.9876, 100.9876, 1000.9876, 10000.9876, 100000.9876, 1000000.9876, 10000000.9876,
                1234567e+123, Number.MAX_VALUE);
        for (var x in testValues) {
            console.log("VALUE=" + testValues[x] + " =>  FORMATTED=" + formatMoney(testValues[x]));
        }
    </script>
</body>
</html>
于 2013-10-29T18:49:53.660 に答える
0

あなたの問題は、値のフォーマット中ではなく、数学の実行中にあると思います。

テキスト フィールドから取得する値は「文字列」タイプです。単純な文字列で計算を行うと、Javascript が自動的にそれらを数値に変換します。ただし、フォーマットを追加すると、この自動変換は機能しなくなります。

console.log('5000' - '2000'); // outputs the value 3000 of type number
console.log('5,000' - '2,000'); // outputs NaN - this is an invalid format for auto-conversion to numbers

テキスト フィールドの値をフォーマットしたら、それらを文字列として扱う必要があります。数学を行うには、それらを解析して数値に戻す必要があります。

何かのようなもの:

function parseCommaSeparated( strVal ) {
    return parseFloat(strVal.replace(',','');) // remove commas before parse
}
于 2013-10-29T17:31:31.597 に答える