【问题标题】:Format string number as currency [closed]将字符串数字格式化为货币[关闭]
【发布时间】:2016-03-09 19:19:30
【问题描述】:

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

期望的行为:

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'

【问题讨论】:

  • @Barmar 我的问题可能是重复的,但您的评论中给出的答案对我不起作用。输出和我提到的不一样
  • 这不是相同的掩码行为,因此它不是“相同的想法”。我还是编辑了我的问题。
  • 看起来像“除以 100”!?
  • @meck373 哦,工作:(

标签: javascript regex string-formatting money-format


【解决方案1】:

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

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

regex demo

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多