ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

正则实现数字的千位分隔符表示法

2021-08-25 10:31:23  阅读:152  来源: 互联网

标签:regex console 千位 replace 表示法 123 result 分隔符 var


原文链接: https://www.cnblogs.com/yalong/p/15183715.html

比如把 12345678,变成 12,345,678
可见是需要把相应的位置替换成 ,

方法一

先弄出最后一个逗号

使用 (?=\d{3}$)就可以做到:

var result = "12345678".replace(/(?=\d{3}$)/g, ',')
console.log(result);
  // => "12345,678"

其中(?=\d{3}$) 匹配 \d{3}$ 前面的位置。而 \d{3}$ 匹配的是目标字符串最后那 3 位数字。

弄出所有的逗号

因为逗号出现的位置,要求后面 3 个数字一组,也就是 \d{3} 至少出现一次。 此时可以使用量词 +:

var result = "12345678".replace(/(?=(\d{3})+$)/g, ',')
console.log(result);
// => "12,345,678"

写完正则后,要多验证几个案例,此时我们会发现问题:

 var result = "123456789".replace(/(?=(\d{3})+$)/g, ',')
 console.log(result);
 // => ",123,456,789"

因为上面的正则,仅仅表示把从结尾向前数,一但是 3的倍数,就把其前面的位置替换成逗号。
因此才会出 现这个问题。
怎么解决呢?
我们要求匹配的到这个位置不能是开头。
我们知道匹配开头可以使用 ^,但要求这个位置不是开头怎么办?
(?!^) 就可以实现

  var regex = /(?!^)(?=(\d{3})+$)/g;
  var result = "12345678".replace(regex, ',')
  console.log(result);
  // => "12,345,678"
  result = "123456789".replace(regex, ',');
  console.log(result);
  // => "123,456,789"

那如果要支持带小数点的数呢,比如 123456.12 转成 123,456.12
只需稍作处理即可,如下:

var regex = /(?!^)(?=(\d{3})+(\.|$))/g;
"123456.12".replace(regex, ','); // "123,456.12"

就只是加个限制 ?=(\d{3})+ 的后面是结束符 或者点号
验证如下:

var regex = /(?!^)(?=(\d{3})+(\.|$))/g;
"123456.12".replace(regex, ','); // "123,456.12"
"123456".replace(regex, ','); // "123,456"

方法二

先看代码:

'12345.12'.replace(/\d{1,3}(?=(\d{3})+(\.|$))/g, '$&,'); // "12,345.12"
'312345.12'.replace(/\d{1,3}(?=(\d{3})+(\.|$))/g, '$&,'); // "312,345.12"
'312345'.replace(/\d{1,3}(?=(\d{3})+(\.|$))/g, '$&,'); // "312,345"

实现思路拆解

  • \d{1,3} 代表1到三位的数字,
  • (?=(\d{3})+(\.|$)) 是三位数字并且后面是点号或者结束的字符串
  • $& 是匹配到的子串
  • '$&,'就是吧匹配到的子串加个逗号

标签:regex,console,千位,replace,表示法,123,result,分隔符,var
来源: https://www.cnblogs.com/yalong/p/15183715.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有