功能:可实现不一样符号分隔数字,可自定义分隔后数字保留的小数位数。
使用正则,用数字中的小数点作匹配尾部参考,来匹配某个数字后面的一个或多个连续3位数字,若是匹配到把该数字替换成自身加分隔符,以下:javascript
一、 分隔数字:123456.1java
解释:3和.之间有一个连续3位数字(456),那么给3后面添加一个分隔符获得结果:123,456.1。正则表达式
二、分隔数字:1234567.1post
解释:1和.之间有两个连续3位数字(234和567),那么给1后面添加一个分隔符,而后数字4后面也存在一个连续三位数字(567),那么也给4后面添加一个分隔符,最终获得结果1,234,567.1测试
/(\d)(?=(\d{3})+\.)/g; 这里最难理解的就是(?=(\d{3})+\.),且看语法: x(?=y):正向确定查找,匹配后面带有y的x项目 那么在这里意思是:查找一个和“.”之间带有一个或多个连续3位数字的数字(x)
/** *num 要分隔的数字(必填) *n 保留的小数位数(可选) *symbol 分隔数字使用的符号(可选,默认为",") */ function splitNum(num,n,symbol) { if(!num)throw new Error('splitNum须要传入一个待转换的数据'); if(typeof num!=='number')throw new TypeError('num参数应该是一个number类型'); if(n<0)throw new Error('参数n不该该小于0'); var hasDot=parseInt(num)!=num;//这里检测num是否为小数,true表示小数 var m=(n!=undefined&&n!=null)?n:1; num=m==0?num.toFixed(m)+'.':hasDot?(n?num.toFixed(n):num):num.toFixed(m); symbol=symbol||','; num=num.toString().replace(/(\d)(?=(\d{3})+\.)/g,function(match, p1,p2) { return p1 + symbol; }); if(n==0||(!hasDot&&!n)){//若是n为0或者传入的num是整数而且没有指定整数的保留位数,则去掉前面操做中的小数位 num=num.substring(0,num.indexOf('.')); } return num; }
难点解惑
num=m==0?num.toFixed(m)+'.':hasDot?(n?num.toFixed(n):num):num.toFixed(m); 做用:这里的操做保证的是小数传n、小数不传n、整数传n、整数不传n四种状况都能正确返回小数位数 详解: 一、若是m为零(传入n=0)则直接经toFixed操做后再后面补“.” 二、若是m不为0, a、若是传入数为小数 a'、若是传了n表示要保留小数,那么须要num.toFixed(n) b'、若是没传n表示不须要对小数进行操做,直接返回原num b、若是传入数为整数 a'、直接对num进行toFixed(m)操做
说明:该方法只适用于经常使用数字的操做,当数字超过必定位数时产生的精度问题这里暂不作处理code
本身写的方法,若是有什么不足之处欢迎指出交流,这里的replace方法可参考个人 另外一篇文章
number类型可调用toLocalString()方法把他转成本地语言环境格式显示,经测试是可行的,但不须要携带参数,由于这些参数仍是具备必定兼容性问题的,直接能够像下面使用,具体参见MDN:ip
var number=1234567891.23; console.log(number.toLocaleString());//1,234,567,891.23