Javascript中是否有用于格式化数字和字符串的函数?
我正在寻找一种方法来为字符串或数字添加千位分隔符...(类似于C#中的String.Format)
Javascript中是否有用于格式化数字和字符串的函数?
我正在寻找一种方法来为字符串或数字添加千位分隔符...(类似于C#中的String.Format)
原始答案中引用的参考文献是错误的。实际上有一个内置函数可以实现此功能,正如kaiser在下面所建议的一样:toLocaleString
因此,您可以这样做:
(1234567.89).toLocaleString('en') // for numeric input
parseFloat("1234567.89").toLocaleString('en') // for string input
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,''))
(1234567).toLocaleString().replace(/,/g," ",)
将千位间隔转化为空格。 - Fanky如果涉及到本地化千位分隔符、分隔符和小数点分隔符,请按照以下方式进行:
// --> 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>
在MDN信息页面上查看详细信息。
编辑:评论者@I like Serena 补充如下内容:
为了支持非英语环境的浏览器,但仍想使用英语格式,请使用
value.toLocaleString('en')
。 对于浮点数也适用。
Number(yourNumberOrString).toLocaleString()
。 - Jonathanvalue.toLocaleString('en')
。对于浮点数也适用。 - Klaas van Aarsen7,77,77,777
,可以使用value.toLocaleString('en-IN')
。 - Makesh根据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);
var number = 35002343;
console.log(number.toLocaleString());
您可以在此处查看参考信息:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString
function numberWithCommas(number) {
return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
source: link
// thousand separates a digit-only string using commas
// by element: onkeyup = "ThousandSeparate(this)"
// by ID: onkeyup = "ThousandSeparate('txt1','lbl1')"
function ThousandSeparate()
{
if (arguments.length == 1)
{
var V = arguments[0].value;
V = V.replace(/,/g,'');
var R = new RegExp('(-?[0-9]+)([0-9]{3})');
while(R.test(V))
{
V = V.replace(R, '$1,$2');
}
arguments[0].value = V;
}
else if ( arguments.length == 2)
{
var V = document.getElementById(arguments[0]).value;
var R = new RegExp('(-?[0-9]+)([0-9]{3})');
while(R.test(V))
{
V = V.replace(R, '$1,$2');
}
document.getElementById(arguments[1]).innerHTML = V;
}
else return false;
}
这是JavaScript代码:
<script >
function FormatCurrency(ctrl) {
//Check if arrow keys are pressed - we want to allow navigation around textbox using arrow keys
if (event.keyCode == 37 || event.keyCode == 38 || event.keyCode == 39 || event.keyCode == 40) {
return;
}
var val = ctrl.value;
val = val.replace(/,/g, "")
ctrl.value = "";
val += '';
x = val.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');
}
ctrl.value = x1 + x2;
}
function CheckNumeric() {
return event.keyCode >= 48 && event.keyCode <= 57 || event.keyCode == 46;
}
</script>
HTML
<input type="text" onkeypress="return CheckNumeric()" onkeyup="FormatCurrency(this)" />
number = 123456.7089;
result = parseInt( number ).toLocaleString() + "<br>";
result = number.toLocaleString( 'pt-BR' ) + "<br>";
var el = document.getElementById( 'result' );
el.innerHTML = result;
<div id="result"></div>
您只需要真正做的就是这个:
123000.9123.toLocaleString()
//result will be "123,000.912"
toLocaleString()
,它不会添加逗号,或者缺少标准中的其他功能。检查toLocaleString
是否存在很容易,但检查其是否符合标准却不容易。 - hippietrail