梳理思路

要先明白的是,我们将要转换成的数字格式是这样:从个位往左数起,每三位前插入一个千位分隔符,,即可以想象成我们要把每三位数字前面的那个空""匹配出来,并替换成千位分隔符,。每个千位分隔符后面的数字个数是3个或3的倍数个。

代码书写

创建一个正则表达式字面量,并加上全局匹配修饰符g。var reg = //g; W3C对全局匹配的解释是:查找所有匹配而非在找到第一个匹配后停止。

因为需要从右往左匹配,所以表示结尾的$是必须要有的。三位数字用\d{3}来表示,由于我们不知道究竟有多少组这样的三位数字,所以需要在\d{3}后面加上+,来表示匹配任何包含至少一组三位数字的字符串。至目前,/(\d{3})+$/g表示作为结尾的3个或3的倍数个数字。

由于要替换的是每三位数(从末尾起)紧前面的那个"",所以需要用到正向预查,即?=n(匹配任何其后紧接指定字符串 n 的字符串)。正向预查咋用呢?这里先举个例子:有一个字符串var str = "abaaaaa";,我们想把后面跟着字符b的字符a表示出来,于是正则表达式写法:var reg = /a(?=b)/g;,匹配的是后面紧跟着字符b的字符a,字符串str中只有一个符合条件的a,最后查看匹配结果为["a"]。这个例子的代码如下:

var str = "abaaaaa",
reg = /a(?=b)/g;
console.log(str.match(reg));
复制代码

粗略了解正向预查之后,回到原来的案例,我们可以写成/(?=(\d{3})+$)/g;,为什么(?=...)前面什么也不写呀?因为我们要找的是那些后面紧跟着三位数字的""呀,空当然什么都不用写了。 我们来检验一下,是不是匹配出来三个""

var str = "10000000000",
reg = /(?=(\d{3})+$)/g;
console.log(str.match(reg));
复制代码

结果如下,果然是三个""

下面我们对这三个空进行替换:

var str = "10000000000",
reg = /(?=(\d{3})+$)/g;
console.log(str.replace(reg, ","));
复制代码

结果如下,转换成功。

但是,还没完…… 现在是十一位数字,如果再加一个0,凑够十二位数呢,它可是3的倍数,我们试验一下:

var str = "100000000000",
reg = /(?=(\d{3})+$)/g;
console.log(str.replace(reg, ","));
复制代码

结果变成了这样:

这串数字最前面也被添加了一个, 。这个原因就不解释了,你们应该明白为什么。那么怎么解决呢?我们对代码进行一下完善,在\d前面加一个非单词边界\B,用来表示所匹配的这个空后面不能是一个单词边界,这样就可以把最前面的这个,去掉了。 最终的代码如下

var str = "100000000000",
reg = /(?=(\B\d{3})+$)/g;
console.log(str.replace(reg, ","));
复制代码

总结

综上,”把一串整数转换成千位分隔形式“这个案例就说完了。我再把这个案例用到的一些知识点梳理一下。

  • g是表示全局匹配的修饰符,全局匹配指查找所有匹配而非在找到第一个匹配后停止。
  • $是表示结尾的量词,如n$,匹配的是任何以n为结尾的字符串。
  • \d是查找数字的元字符。
  • n{X}是匹配包含 X 个 n 的序列的字符串的量词。
  • n+是匹配任何包含至少一个 n 的字符串的量词。
  • ?=n正向预查,用于匹配任何其后紧接指定字符串 n 的字符串。
  • match() String对象的方法,作用是找到一个或多个正则表达式的匹配。
  • replace()String对象的方法,作用是替换与正则表达式匹配的子串。
  • \B是表示匹配非单词边界的元字符,与其互为补集的元字符是\b,表示匹配单词边界。

作者:TONGZ
链接:https://juejin.im/post/5abb5b01f265da237f1e5a92
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

