IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    js一个正则匹配数字千位分隔符的位置(支持小数)

    安昊发表于 2023-07-11 21:21:02
    love 0

    前言

    在日常业务中,常会碰到产品要求数字展示千位分隔符的需求,本着学习钻研,不做业务码农的想法,尝试着写了一个单正则并且支持小数点的添加千位分隔符的方法。

    直接上结果

    就一行代码

    thousandBitSeparator = (num) => {
      return num?.toString().replace(/(?<!\..)\B(?=(\d{3})+(\.|$))/g, ',')
    }

    看看效果
    小数点前每3位加一个分隔符,小数点后不加

    thousandBitSeparator(1) // '1'
    thousandBitSeparator(1000) // '1,000'
    thousandBitSeparator(1000222) // '1,000,222'
    thousandBitSeparator(1234.) // '1,234'
    thousandBitSeparator(1234.56) // '1,234.56'
    thousandBitSeparator(1234.5678) // '1,234.5678'

    正则解析

    先来解释一些这里用到的正则元字符

    \d 数字(不用解释)
    \B 非单词边界(不是单词边界的边界)
    a(?=b) 正向断言(匹配跟着b的a)
    (?<!b)a 反向否定断言(匹配前面不是b的a)

    再来个可视化解析

    image.png

    思路

    1. 需求是添加千位分隔符,所以首先是要匹配添加分隔符的这个边界(也就是目标位置),又由于数字不会有空格什么的中断,而且两头的位置也不符合需求,使用\B作为主表达式来匹配目标位置最合适不过了。

      /\B/g
    2. 先考虑整数的正则,什么样的位置符合要求呢?从个位开始每3位数字一个,也就是说目标位置后面一直到结尾,要恰好并且至少一组3位数字。

      /\B(?=(\d{3})+$)/g
    3. 再考虑小数的情况,小数是不需要千位分隔符的,也就是说目标位置前面没有小数点。

       /(?<!\..)\B(?=(\d{3})+$)/g
    4. 有小数点的话,个位就不一定是结尾了,所以要用小数点和结尾两种情况来识别个位在哪。

       /(?<!\..)\B(?=(\d{3})+(\.|$))/g
    5. 用来匹配数字千位分隔符位置的正则就完成啦。

    总结

    第一次写技术分享文章,还在不断学习之中,希望未来可期。如果我的文章对你有帮助那再好不过啦,帮我也点个赞吧,谢谢!欢迎同学们指正错误,一起交流啊!



沪ICP备19023445号-2号
友情链接