Конвертировать в формат валюты - PullRequest
5 голосов
/ 12 ноября 2009

Есть ли встроенная функция JavaScript для преобразования строки в формат валюты?

Например

var a = '1234';
a.convertToCurrency();   // return $1,234

UPDATE

Обратите внимание, что я хочу, чтобы функция возвращала валюту, включающую запятую в США для группировки цифр.

Ответы [ 6 ]

14 голосов
/ 13 ноября 2009

Я решил полностью переписать пример, который сделал в 2009 году. Пожалуйста, отметьте diff , если вас интересует более старая версия . Для достижения функциональности, подобной предыдущему ответу, я извлек часть библиотеки Money, над которой я работаю.

Я также не помню, почему я воссоздал toFixed в прошлый раз, так как этот метод уже присутствовал. На этот раз оно не включено.

Вместо того, чтобы возиться с объектами String и Number в javascript, как в прошлый раз, я создаю новый объект Money.

(function() {
  window.Money = (function() {

    Money.prototype.amount = 0.0;
    Money.prototype.fraction_count = 2;
    Money.prototype.fraction_separator = ",";
    Money.prototype.separate_thousands = true;
    Money.prototype.symbol = "€";
    Money.prototype.symbol_position = "front";
    Money.prototype.symbol_spacing = false;
    Money.prototype.thousands_separator = ".";

    function Money(amount, options) {
      var o;
      if (options == null) {
        options = {};
      }
      for (o in options) {
        this[o] = options[o];
      }
      amount = parseFloat(amount);
      if (!isNaN(amount)) {
        this.amount = amount;
      }
      this.format();
    }

    Money.prototype.format = function() {
      this.string_amount = this.amount.toFixed(this.fraction_count);
      if (this.separate_thousands) {
        this.string_amount = this.separateThousands();
      }
      return this.string = this.addSymbol();
    };

    Money.prototype.separateThousands = function() {
      var after_dot, before_dot, pattern, _ref;
      _ref = this.string_amount.split("."), before_dot = _ref[0], after_dot = _ref[1];
      pattern = /(-?\d+)(\d{3})/;
      while (pattern.test(before_dot)) {
        before_dot = before_dot.replace(pattern, "$1" + this.thousands_separator + "$2");
      }
      return [before_dot, after_dot].join(this.fraction_separator);
    };

    Money.prototype.addSymbol = function() {
      var string;
      string = [this.string_amount];
      string.splice((this.symbol_position === "front" ? 0 : 1), 0, this.symbol);
      return string.join(this.symbol_spacing ? " " : "");
    };

    return Money;

  })();

Теперь мне нужно немного изменить объекты Number и / или String и добавить метод toMoney.

Number.prototype.toMoney = function(options) {
  return new Money(this, options);
};

String.prototype.toMoney = function(options) {
  return new Money(this, options);
};

Итак, наконец, мы можем преобразовать String и / или Number в Money и снова записать его как String.

x = "1234567890.0987654321".toMoney();
y = 1234567890.0987654321.toMoney({fraction_count: 5, symbol: "$", symbol_position: "back"});

console.log(x);
// Money {amount: 1234567890.0987654, string_amount: "1.234.567.890,10", string: "€1.234.567.890,10"}

console.log(x.string)
// €1.234.567.890,10 

console.log(y);
// Money {fraction_count: 5, symbol: "$", symbol_position: "back", amount: 1234567890.0987654, string_amount: "1.234.567.890,09877"…}

console.log(y.string)
// 1.234.567.890,09877$ 

Я думаю, что это решение намного лучше, чем последнее, что я написал. Для рабочего примера проверьте jsFiddle .

4 голосов
/ 12 ноября 2009
var a = 1234.12;
var c = '$' + a.toLocaleString();
1 голос
/ 26 января 2013

Вот еще один подход, который учитывает центы:

<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>Money Conversion</title>

<script type="text/javascript">
function numberToCurrency(amount) {

    var wholeDigits;
    var thousandsSeparator = ","
    var centSeparator = "."
    var currencyNum = "";

    if(amount.indexOf(".") != -1) {
        var hasCents = true;
    } else {
        var hasCents = false;
    }

    if (hasCents == true) {
        var num = amount.split(".");
        var wholeDigits = num[0].split("");
        var centAmount = num[1];
        var centDigits = num[1].split("");

        if (centDigits.length == 0) {
            centDigits += "00";
        }
        if ((centDigits.length > 0) && (centDigits.length < 2)) {
            centDigits += "0";
        }

    } else {
        centDigits = "";
        centSeparator = "";
        wholeDigits = amount.split("");
    }

    var countDigits = wholeDigits.length;

    var revDigits = wholeDigits.reverse();

    for(var i=0; i<countDigits; i++) {
            if ((i%3 == 0) && (i !=0)) {
                currencyNum += thousandsSeparator+revDigits[i];
            } else {
                currencyNum += wholeDigits[i];
            }
    };

    var revCurrency = currencyNum.split("").reverse().join("");

    var finalCurrency = "$"+revCurrency+centSeparator+centAmount;

    return finalCurrency;
}
</script>

</head>
<body>


<script type="text/javascript">

document.write(numberToCurrency('12326563523.37'));

</script>

</body>
</html>

Это делает трюк, хотя он не округляет суммы центов и не снимает статистику после 2 цифр.

1 голос
/ 26 января 2013

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

Вот небольшой сценарий, который я собрал сегодня утром, который поможет с целыми числами:

Вызовите функцию numberToCurrency и передайте свое значение как (сумму), и запятые будут помещены туда, где они должны быть.

<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>Number to Money Conversion</title>
<script>
    function numberToCurrency(amount) {

        var thousandsSeparator = ","
        var currencyNum = "";
        var amountString = amount.toString();
        var digits = amountString.split("");

        var countDigits = digits.length;
        var revDigits = digits.reverse();

        for(var i=0; i<countDigits; i++) {
            if ((i%3 == 0) && (i !=0)) {
                currencyNum += thousandsSeparator+revDigits[i];
            } else {
                currencyNum += digits[i];
            }
        };

        var revCurrency = currencyNum.split("").reverse().join("");

        var finalCurrency = "$"+revCurrency;

        return finalCurrency;
    }
</script>
</head>
<body>

<script>
document.write(numberToCurrency('1238868934324'));
</script>


</body>
</html>

Вы также можете действовать в этом цикле, принимая переменные - я собрал гистограмму в Raphael, на которой есть всплывающие подсказки, отображающие отформатированные суммы в долларах, взятые из прямых чисел в массиве, поэтому мне не нужно возиться со всеми кавычками 'n', такими. Помимо того, что фон черного пузыря постепенно выравнивается при наведении курсора на стеки в каждом столбце, он работает довольно хорошо - все еще возникают проблемы с метками - у этикетировщика, похоже, есть проблемы. На самом деле это всего лишь тестовый образец, но для преобразования чисел в валюту он подходит.

Я также создал скрипт, который обнаруживает центы и добавляет «0», если после «.» Есть только одна цифра, но я не проверял это так подробно, и есть множество различных тестов, которые я мог бы себе представить вам нужно сделать в дополнение. Я скоро выложу рабочую копию, и вы сможете поиграть с ней.

Вот что я сделал с Рафаэлем: http://lifeistryingtotellyousomething.info/raphael/raphael-stacked-column-demo-2000.html

0 голосов
/ 10 декабря 2017

Хотя это старый пост. Тем не менее, это сработало для меня в моем собственном случае:

var a = parseInt("1234");
console.log("$"+number_format(a));

var number_format = function(total) {
   return total.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
};
0 голосов
/ 12 ноября 2009

Это мы сделали в одном из наших проектов давно. Я просто узнаю код. Наше приложение было в asp.net. Функция dollarAmount делает работу

function checkNum(data) {      // checks if all characters
        var valid = "0123456789.";     // are valid numbers or a "."
        var ok = 1; var checktemp;
        for (var i=0; i<data.length; i++) {
        checktemp = "" + data.substring(i, i+1);
        if (valid.indexOf(checktemp) == "-1") return 0; }
        return 1;
    }

    function dollarAmount(form, field, appendZero) 
    { 
        Num = "" + eval("document." + form + "." + field + ".value");

        if(Num=="")
        {
            eval("document." + form + "." + field + ".value = '" + 0 + "';");
            return;
        }

        dec = Num.indexOf(".");

        end = ((dec > -1) ? "" + Num.substring(dec,Num.length) : "");

        Num = "" + parseInt(Num);

        var temp1 = "";
        var temp2 = "";
        //var appendZero=1;

        if (checkNum(Num) == 0) {
        //alert("This does not appear to be a valid number.  Please try again.");
        }
        else {

            if(appendZero==1 || end !="")
            {
                if (end.length == 2) end += "0";
                if (end.length == 1) end += "00";
                if (end == "") end += ".00";
            }

        var count = 0;
        for (var k = Num.length-1; k >= 0; k--) {
        var oneChar = Num.charAt(k);
        if (count == 3) {
        temp1 += ",";
        temp1 += oneChar;
        count = 1;
        continue;
        }
        else {
        temp1 += oneChar;
        count ++;
        }
        }
        for (var k = temp1.length-1; k >= 0; k--) {
        var oneChar = temp1.charAt(k);
        temp2 += oneChar;
        }
        temp2 = temp2 + end;
        eval("document." + form + "." + field + ".value = '" + temp2 + "';");
        }
    }

Мы назвали эту функцию вот так

txtBox.Attributes.Add("OnBlur", "return DollarAmount('" + txtBox.ID + "',0)");

Также после поиска в Google я нашел эту ссылку

a) Использование JavaScript для форматирования валюты на вашей веб-странице

b) Формат валюты

Также я предполагаю, что JQuery может иметь какой-то плагин для этой цели Валюта: ненавязчивая автоматическая конвертация валюты в режиме реального времени

Но я сомневаюсь, что какая-либо встроенная функция доступна в javascript. Пожалуйста, дайте мне знать, если вы нашли. Я хотел бы знать.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...