千位分隔符

纯整数情况

纯整数大概是所有情况里最简单的一种,我们只要正确匹配出千分位就好了。

观察上面的数字,我们可以得出千分位的特征是到字符串终止位有 3n 个数字,不包括起始位。于是可以得到这样的函数:

javascriptlet milliFormat = (num) => {

return num && num.toString().replace(/(?=(?!^)(\d{3})+$)/g, ',')

}

但是往往现实没有那么乐观:

小数的情况

遇到小数时,我们的希望只针对整数部分添加千分符,这时问题就变得稍稍有些棘手了。

如果正则引擎支持逆序环视

javascript(?<=^\d+)(?=(\d{3})+\b)

但是多数语言并不支持逆序环视,所以我们要变通一下:

1. 拿到小数的整数部分

也就是起始位到小数点(非数字)之间的部分,可以这样实现:

javascript^\d+

2. 为整数部分添加千分符

这一步可以利用我们之前的实现,整合在一起如下:

javascriptlet milliFormat = (num) => {

return num && num.toString()

.replace(/^\d+/g, (m) => m.replace(/(?=(?!^)(\d{3})+$)/g, ','))

}

这个函数对整、小数都能正确处理:

但在实际中,我们还可能传入一个整、小数混合的字符串:

整、小数混合字符串

这时我们就不能继续用字符串起终点 ^$ 来判定边界了,如果改成单词边界 \b 会发生什么呢:

哦不!连小数部分也被添上千分符了!怎样才能避开小数部分?

重新审视我们捕获整数部分所用到的正则:

javascript\b\d+

