JS 正则中环视(断言)应用 -- 数字千分符
介绍一下顺序环视 (?=...) 和逆序环视 (?<=...)
方便不想看长文的人,如果在支持 ES2018 的环境中整数可以这样使用:
String(12345678).replace(/(?<=\d)(?=(\d{3})+\b)/g, ',') // "12,345,678"
其中最关键的是肯定顺序环视(?=...),也叫零宽度正预测先行断言。
添加千分符麻烦的地方在于只有在从右到左 3 的倍数的位数和前面的数字中间需要添加逗号
而正则是从左到右匹配的,这时候就需要用到顺序肯定环视。
环视不占用字符,能匹配到符合要求的位置
比如,`/Java(?=Script)/` 只会匹配后面有 Script 的 Java 字符
'Java or JavaScript'.replace(/Java(?=Script)/, 'Type'); // "Java or TypeScript"
我们知道匹配连续的 3 个数字的方法是 /\d{3}/ 3 的倍数的位数的数字就是 /(\d{3})+/
再结合顺序肯定环视,我们就能匹配到后面有 3 的倍数的位数前面的位置 /(?=(\d{3})+)/
这样我们就成功一半了,下面的问题是 `` 这样的 6 位数,前面不需要加分隔符。
所以我们还需要匹配前面有数字的位置,这就需要肯定逆序环视 /(?<=\d)/
逆序环视和顺序环视相反,是指定模式后面的位置比如:
'Adding subscripts using Javascript'.replace(/(?<=Java)script/, 'Script'); // "Adding subscripts using JavaScript"
上面两个加起来就可以匹配到前面有数字,且后面有 3 的倍数的位置,但如果你这样子写:
String(12345678).replace(/(?<=\d)(?=(\d{3})+)/g, ','); // "1,2,3,4,5,678"
会发现和预期不同,右边三位数字前面的每个数字后都加了逗号。
我们可以使用单词分隔符 `\b` 来解决这个问题
String(12345678).replace(/(?<=\d)(?=(\d{3})+\b)/g, ',') // "12,345,678"
如果你是在支持 ES2018 环境下运行那到这里就可以了,但目前很多浏览器还不支持逆序环视。好在我们可以稍微变通,不使用逆序环视来解决
String(12345678).replace(/(\d{1,3})(?=(\d{3})+\b)/g, '$1,') // "12,345,678"
为了方便可以添加一个函数
function formatNumber(number) {
if (typeof number !== 'number') {
throw new Error('formatNumber parameter must be number');
}
if (Number.isNaN(number)) {
return '0';
}
let result;
const [integerNum, decimalNum] = String(number).split('.');
return integerNum.replace(/(\d)(?=(\d{3})+\b)/g, '$1,') + (decimalNum ? `.${decimalNum}` : '');
}
如果想用国内的习惯,按万位划分,把 3 改 4 即可
JS 正则中环视(断言)应用 -- 数字千分符的更多相关文章
- js解决千分符问题
js脚本function: //js数字千分符处理 function commafy(num) { num = num + ""; var re = /(-?\d+)(\d{3}) ...
- js解决千分符问题[收藏下]
//js数字千分符处理 function commafy(num) { num = num + ""; var re = /(-?\d+)(\d{3})/ while (re.te ...
- 排坑·IPhone&IOS中不兼容正则中的断言匹配
阅文时长 | 1.14分钟 字数统计 | 1834.4字符 主要内容 | 1.问题切入 2.什么是断言匹配 3.断言匹配的替换方案 4.声明与参考资料 『排坑·IPhone&IOS中不兼容正则 ...
- JS数字千分
JS数字千分: 1.例子:1000--->1,000 2.实现如下: salesToFormat: function (num) { var num = (num || 0).toString( ...
- JavaScript千分符---正则实现
一般在JavaScript中实现千分符,是使用切割+连接一顿操作 这里尝试一下使用正则快速实现千分符 let num0 = '12' let num1 = '123' let num2 = '1234 ...
- js-格式化数字保留两位小数-带千分符
很多时候发现有时候js会提示自带函数不能使用,所以自己找了很多资料实现了个 html <input type="text" class="input_text in ...
- JS实现数字千位符格式化方法
/** * [number_format 参数说明:] * @param {[type]} number [number:要格式化的数字] * @param {[type]} decimals [de ...
- JS 正则中的命名捕获分组
假设你在一段陌生的代码中看到这样一个函数: function toLocalDate(date) { return date.replace(/(\d{2})-(\d{2})-(\d{4})/, &q ...
- js正则判断实现18位数字
js实现18位数字 var stuCardReg = /^[0-9]{18}/; var stuCard = $('.inp).val();//获取input框中的数值 if (!stuCardReg ...
随机推荐
- GlusterFS缺陷
glusterfs缺陷 转自:http://www.liuwq.com/2017/04/20/glusterfs%E8%AF%A6%E8%A7%A3/ glusterfs 原理.优势.使用范围等 Gl ...
- JPEG算法解密
图片压缩有多重要,可能很多人可能并没有一个直观上的认识,举个例子,一张800X800大小的普通图片,如果未经压缩,大概在1.7MB左右,这个体积如果存放文本文件的话足够保存一部92万字的鸿篇巨著< ...
- Nios II的Boot过程分析
目录 1 概述....................................................................... 1 2 几种常见的 ...
- rails gem ransack 之模糊搜索
gem 'ransack' eq: "等于" eq_any: "等于任意值" eq_all: "等于所有值" not_eq: "不 ...
- 【玩转SpringBoot】给自动配置来个整体大揭秘
上一篇文章中提到的条件注解,只是自动配置整体解决方案中的一个环节而已,可以说是管中窥豹. 本文就逐步擦除迷雾,让整体浮现出来,这样就会有一个宏观的认识. 除了写代码之外,还能干点什么? 提到“配置”这 ...
- iOS 类别 类扩展 简要说明
- python 多线程编程之_thread模块
参考书籍:python核心编程 _thread模块除了可以派生线程外,还提供了基本的同步数据结构,又称为锁对象(lock object,也叫原语锁.简单锁.互斥锁.互斥和二进制信号量). 下面是常用的 ...
- leetcode菜鸡斗智斗勇系列(4)--- 单一数字的乘积和总合的减法
1.原题: https://leetcode.com/problems/subtract-the-product-and-sum-of-digits-of-an-integer/ Given an i ...
- Graylog 环境搭建与使用
graylog 官网地址: www.graylog.org graylog 简易架构图: graylog 生产架构图: graylog 有两个版本,1.企业版:2.开源版 下面使用开源版本搭建日志中心 ...
- IDEA 如何自动导入(import)
如果大家正在使用一个未曾导入(import)过的类,或者它的静态方法或者静态字段,IDEA 会给出对应的建议,只要按下 ⌥(option)和回车就可以接受建议. 但我觉得这样做仍然很麻烦,不够智能化. ...