当我们将数字格式化为美国格式时,如何将两个正则表达式合而为一

时间:2018-08-15 18:33:09

标签: javascript regex typescript

我想将两个正则表达式合二为一,但是我不知道该如何做。 因此,我想做下一件事情:将格式编号转换为美国格式,只需将逗号添加为1000,例如 1,000 等。 (我了解toLocaleString('en-US')Intl.NumberFormat.prototype.format,但这些都不适合我的情况)。 为此,我使用正则表达式尝试了以下表达式:/\d(?=(\d{3})+\.)/g,它很好用,但如果我们的电话号码包含 点仅 > (例如1000.23),但是如果没有 ,则当前的正则表达式将无法正常工作。 (证明: https://regex101.com/r/93O0gJ/1

还有一个正则表达式,我必须使我的功能正常工作:/\d(?=(\d{3})+$)/g,但是只有当我们 根本没有点 时,它才能正常工作。如果我们有点,它将用逗号替换 float或小数部分,这不是我所要求的正确行为。 (我的电话号码类似于1000.12345678 的“ 1000.12,345,678”)。但是,如果没有点号,则一切正常。 (证明:https://regex101.com/r/BHikK7/1

因此,对于我来说,我创建了一个检查以下功能的函数: 如果 number 有点,则使用第一个正则表达式;如果没有,则使用第二个:

const formatNumberToUSFormat = (numberToFormat: number):string => {
  const stringNumber = numberToFormat.toString()

  return stringNumber.match(/\./g) ?
    stringNumber.replace(/\d(?=(\d{3})+\.)/g, '$&,') : 
    stringNumber.replace(/\d(?=(\d{3})+$)/g, '$&,')
}

我的主要问题-在我的情况下,如何将两个正则表达式合并为一个,从而避免不必要地检查点等。 预先感谢。

3 个答案:

答案 0 :(得分:3)

由于只有(?= ...)'followed by'表达式而没有'preced by'-您可以反转字符串以正确使用'followed by',如下所示:

const num = '1234567890.12345';
const result = [...[...num] // destructing the string
  .reverse().join('') // reversing the original string
  .replace(/(?:\d+\.)?(\d{3}(?=\d))/g,'$&,')]
  .reverse().join(''); // reversing the result back to normal
console.log(result);

但是这种方法从最佳角度来说是绝妙的!
如果您要处理大量数据,请不要使用它!

答案 1 :(得分:1)

来自地狱的正则表达式,但有效)))

const num = '1234567890.123456';
const result  = num.replace(new RegExp('\\B(?=(\\d{3})+'+(~num.indexOf('.')?'\\.':'$')+')','g'),',');

console.log(result);

原始答案:https://stackoverflow.com/a/46371080/6776408

答案 2 :(得分:0)

检查下一个正则表达式(?:(?<=^|[^\d.])(\d{1,3})(?=(?:\d{3})+(?:\D|$))|\G)(\d{3})

要在线尝试正则表达式并获取说明,请单击here