转换为货币格式

时间:2009-11-11 23:45:44

标签: javascript html

是否有JavaScript的内置函数将字符串转换为货币格式?

例如

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

更新

请注意,我希望该函数返回货币以包含美国逗号到组数字。

6 个答案:

答案 0 :(得分:14)

  

我决定完全重写我在2009年所做的例子。如果对旧版本感兴趣,请查看diff 。为了实现像以前的答案一样的功能,我已经提取了我正在处理的Money库的一部分。

     

我也不记得为什么我上次重新创建toFixed因为该方法已经存在。这次不包括在内。

我没有在javascript中弄乱StringNumber个对象,而是在上次创建新的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

答案 1 :(得分:4)

var a = 1234.12;
var c = '$' + a.toLocaleString();

答案 2 :(得分:1)

看起来好像要解析一个字符串并找出放置逗号的位置。

这是我今天早上放在一起的一个小脚本,可以解决整个数字:

调用函数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>

你也可以在一个循环中对变量采取行动 - 我把拉斐尔的堆积条形图拼凑在一起,工具提示显示格式化的金额,取自数组中的直数,所以我没有必要把所有的引号都搞砸了。除了当我将鼠标悬停在每个栏中的堆栈上时,黑色气泡背景逐渐错位,它运作良好 - 仍然遇到标签问题 - 标签商似乎有问题。实际上,只是一个测试样本,但是为了将数字转换为货币,它可以解决问题。

我还做了一个检测美分的脚本,如果在“。”之后只有一个数字,则附加一个“0”,但是我还没有广泛测试过,而且我可以想象有很多不同的测试你还需要做。我很快就会发布工作副本,你可以玩它。

以下是我对拉斐尔的所作所为:http://lifeistryingtotellyousomething.info/raphael/raphael-stacked-column-demo-2000.html

答案 3 :(得分:1)

这是另一种解释分数的方法:

<!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位数的额外内容。

答案 4 :(得分:0)

我们在我们的一个项目中做了很久。我只是找出代码。我们的申请是在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)");

谷歌搜索后我发现了这个链接

a)Use JavaScript to Format Currency within Your Web Page

b)Currency Format

另外我猜JQuery可能有一些插件用于服务目的 Currency: an unobstrusive automatic and real time currency conversion

但我怀疑是否有任何内置功能在javascript中可用。如果你发现了,请告诉我。我很想知道。

谢谢。

答案 5 :(得分:0)

虽然这是一篇老帖子。尽管如此,在我自己的案例中,这对我有用:

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

var number_format = function(total) {
   return total.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
};