Правильный формат валюты JS с запятыми и десятичными знаками

Я просмотрел бесчисленное количество тем здесь и в других местах более 2 дней, и я не могу заставить это работать должным образом.

У меня есть калькулятор, работающий именно так, как мне нужно, однако я не могу сделать последнюю вещь. Разделитель запятых тысячами с десятичным числом.

У меня есть десятичные разряды, но я не могу добавить запятые. Когда я добавляю запятые, я могу заставить одно или два поля работать до того, как вычисления прервутся или значение будет отображаться как NaN.

Вот рабочая страница: 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));

Это, кажется, лучший результат, который у меня был, однако в строке (163), где, например, function dosum() зависит от многих операторов if, снова ломается. Кажется, я не могу заставить его работать для всех применимых полей, где значение будет исчисляться тысячами.

Мне нужно иметь возможность ввести «Страховую сумму» в верхней части 20 миллионов долларов «20000000» (в качестве примера, потому что она будет заполнять почти все возможные поля, которые будут иметь значения, разделенные запятыми, с десятичным знаком)

Может ли кто-нибудь положить конец моим страданиям? Спасибо за любую помощь.


person Zack Bluem    schedule 29.10.2013    source источник
comment
Вы говорите, что ни один из методов в этот вопрос работать? Тот, у которого 450+ голосов, кажется, работает после быстрого тестирования.   -  person numbers1311407    schedule 29.10.2013
comment
Также есть toLocaleString.   -  person numbers1311407    schedule 29.10.2013


Ответы (3)


Попробовав множество разных решений, это кажется (мне) лучшим способом:

демонстрация jsFiddle

(1234568).toLocaleString("en-US", {style: "decimal", minimumFractionDigits: 2});

or

var opts = '{style: "decimal", currency: "USD", minimumFractionDigits: 2}';
(1234568).toLocaleString("en-US", opts);

or

(1234568).toLocaleString("en-US", {style: "decimal", minimumFractionDigits: 0});

Мне понравился комментарий NickG от середины 2013 года: "Согласен, это не полностью поддерживается во всех браузерах (пока), но это все еще решение. (И, возможно, самое правильное решение, поскольку оно совместимо с неподдерживаемыми браузерами и оно документированная функция API Javascript.)"

Источники:

демонстрация jsFiddle

Как я могу форматировать числа как деньги в JavaScript?

Как распечатать число с запятыми как разделителями тысяч в JavaScript

person crashwap    schedule 07.02.2015

Вы могли бы предоставить некоторые входные данные и соответствующие выходные данные, чтобы более четко описать свою проблему. Я предполагаю, что вам нужна функция, которая получает на вход любое неотрицательное число и хочет, чтобы на выходе была строка, отформатированная с десятичной точкой и разделителями тысяч. Если мое предположение верно, вам может помочь следующее, проверенное на 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>
person Michael Besteck    schedule 29.10.2013
comment
Определенно лучший ответ! - person anteatersa; 07.12.2018

Я предполагаю, что ваша проблема связана с математикой, а не с форматированием значений.

Значение, которое вы получаете из текстовых полей, имеет тип «строка». Когда вы выполняете математические операции с простыми строками, 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
}
person Mike Edwards    schedule 29.10.2013