\b 的界定是 (?

javascript(^|\s)\d+

咦,多出来一个空白符?别着急,看看我们用来匹配千分位的正则:

javascript(?=(?!^)(\d{3})+$)

判断条件是非起点、到结尾有 3n 个数字的位置,现在为了去掉这多出来的一个空格,我们应将起始条件改成单词边界:

javascript(?=(?!\b)(\d{3})+$)

完整函数如下:

javascriptlet milliFormat = (input) => {

return input && input.toString()

.replace(/(^|\s)\d+/g, (m) => m.replace(/(?=(?!\b)(\d{3})+$)/g, ','))

}

酷炫!我们已经能自如应付各种数值的混合了!这是耳边幽幽飘来产品经理的声音:如果我传入含有非数字的字符串呢……

复杂字符串

在上一个例子中,我们只判断了起始边界,于是 1234ww 中的数字部分也会被捕获。为了解决这个问题,我们要加上终止界定。来看看整、小数成立的条件:

字符串中仅包含有数字 0-9 或小数点

依据这个我们可以这样做:

javascript(^|\s)\d+(?=\.?\d*($|\s))

这个正则表示匹配目标应以字符串起始位或空白符开始,紧接着是数字,数字的右边只允许继续是数字或者一个小数点、直到字符串结尾或下一个空格处。来看看它的匹配效果:

好样的!我们已经能精确匹配出正确的部分了!继续用之前的千分位模式封装:

javascriptlet milliFormat = (() => {

const DIGIT_PATTERN = /(^|\s)\d+(?=\.?\d*($|\s))/g

const MILLI_PATTERN = /(?=(?!\b)(\d{3})+$)/g

return (input) => input && input.toString()

.replace(DIGIT_PATTERN, (m) => m.replace(MILLI_PATTERN, ','))

})()

酷炫!全部都正确处理了!回家睡觉!

更复杂的世界

谢 @vc1 指出,在现实中可能还会有更加复杂的情况,如:

'1234 1234.56 $1234 $-1234 $-1234.56e+7 123...e3'

容我先去买根上吊绳……

(全文完)

参考资料

python 千位分隔符_千位分隔符的完整攻略相关推荐

  1. Python:Python语言编程软件安装的几大姿势之详细攻略

    Python:Python语言编程软件安装的几大姿势之详细攻略 目录 Python软件安装的几大姿势 Python原生安装 Python3.6安装 Python流行安装--完美搭配Pycharm

  2. 斐讯k1支持千兆吗_千兆宽带如何使用?看这里!

    千兆宽带     千兆宽带是指"从宽带接入服务提供商的宽带业务接入点BRAS到用户终端这一段链路上的信息传送速率达到千兆",那么享受千兆宽带,对硬件也是有一定的要求的.下面看一下你 ...

  3. 5gh掌上云计算认证不通过_阿里云ACP认证考试攻略、考试心得、费用及常见问题...

    阿里云ACP级认证是阿里云的专业工程师认证,云吞铺子分享ACP认证考试攻略.考试心得.考试费用及常见问题: ACP认证分类 ACP认证根据所属领域不同分为五类,即即云计算.大数据.大数据分析师.云安全 ...

  4. iwrite提交不了作业_“iWrite写作中心”使用全攻略

    原标题:"iWrite写作中心"使用全攻略 写作中心上线以后,同学和老师们的各种咨询和反馈不断飞来.其中,大家问的最多的问题就是: 学生 我听说我们学校有位老师特别厉害,怎么才能预 ...

  5. 重装上阵两个人合体机器人_重装上阵多人机甲合体攻略 机甲怎么合体

    重装上阵手游多人机甲是玩家之间合体组成的一类事物,其体积和强度远远超过单一的机甲,可在各种挑战中打出高额的收益.那么,重装上阵手游多人机甲怎么合体呢?多人机甲有什么组装技巧呢?相信这是不少玩家关心的问 ...

  6. 卷毛机器人符文_关于卷毛分享锤石天赋攻略

    在2020430卷毛分享锤石天赋攻略具体的跟着小编一起来看看原文内容吧! 卷毛分享锤石天赋攻略 好久没发英雄攻略了 今天给大家发一个锤石不同的天赋攻略:守护者虚弱主的锤石! 灵感是来自 的主锤石而来 ...

  7. python文本挖掘与分析:热剧《延禧攻略》用户评论分析

    需要用到的工具:pycharm编辑器,python3 主要用到的库:re,urllib,requests,time,BeautifulSoup,selenium,numpy,matplotlib,ji ...

  8. 侠众道武功最佳练级方案_侠众道武功选择攻略

    侠众道手游武功究竟该怎么选择呢?还不是很了解的朋友们,接下来心愿游戏小编就为你们带来了侠众道武功选择攻略,一起来看看吧. 侠众道武功选择推荐 普通攻击类武功 第一个选择,无击阵 攻击高,闪躲还行,单P ...

  9. 如何利用python在一个wen'dang'li_如何利用Python网络爬虫给自己跟朋友来一份穷游攻略!走到哪里穷到哪里的哦!...

    [一.项目背景] 穷游网提供原创实用的出境游旅行指南.攻略,旅行社区和问答交流平台,以及智能的旅行规划解决方案,同时提供签证.保险.机票.酒店预订.租车等在线增值服务.穷游"鼓励和帮助中国旅 ...

  10. 千位分隔符的完整攻略

    千位分隔符[1]是很常见的需求,但是输入文本千变万化,如何才能准确添加千分符呢? 纯整数情况 纯整数大概是所有情况里最简单的一种,我们只要正确匹配出千分位就好了. 观察上面的数字,我们可以得出千分位的 ...

最新文章

  1. 面试被问到Redis实现发布与订阅,手摸手教
  2. python字典实现关键字检索_如何实现搜索框的关键词提示功能
  3. NC16886 炮兵阵地
  4. css animation 触发,在JavaScript中触发CSS动画
  5. 如何配置Windows Live Writer发布博客园随笔
  6. 程序设计语言诞生——程序设计语言的发展历史
  7. 离散数学学习笔记 第二章 命题逻辑
  8. EMQ压力测试及系统优化(单机11万并发连接)
  9. 什么pdf转换成word转换器在线好
  10. 前端代码 (html css JavaScript DOM JSON)
  11. Windows 7x64 Ultimate Modified by Michael
  12. Apache BookKeeper
  13. IntelliJ IDEA 2021.2版文件显示图标有误的解决方法
  14. 美国大学计算机专业排名2014,2014USNews美国大学研究生计算机专业排名
  15. symfony简单的博客练习,熟悉具体开发流程
  16. 数学建模-三次指数平滑法(预测模型)
  17. 大数据技术原理与应用之【Spark】习题
  18. idea点击接口的方法的跳到实现类的快捷键
  19. 外卖cps行业风雨交加,何去何从
  20. 交通灯电路及verilog实现

热门文章

  1. Ubuntu 下Rhythmbox播放器中文乱码解决办法
  2. 2021第十二届蓝桥杯国赛B组题解(C/C++)
  3. TikZ绘图示例——尺规作图:过直线外一点作给定直线的平行线
  4. php执行fastlane,fastlane教程
  5. 如何将手机中的Word文档转换成PDF文件?
  6. 随手写程序-t检验计算置信区间
  7. Hi3519V101运行MPP业务
  8. 关闭webstorm提示 empty tag doesn't work in some browsers
  9. ActiveMQ详细入门教程系列(一)
  10. 7-1 电话聊天狂人 (25 分)