python 千位分隔符_千位分隔符的完整攻略
千位分隔符
纯整数情况
纯整数大概是所有情况里最简单的一种,我们只要正确匹配出千分位就好了。
观察上面的数字,我们可以得出千分位的特征是到字符串终止位有 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 千位分隔符_千位分隔符的完整攻略相关推荐
- Python:Python语言编程软件安装的几大姿势之详细攻略
Python:Python语言编程软件安装的几大姿势之详细攻略 目录 Python软件安装的几大姿势 Python原生安装 Python3.6安装 Python流行安装--完美搭配Pycharm
- 斐讯k1支持千兆吗_千兆宽带如何使用?看这里!
千兆宽带 千兆宽带是指"从宽带接入服务提供商的宽带业务接入点BRAS到用户终端这一段链路上的信息传送速率达到千兆",那么享受千兆宽带,对硬件也是有一定的要求的.下面看一下你 ...
- 5gh掌上云计算认证不通过_阿里云ACP认证考试攻略、考试心得、费用及常见问题...
阿里云ACP级认证是阿里云的专业工程师认证,云吞铺子分享ACP认证考试攻略.考试心得.考试费用及常见问题: ACP认证分类 ACP认证根据所属领域不同分为五类,即即云计算.大数据.大数据分析师.云安全 ...
- iwrite提交不了作业_“iWrite写作中心”使用全攻略
原标题:"iWrite写作中心"使用全攻略 写作中心上线以后,同学和老师们的各种咨询和反馈不断飞来.其中,大家问的最多的问题就是: 学生 我听说我们学校有位老师特别厉害,怎么才能预 ...
- 重装上阵两个人合体机器人_重装上阵多人机甲合体攻略 机甲怎么合体
重装上阵手游多人机甲是玩家之间合体组成的一类事物,其体积和强度远远超过单一的机甲,可在各种挑战中打出高额的收益.那么,重装上阵手游多人机甲怎么合体呢?多人机甲有什么组装技巧呢?相信这是不少玩家关心的问 ...
- 卷毛机器人符文_关于卷毛分享锤石天赋攻略
在2020430卷毛分享锤石天赋攻略具体的跟着小编一起来看看原文内容吧! 卷毛分享锤石天赋攻略 好久没发英雄攻略了 今天给大家发一个锤石不同的天赋攻略:守护者虚弱主的锤石! 灵感是来自 的主锤石而来 ...
- python文本挖掘与分析:热剧《延禧攻略》用户评论分析
需要用到的工具:pycharm编辑器,python3 主要用到的库:re,urllib,requests,time,BeautifulSoup,selenium,numpy,matplotlib,ji ...
- 侠众道武功最佳练级方案_侠众道武功选择攻略
侠众道手游武功究竟该怎么选择呢?还不是很了解的朋友们,接下来心愿游戏小编就为你们带来了侠众道武功选择攻略,一起来看看吧. 侠众道武功选择推荐 普通攻击类武功 第一个选择,无击阵 攻击高,闪躲还行,单P ...
- 如何利用python在一个wen'dang'li_如何利用Python网络爬虫给自己跟朋友来一份穷游攻略!走到哪里穷到哪里的哦!...
[一.项目背景] 穷游网提供原创实用的出境游旅行指南.攻略,旅行社区和问答交流平台,以及智能的旅行规划解决方案,同时提供签证.保险.机票.酒店预订.租车等在线增值服务.穷游"鼓励和帮助中国旅 ...
- 千位分隔符的完整攻略
千位分隔符[1]是很常见的需求,但是输入文本千变万化,如何才能准确添加千分符呢? 纯整数情况 纯整数大概是所有情况里最简单的一种,我们只要正确匹配出千分位就好了. 观察上面的数字,我们可以得出千分位的 ...
最新文章
- 面试被问到Redis实现发布与订阅,手摸手教
- python字典实现关键字检索_如何实现搜索框的关键词提示功能
- NC16886 炮兵阵地
- css animation 触发,在JavaScript中触发CSS动画
- 如何配置Windows Live Writer发布博客园随笔
- 程序设计语言诞生——程序设计语言的发展历史
- 离散数学学习笔记 第二章 命题逻辑
- EMQ压力测试及系统优化(单机11万并发连接)
- 什么pdf转换成word转换器在线好
- 前端代码 (html css JavaScript DOM JSON)
- Windows 7x64 Ultimate Modified by Michael
- Apache BookKeeper
- IntelliJ IDEA 2021.2版文件显示图标有误的解决方法
- 美国大学计算机专业排名2014,2014USNews美国大学研究生计算机专业排名
- symfony简单的博客练习,熟悉具体开发流程
- 数学建模-三次指数平滑法(预测模型)
- 大数据技术原理与应用之【Spark】习题
- idea点击接口的方法的跳到实现类的快捷键
- 外卖cps行业风雨交加,何去何从
- 交通灯电路及verilog实现
热门文章
- Ubuntu 下Rhythmbox播放器中文乱码解决办法
- 2021第十二届蓝桥杯国赛B组题解(C/C++)
- TikZ绘图示例——尺规作图:过直线外一点作给定直线的平行线
- php执行fastlane,fastlane教程
- 如何将手机中的Word文档转换成PDF文件?
- 随手写程序-t检验计算置信区间
- Hi3519V101运行MPP业务
- 关闭webstorm提示 empty tag doesn't work in some browsers
- ActiveMQ详细入门教程系列(一)
- 7-1 电话聊天狂人 (25 分)