Javascript 中是否有用于格式化数字和字符串的函数?
我正在寻找一种用于字符串或数字的千位分隔符的方法......(如 c# 中的 String.Format)
Javascript 中是否有用于格式化数字和字符串的函数?
我正在寻找一种用于字符串或数字的千位分隔符的方法......(如 c# 中的 String.Format)
更新(7年后)
下面原始答案中引用的参考是错误的。这里是一个内置的功能,这一点,而这正是德皇以下建议:toLocaleString
所以你可以这样做:
(1234567.89).toLocaleString('en') // for numeric input
parseFloat("1234567.89").toLocaleString('en') // for string input
下面实现的函数也可以工作,但根本没有必要。
(我想也许我会很幸运并在 2010 年发现它是必要的,但没有。根据这个更可靠的参考,toLocaleString 自 ECMAScript 3rd Edition [1999] 以来一直是标准的一部分,我相信这意味着它早在 IE 5.5 就支持了。)
原答案
根据此参考资料,没有用于向数字添加逗号的内置函数。但该页面包含一个如何自己编码的示例:
function addCommas(nStr) {
nStr += '';
var x = nStr.split('.');
var x1 = x[0];
var x2 = x.length > 1 ? '.' + x[1] : '';
var rgx = /(\d+)(\d{3})/;
while (rgx.test(x1)) {
x1 = x1.replace(rgx, '$1' + ',' + '$2');
}
return x1 + x2;
}
编辑: 要反过来(将带逗号的字符串转换为数字),您可以执行以下操作:
parseFloat("1,234,567.89".replace(/,/g,''))
如果是关于本地化千位分隔符、分隔符和小数点分隔符,请使用以下内容:
// --> numObj.toLocaleString( [locales [, options] ] )
parseInt( number ).toLocaleString();
您可以使用多种选项(甚至带有回退的语言环境):
number = 123456.7089;
result = parseInt( number ).toLocaleString() + "<br>";
result += number.toLocaleString( 'de-DE' ) + "<br>";
result += number.toLocaleString( 'ar-EG' ) + "<br>";
result += number.toLocaleString( 'ja-JP', {
style : 'currency',
currency : 'JPY',
currencyDisplay : 'symbol',
useGrouping : true
} ) + "<br>";
result += number.toLocaleString( [ 'jav', 'en' ], {
localeMatcher : 'lookup',
style : 'decimal',
minimumIntegerDigits : 2,
minimumFractionDigits : 2,
maximumFractionDigits : 3,
minimumSignificantDigits : 2,
maximumSignificantDigits : 3
} ) + "<br>";
var el = document.getElementById( 'result' );
el.innerHTML = result;
<div id="result"></div>
编辑:评注@I像Serena添加以下:
要支持我们仍需要英语格式的非英语语言环境的浏览器,请使用
value.toLocaleString('en')
. 也适用于浮点。
根据 ECMAScript2018 更改使用后视支持进行更新。
为了向后兼容,请进一步向下滚动以查看原始解决方案。
可以使用正则表达式 - 在处理存储为字符串的大数字时特别有用。
const format = num =>
String(num).replace(/(?<!\..*)(\d)(?=(?:\d{3})+(?:\.|$))/g, '$1,')
;[
format(100), // "100"
format(1000), // "1,000"
format(1e10), // "10,000,000,000"
format(1000.001001), // "1,000.001001"
format('100000000000000.001001001001') // "100,000,000,000,000.001001001001
]
.forEach(n => console.log(n))
此原始答案可能不是必需的,但可用于向后兼容。
尝试使用单个正则表达式(没有回调)处理这个问题,我目前的能力使我失败,因为在 Javascript 中缺乏负面的后视……这里是另一个适用于大多数一般情况的简洁替代方案 - 考虑任何小数点通过忽略匹配项索引出现在句点索引之后的匹配项。
const format = num => {
const n = String(num),
p = n.indexOf('.')
return n.replace(
/\d(?=(?:\d{3})+(?:\.|$))/g,
(m, i) => p < 0 || i < p ? `${m},` : m
)
}
;[
format(100), // "100"
format(1000), // "1,000"
format(1e10), // "10,000,000,000"
format(1000.001001), // "1,000.001001"
format('100000000000000.001001001001') // "100,000,000,000,000.001001001001
]
.forEach(n => console.log(n))
有一个不错的 jQuery 数字插件:https : //github.com/teamdf/jquery-number
它允许您以您喜欢的格式更改任何数字,并提供十进制数字和十进制和千位分隔符的选项:
$.number(12345.4556, 2); // -> 12,345.46
$.number(12345.4556, 3, ',', ' ') // -> 12 345,456
您可以直接在输入字段中使用它,这更好,使用与上面相同的选项:
$("input").number(true, 2);
或者您可以使用选择器应用于一整套 DOM 元素:
$('span.number').number(true, 2);
我用这个:
function numberWithCommas(number) {
return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
来源:链接