把一串数字表示成千位分隔形式——JS正则表达式的应用

梳理思路

要先明白的是,我们将要转换成的数字格式是这样:从个位往左数起,每三位前插入一个千位分隔符,,即可以想象成我们要把每三位数字前面的那个空""匹配出来,并替换成千位分隔符,。每个千位分隔符后面的数字个数是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
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/lzcblog/p/9977994.html

时间: 2024-10-25 20:52:03

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

js实现千位分隔

最近一个项目中使用到了千位分隔这个功能,在网上也看见一些例子,但是实现起来总觉有些复杂.因此,自己实现了一个千位分隔,留给后来的我们. 先上源码吧. 该方法支持传入的是一个数字字符串,数字.第二个参数为保留小数的位数,默认保留两位小数: function splitThousands(num, fixed) { var reg = /\B(?=(\d{3})+$)/g; num = num.toString().split("."); num[1] = num[1] ? num[1].

c# 数字转成千分位字符串

首先要明确带了逗号之后  数字就变成字符串了 ,不再是数字了. 昨天做项目的时候需要格式化数字变成带逗号的,本来打算自己写个方法的,后来时间太紧了,就打算从网上查个,查来查去都是要对字符串的位进行操作,选了其中一个用了下,结果发现还有问题,瞬间无语 最中被我百度到了  这种写法   : C#中用最简单的方法把数字(不含小数)转换为千分位格式: 如1234567变成1,234,567 方法:x.ToString("###,###")   或  1234567.ToString("

input组件中数字转成千分位的策略

在Web前端开发中input组件若只限制数字输入,并且希望将这些数字按照千分位隔开的话,那么我们可以通过一个js方法来实现,如下所示: toThousandsFormat(number) { if (number) { return '' } if (num.toString().trim() == '') { return '' } if (isNaN(number)) { return '' } number = parseFloat(number.toString().replace(/[

数字规定时间内由0变大到一定数值,并千位分隔输出

<!DOCTYPE HTML> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <title>数字动态效果</title> <style type="text/css"> .MJHmain .MJHsimpleInfo {  padding: 78px 0;  text-align: center;   colo

数字显示千分位,将数字转换成千分位形式(用逗号隔开)

<script> var weekValue=10000000; if(weekValue!=0){ weekValue = addThousands(weekValue); console.log(weekValue); } function addThousands(number) { if(number==0){ return number; }else if(number==0.0){ return number; } var num = number + "";

java 有千位分隔逗号的数字格式化输出 数字前补0输出

System.out.printf("%,5d %,6.1f\n", 312342, 3155623.932);输出:312,342 3,155,623.9 System.out.printf("%05d %06.1f\n", 32, 32.32);输出:00032 0032.3

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

js完整代码: function transferTime(cTime){ var jsonDate = new Date(parseInt(cTime)); Date.prototype.format = function (format){ var o = { "y+": this.getFullYear(), "M+": this.getMonth()+1, "d+": this.getDate(), "h+": thi

一串数字中有两个只出现一次的数字其余都是成对相同,求这两个数

当然如果这个问题是只有一个不同的数,其他数字成对相同,那么就是把所有数字异或就得出这个数了 这次是有两个只出现一次的数字,其他数字都成对相同 1)先把所有数都异或得到数t 2)算出t的二进制第一个1的位置flag 3)将所有数根据二进制flag位置是否为1分成两组b1[],b2[] (此时每组数字的个数一定是奇数) 4)将b1组异或得到ans1,将b2组异或得到ans2 #include<iostream> #include<stdio.h> using namespace std

千位分组来格式化数字函数

1.number_format(number,decimals,decimalpoint,separator)函数通过千位分组来格式化数字.decimals:取得小数点位数decimalpoint:设置小数点符号separator:设置千分位的分隔符*如果遇到已经有小数点的数字,而取得的小数的位数少于原始传入的小数位数,进行四舍五入输出:例如:echo number_format("5000000",2,",",".");    5.000.00