Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我们将数字格式化为US格式时,如何将两个正则表达式合并为一个正则表达式_Javascript_Regex_Typescript - Fatal编程技术网

Javascript 当我们将数字格式化为US格式时,如何将两个正则表达式合并为一个正则表达式

Javascript 当我们将数字格式化为US格式时,如何将两个正则表达式合并为一个正则表达式,javascript,regex,typescript,Javascript,Regex,Typescript,我想将两个正则表达式合并为一个正则表达式,但我不知道在我的例子中如何实现。 所以,我想做下一件事:将该格式编号转换为US格式,只需为1000添加逗号,如1000等等。(我知道tolocalString('en-US')和Intl.NumberFormat.prototype.format,但这些不适合我的情况)。 对于使用正则表达式进行操作,我尝试了以下表达式:/\d(?=(\d{3})+\)/g,它工作得很好,但是只有当我们的数字包含点时(例如1000.23),但如果没有点,当前正则表达式将无

我想将两个正则表达式合并为一个正则表达式,但我不知道在我的例子中如何实现。 所以,我想做下一件事:将该格式编号转换为US格式,只需为1000添加逗号,如1000等等。(我知道
tolocalString('en-US')
Intl.NumberFormat.prototype.format
,但这些不适合我的情况)。 对于使用正则表达式进行操作,我尝试了以下表达式:
/\d(?=(\d{3})+\)/g
,它工作得很好,但是只有当我们的数字包含点时(例如
1000.23
),但如果没有点,当前正则表达式将无法工作。 (证据:)

还有另一个正则表达式,我必须使我的函数正常工作:
/\d(?=(\d{3})+$)/g
,但它只有在我们没有点的时候才能正常工作。如果我们有点,它将用逗号替换浮点或小数部分,这不是符合我要求的正确行为。(对于1000.12345678,我的号码类似于“1000.12345678”)。但如果没有数字上的点,一切都会很好。 (证据:)

因此,对于我的情况,我创建了一个函数来检查: 如果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, '$&,')
}
我的主要问题是——在我的例子中,如何将两个正则表达式组合在一起,从而避免不必要的点检查等等。 提前感谢。

因为只有(?=…)后跟表达式,而前面没有“-可以反转字符串以正确使用”后跟“,如下所示:

const num='1234567890.12345';
const result=[…[…num]//销毁字符串
.reverse().join(“”)//反转原始字符串
.replace(/(?:\d+\)?(\d{3}(?=\d))/g,'$&')]
.reverse().join(“”);//将结果恢复正常

控制台日志(结果)Regexp,但它可以工作)


原始答案:

检查下一个正则表达式
(?:(?Try
(\d)(\d{3})(\.\d+)
。你可以在正则表达式中使用
,它起到布尔函数的作用,或者你需要可变长度的数字吗?@难以忍受的亮度对大数字不起作用:是的,因此我问你是否需要可变长度的数字。
const num = '1234567890.123456';
const result  = num.replace(new RegExp('\\B(?=(\\d{3})+'+(~num.indexOf('.')?'\\.':'$')+')','g'),',');

console.log(result);