千分位分隔数字并自定义保留小数位数

功能:可实现不同符号分隔数字,可自定义分隔后数字保留的小数位数。
实现思路

    使用正则,用数字中的小数点做匹配尾部参考,来匹配某个数字后面的一个或多个连续3位数字,如果匹配到把该数字替换成自身加分隔符,如下:

  • 示例

1、 分隔数字:123456.1

解释:3和.之间有一个连续3位数字(456),那么给3后面添加一个分隔符得到结果:123,456.1。

2、分隔数字:1234567.1

解释: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;
}
难点解惑
  • 1、也许有人会问,这里是用“.”号做参考进行匹配的,如果传进来的数字是一个整数呢,不就没“.”号了吗,所以在方法内部定义了m变量使其在操作过程中总能有个“.”号。
  • 2、num=m==0?num.toFixed(m)+'.':hasDot?(n?num.toFixed(n):num):num.toFixed(m);
num=m==0?num.toFixed(m)+'.':hasDot?(n?num.toFixed(n):num):num.toFixed(m);

作用:这里的操作保证的是小数传n、小数不传n、整数传n、整数不传n四种情况都能正确返回小数位数
详解:
1、如果m为零(传入n=0)则直接经toFixed操作后再后面补“.”
2、如果m不为0,
    a、如果传入数为小数
        a'、如果传了n表示要保留小数,那么需要num.toFixed(n)
        b'、如果没传n表示不需要对小数进行操作,直接返回原num
    b、如果传入数为整数
        a'、直接对num进行toFixed(m)操作

说明:该方法只适用于常用数字的操作,当数字超过一定位数时产生的精度问题这里暂不做处理

自己写的方法,如果有什么不足之处欢迎指出交流,这里的replace方法可参考我的 另一篇文章
补充:更简单的原生方法

number类型可调用toLocalString()方法把他转成本地语言环境格式显示,经测试是可行的,但不需要携带参数,因为这些参数还是具有一定兼容性问题的,直接可以像下面使用,具体参见MDN

var number=1234567891.23;
console.log(number.toLocaleString());//1,234,567,891.23
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值