2009-11-11 134 views
5

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

例如

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

UPDATE

请注意,我希望函数返回的货币包括美国逗号组数字。

+0

FWIW现在有一个内置的功能在JavaScript中,这是否:https://developer.mozilla.org/en-US/docs/Web/ JavaScript的/参考/ Global_Objects/NumberFormat,它的工作在节点 - 以及0.12 – Simon 2016-09-15 17:44:50

回答

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

这不会添加在“,”(逗号) – TimH 2009-11-11 23:57:00

+0

您的示例返回$ 1234.12,但我希望它返回$ 1,234 – TimH 2009-11-12 00:09:06

+0

不幸的是,这取决于您的系统设置。 – ChaosPandion 2009-11-12 00:22:30

0

这个我们在我们的一个项目中做了很久。我只是找出代码。我们的应用程序在asp.net中。功能dollarAmount确实

function checkNum(data) {  // checks if all characters 
     var valid = ".";  // 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 + "';"); 
     } 
    } 

我们还有谷歌上搜索,我发现这个链接

一)Use JavaScript to Format Currency within Your Web Page

B)​​

后这样调用

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

此功能工作

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

但我怀疑是否有任何内置函数可用JavaScript。如果你发现任何问题,请告诉我。我会很高兴知道。

谢谢。

+0

有没有必要使用eval ... document.forms [form_name] [field_name] .value – ChaosPandion 2009-11-13 01:35:57

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和/或NumberMoney并再次将其写出来为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

+0

似乎有一个错误:0.5格式为“0.5”,而不是“0.50”(货币必须是2位小数不是一个) – 2010-07-07 00:48:50

+1

如果小数点没有足够的位置,我已经固定了分数位。 **更改:** '$ A.arr [1] ==未定义? $ A._dec = $ O.use_fractions.fraction_separator +“0”.times($ O.use_fractions.fractions):$ A._dec = $ O.use_fractions.fraction_separator + $ A.arr [1];' * *致:** '$ A.arr [1] ==未定义? $ A._dec = $ O.use_fractions.fraction_separator +“0”.times($ O.use_fractions.fractions):$ A._dec = $ O.use_fractions.fraction_separator + $ A.arr [1] +“0”。次($ O.use_fractions.fractions - $ A.arr [1] .length);' – 2013-01-02 20:44:56

+0

我做了一个小改写,觉得这个版本更好。 – Krule 2013-01-03 14:19:05

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> 

您可以在一个循环中采取的变量在此充当好 - 我扔在一起拉斐尔堆积条形图具有显示格式的美元金额,从直接数字阵列中的所采取的提示,所以我不''必须摆弄所有的引号'n'等。除了当我将鼠标放在每个栏中的堆栈上时,黑色泡泡背景逐渐错位,它的效果非常好 - 仍然遇到标签问题 - 标签商似乎有问题。仅仅是一个测试样本,但是为了将数字转换为货币,它的确有窍门。

我也做了一个脚本,检测美分,并附加一个“0”,如果只有一个数字后面的“。”,但我没有广泛测试,并且有很多不同的测试,我可以想象你需要另外做。我会尽快发布工作副本,并且可以玩它。

这里就是我与拉斐尔:http://lifeistryingtotellyousomething.info/raphael/raphael-stacked-column-demo-2000.html

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位数字。

0

虽然这是一个旧帖子。尽管如此,这个曾在我在我自己的情况:

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

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