1

我想要一个掩码函数来格式化数字(作为字符串),就像很多掩码插件一样。

期望的行为:

format('1') // '0,01'
format('12') // '0,12'
format('123') // '1,23'
format('12345678') // '123.456,78'

如果格式化程序仅使用正则表达式函数来实现这一点会更好。

[编辑]

A 在 stackoverflow 中搜索了很多问题,但大多数答案包括在字符串末尾添加两个小数。这不是我所期望的。

预期的:

format('1') // '0,01'
format('123') // '1,23'

未预期:

format('1') // '1,00'
format('123') // '123,00'
4

1 回答 1

1

这是一个两步解决方案:将数字排序为 3+ 位数字和 1-2 位数字

^(?:(\d+)(\d{2})|(\d{1,2}))$

查看正则表达式演示

因此,大于 1 的数字将在第 1 组中具有整数部分,在第 2 组中具有小数部分,第 3 组将包含所有小于 0 的小数部分。

然后,我们检查我们得到的数字,只在整数部分加上千位分隔符

.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1.")

查看 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, "$1.") + "," + 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, "$1" + 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'

于 2016-03-09T20:43:29.647 回答