我已经在这里和其他地方查看了无数线程超过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语句,它再次打破了。我似乎无法让它适用于价值数千的所有可应用领域。
我需要能够在前200万美元“20000000”中输入“保险金额”(作为一个例子,因为它将填充几乎所有可能具有逗号分隔值和小数位的字段)
任何人都可以结束我的痛苦吗?谢谢你的帮助。
答案 0 :(得分:5)
在尝试了许多不同的解决方案之后,这对我来说似乎是最好的方式:
(1234568).toLocaleString("en-US", {style: "decimal", minimumFractionDigits: 2});
或
var opts = '{style: "decimal", currency: "USD", minimumFractionDigits: 2}';
(1234568).toLocaleString("en-US", opts);
或
(1234568).toLocaleString("en-US", {style: "decimal", minimumFractionDigits: 0});
我喜欢NickG's comment from mid-2013:“同意,它尚未得到所有浏览器的全面支持,但它仍然是一个解决方案。 (可以说是最有效的解决方案,因为它向前兼容不受支持的浏览器,它是Javascript api的文档功能。) “
来源:
How can I format numbers as money in JavaScript?
How to print a number with commas as thousands separators in JavaScript
答案 1 :(得分: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>
答案 2 :(得分:0)
我猜测你的问题是在做数学时,而不是在格式化值时。
您从文本字段获得的值的类型为&#39; string&#39;。当您对简单字符串进行数学运算时,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
}