把一串数字表示成千位分隔形式——JS正则表达式的应用的更多相关文章

  1. 把一串数字表示成千位分隔形式——toLocaleString()

    听说你用什么正则?我这有个骚操作了解下.. toLocaleString() 方法可把一个 Number 对象转换为本地格式的字符串. ().toLocaleString('en-US') " ...

  2. js实现千位分隔

    最近一个项目中使用到了千位分隔这个功能,在网上也看见一些例子,但是实现起来总觉有些复杂.因此,自己实现了一个千位分隔,留给后来的我们. 先上源码吧. 该方法支持传入的是一个数字字符串,数字.第二个参数 ...

  3. 电子科大POJ "整数的千位分隔"

    整数的千位分隔 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) C-source ...

  4. js格式化数字 金额按千位逗号分隔

    // 返回数字 function removeFormatMoney(s) { return parseFloat(s.replace(/[^\d\.-]/g, "")); } / ...

  5. 千位分隔符的JS实现

    $.extend({ //千位分割符 MoneySeparator: function numFormat(num){ if(num==null){ return num; }else { num=n ...

  6. JS将数字转换成三位逗号分隔的样式

    function formatNum(num) { if(!/^(\+|-)?(\d+)(\.\d+)?$/.test(num)){alert("wrong!"); return ...

  7. javaScript 时间转换,将后台返回的时间为一串数字转成正常格式

    js完整代码: function transferTime(cTime){ var jsonDate = new Date(parseInt(cTime)); Date.prototype.forma ...

  8. javascript 正则(将数字转化为三位分隔的样式)

    '12345678912345678'.replace(/\B(?=(?:\d{3})+\b)/g, ',') 解释: \b : 匹配单词边界,就是位于字符\w([a-zA-Z0-9_])和\W[^a ...

  9. javascript 正则(将数字转化为三位分隔的样式)【转】

    原文:https://www.cnblogs.com/sivkun/p/7123963.html })+\b)/g, ',') 解释: \b : 匹配单词边界,就是位于字符\w([a-zA-Z0-9_ ...

随机推荐

  1. mysql杂谈

    本文主要记录一些零碎知识点 1.mysql默认存储引擎变更InnoDB as Default Storage Engine从mysql-5.5.5开始,InnoDB作为默认存储引擎,InnoDB作为支 ...

  2. CloudStack学习-3

    此次试验主要是CloudStack结合openvswitch 背景介绍 之所以引入openswitch,是因为如果按照之前的方式,一个网桥占用一个vlan,假如一个zone有20个vlan,那么岂不是 ...

  3. Redis Cluster 4.0高可用集群安装、在线迁移操作记录

    之前介绍了redis cluster的结构及高可用集群部署过程,今天这里简单说下redis集群的迁移.由于之前的redis cluster集群环境部署的服务器性能有限,需要迁移到高配置的服务器上.考虑 ...

  4. VMware下ubuntu与Windows实现文件共享的方法 (转)

    最近安装caffe需要将Windows下文件拷贝到ubuntu16.04下,就进行了共享文件夹的设置,期间遇到一些困难,记录下来,方便以后遇到此类问题不再困惑. (记录只为更好的分享) 言归正传: 1 ...

  5. 关键字:this、ref、out

    Class1.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...

  6. 黄聪:wordpress如何携带cookie模拟浏览器访问网站

    $args = array( 'user-agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, li ...

  7. ALGO-157_蓝桥杯_算法训练_阶乘末尾(高精度)

    问题描述 给定n和len,输出n!末尾len位. 输入格式 一行两个正整数n和len. 输出格式 一行一个字符串,表示答案.长度不足用前置零补全. 样例输入 样例输出 数据规模和约定 n<=, ...

  8. 【Guava 】Collections – Join and Split

    Convert Collections to String Using Joiner Convert List into String Using Joiner @Test public void w ...

  9. Dubbo(1)简介和Zookeeper安装

    一.简介: Dubbo主页地址  http://dubbo.io/ Dubbo百度百科:https://baike.baidu.com/item/Dubbo/18907815?fr=aladdin 二 ...

  10. spring4.0之八:Groovy DSL

    4.0的一个重要特征就是完全支持Groovy,Groovy是Spring主导的一门基于JVM的脚本语言(动态语言).在spring 2.x,脚本语言通过 Java scripting engine在S ...