将字符串数字格式化为货币

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}))$

regex demo

因此,大于 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'