将字符串数字格式化为货币
Format string number as currency
我想要一个掩码函数来格式化数字(作为字符串),就像很多掩码插件一样。
期望的行为:
format('1') // '0,01'
format('12') // '0,12'
format('123') // '1,23'
format('12345678') // '123.456,78'
如果格式化程序仅使用正则表达式函数实现此功能会更好。
[编辑]
A 在 Whosebug 中搜索了很多问题,但大多数答案都是在字符串末尾添加两个小数点。这不是我所期望的。
预期:
format('1') // '0,01'
format('123') // '1,23'
预计不会:
format('1') // '1,00'
format('123') // '123,00'
这是一个两步解决方案:使用
将数字分为 3 位以上数字和 1-2 位数字
^(?:(\d+)(\d{2})|(\d{1,2}))$
因此,大于 1 的数字将在第 1 组中保留其整数部分,在第 2 组中保留小数部分,而第 3 组将包含所有小于 0 的小数。
然后,我们检查我们得到的数字,只在整数部分加上千位分隔符
.replace(/(\d)(?=(\d{3})+(?!\d))/g, ".")
查看 JS 演示:
function format(s) {
var re = /^(?:(\d+)(\d{2})|(\d{1,2}))$/;
if ((m = s.match(re)) !== null) {
if (m[3]) { // We have 1 or 2 digit number
return m[3].length == 1 ?
"0,0" + m[3] : "0," + m[3];
} else { // We have a longer number
return m[1].replace(/(\d)(?=(\d{3})+(?!\d))/g, ".") + "," + m[2];
}
}
}
document.body.innerHTML = format('1') + "<br/>"; // '0,01'
document.body.innerHTML += format('12') + "<br/>"; // '0,12'
document.body.innerHTML += format('123') + "<br/>"; // '1,23'
document.body.innerHTML += format('12345678') + "<br/>"; // '123.456,78'
实际上,您可以添加千位和小数分隔符作为函数参数:
function format(str, thd, dec) {
var re = /^(?:(\d+)(\d{2})|(\d{1,2}))$/;
if ((m = str.match(re)) !== null) {
if (m[3]) { // We have 1 or 2 digit number
return m[3].length == 1 ?
"0" + dec + "0" + m[3] : "0" + dec + m[3];
} else { // We have a longer number
return m[1].replace(/(\d)(?=(\d{3})+(?!\d))/g, "" + thd) + dec + m[2];
}
}
}
var thd = "."; // Thousand separator
var dec = ","; // Decimal separator
document.body.innerHTML = format('1', thd, dec) + "<br/>"; // '0,01'
document.body.innerHTML += format('12', thd, dec) + "<br/>"; // '0,12'
document.body.innerHTML += format('123', thd, dec) + "<br/>"; // '1,23'
document.body.innerHTML += format('12345678', thd, dec) + "<br/>"; // '123.456,78'
我想要一个掩码函数来格式化数字(作为字符串),就像很多掩码插件一样。
期望的行为:
format('1') // '0,01'
format('12') // '0,12'
format('123') // '1,23'
format('12345678') // '123.456,78'
如果格式化程序仅使用正则表达式函数实现此功能会更好。
[编辑]
A 在 Whosebug 中搜索了很多问题,但大多数答案都是在字符串末尾添加两个小数点。这不是我所期望的。
预期:
format('1') // '0,01'
format('123') // '1,23'
预计不会:
format('1') // '1,00'
format('123') // '123,00'
这是一个两步解决方案:使用
将数字分为 3 位以上数字和 1-2 位数字^(?:(\d+)(\d{2})|(\d{1,2}))$
因此,大于 1 的数字将在第 1 组中保留其整数部分,在第 2 组中保留小数部分,而第 3 组将包含所有小于 0 的小数。
然后,我们检查我们得到的数字,只在整数部分加上千位分隔符
.replace(/(\d)(?=(\d{3})+(?!\d))/g, ".")
查看 JS 演示:
function format(s) {
var re = /^(?:(\d+)(\d{2})|(\d{1,2}))$/;
if ((m = s.match(re)) !== null) {
if (m[3]) { // We have 1 or 2 digit number
return m[3].length == 1 ?
"0,0" + m[3] : "0," + m[3];
} else { // We have a longer number
return m[1].replace(/(\d)(?=(\d{3})+(?!\d))/g, ".") + "," + m[2];
}
}
}
document.body.innerHTML = format('1') + "<br/>"; // '0,01'
document.body.innerHTML += format('12') + "<br/>"; // '0,12'
document.body.innerHTML += format('123') + "<br/>"; // '1,23'
document.body.innerHTML += format('12345678') + "<br/>"; // '123.456,78'
实际上,您可以添加千位和小数分隔符作为函数参数:
function format(str, thd, dec) {
var re = /^(?:(\d+)(\d{2})|(\d{1,2}))$/;
if ((m = str.match(re)) !== null) {
if (m[3]) { // We have 1 or 2 digit number
return m[3].length == 1 ?
"0" + dec + "0" + m[3] : "0" + dec + m[3];
} else { // We have a longer number
return m[1].replace(/(\d)(?=(\d{3})+(?!\d))/g, "" + thd) + dec + m[2];
}
}
}
var thd = "."; // Thousand separator
var dec = ","; // Decimal separator
document.body.innerHTML = format('1', thd, dec) + "<br/>"; // '0,01'
document.body.innerHTML += format('12', thd, dec) + "<br/>"; // '0,12'
document.body.innerHTML += format('123', thd, dec) + "<br/>"; // '1,23'
document.body.innerHTML += format('12345678', thd, dec) + "<br/>"; // '123.456,78'