四两拨千斤,一招搞定数字格式化问题

问题描述

今天在处理一个数字的格式显示问题时,遇到下面的一些需求:

  • 可以显示千分符
  • 可以显示百分比
  • 可以显示小数位数

如下图,如果勾选的话就使能该项设置。

百分比和小数位数比较好解决,百分比只需要在源数字后面加两个零再加上百分号;小数只需要在小数点后面加零即可。最主要的是千分符的处理,好,就来说千分符。

千分符问题

数字千分符的处理有很多处理方案,最主要的有下面几种。

方法一:循环遍历

思路:

将数字转换成字符串,然后倒序遍历取值,每取3个字符插入一个,逗号,直到遍历到第一个字符。

代码很简单,如下:

function numberFormat(num) {
    let result = '';
    let count = 1;
    let nums = num.toString();
    for (let i = nums.length - 1; i >= 0; i--) {
        result = nums.charAt(i) + result;
        if (!(count % 3) && i != 0) {
            result = ',' + result;
        }
        count++;
    }
    return result;
}

numberFormat(12345678); // 12,345,678

方法二:正则

思路:

该正则的思路就是从数字的第一个字符开始找,找到满足该数字后面的数字个数为3的倍数的这个数字,然后在该数字替换成数字,的形式,然后继续往下找......

语法如下:

let regExp = /(\d)(?=(\d{3})+$)/g;

示例:

String(12345678).replace(/(\d)(?=(\d{3})+$)/g, "$1,");

解释:

首先\d 表示数字,然后以?=(\d{3})+ 结尾的即满足条件。所以最主要是这个 ?=(\d{3})+ 表达式。

正向预测 ?=n,表示匹配任何其后紧接指定字符串 n 的字符串。 再结合\d 表示,如果一个数字后面满足字符串n这个规则,那么就将匹配到的这个数字(假如是1)替换成1,

所以现在的问题是字符串n这个规则是什么,是(\d{3})+ 这个东西,这个表示数字的个数为3的倍数(倍数为1~n之间)。

所以整个表达式的意思就是:从第一个数字开始看起,看这个数字后面的数字个数是不是3的倍数,是的话将这个数字(假如是1)替换成1,的形式,然后继续下一个数字直到结尾。

说明:

  • g是表示全局匹配的修饰符,全局匹配指查找所有匹配而非在找到第一个匹配后停止。
  • $是表示结尾的量词,如n$,匹配的是任何以n为结尾的字符串。
  • \d是查找数字的元字符。
  • n{X}是匹配包含 X 个 n 的序列的字符串的量词。
  • + 匹配前面的子表达式一次或多次;* 匹配前面的子表达式0次或多次。?匹配前面的子表达式0次或1次,或指明一个非贪婪限定符。
  • ?=n正向预查,用于匹配任何其后紧接指定字符串 n 的字符串。
  • match() String对象的方法,作用是找到一个或多个正则表达式的匹配。
  • replace() String对象的方法,作用是替换与正则表达式匹配的子串。
  • \B是表示匹配非单词边界的元字符,与其互为补集的元字符是\b,表示匹配单词边界。

方法三(推荐??):toLocaleString

根据 MDN 解释, number.toLocaleString() 方法返回这个数字number在特定语言环境下的表示字符串。

简单的使用:

var number = 3500;

console.log(number.toLocaleString()); // 3,500

我们直接调用该函数就可以得到问题的结果。但其实,该函数的功能不止于此,这就需要分析它的参数了。

语法:

numObj.toLocaleString([locales [, options]])
  • locales: (可选)表示以哪国的数字表示形式。
  • options: (可选)表示数字的显示样式(比如要不要显示小数位数,显示几位?要不要显示百分比?等等)

locales

一般可以填下面几个数值:

  • en-US : 美国( 中文场景下默认值)
  • zh-CN : 中国
  • en-GB : 英国
  • ko-KR : 韩国
  • ar-EG : 阿拉伯
  • de-DE : 德国
  • en-IN : 印度
  • ja-JP : 日本
  • ...
  • (更多的国家参考链接:ISO Language Code Table

options

options对象的属性就有很多了,下面列举一个常用的属性。

  • style : 默认为 decimal ,表示十进制格式, currency表示货币格式, percent表示百分比格式。
  • currency : 如果style设置为currency,则该属性设置货币符号(USD 表示美元, EUR 表示欧元, or CNY是人民币等等,更多符号参考链接: https://www.currency-iso.org/en/home/tables/table-a1.html
  • useGrouping : 是否使用千分符,默认为true
  • minimumIntegerDigits :设置整数最小位数(当整数位数不足时,在前面加0)
  • minimumFractionDigits : 设置小数数最小位数。

而这些属性不仅可以满足文章开头提出的问题,也可以满足我们日常常用到的数字的格式表示。那么我们就来康康怎么使用吧!

示例:

  • 设置整数部分为5位,小数部分为2位,不使用千分符格式
Number(123).toLocaleString('zh-CN', {
    style: 'decimal',
    useGrouping: false,
    minimumIntegerDigits : 5,
    minimumFractionDigits: 2
}) // 00123.00
  • 设置两位小数的百分比显示
Number(123).toLocaleString('zh-CN', {
    style: 'percent',
    minimumFractionDigits: 2
}) // 12,300.00%
  • 设置欧元货币
Number(123).toLocaleString('zh-CN', {
    style: 'currency',
    currency: 'EUR',
    minimumFractionDigits: 2
}) // €123.00

toLocaleString扩展

除了数字本地化格式之外,还有日期,数组,对象等等一系列的本地化处理,由于篇幅有限,这里不再展开,可以自行去 MDN 查找相关内容,基本上用法都是类似的。



最后,如果看完有收获,就动动小手点个赞再走呗,笔芯。

原文地址:https://www.cnblogs.com/lvonve/p/12067970.html

时间: 2024-10-07 07:59:06

四两拨千斤,一招搞定数字格式化问题的相关文章

(转载)你好,C++(15)四两拨千斤——3.9 指向内存位置的指针

你好,C++(15)四两拨千斤——3.9 指向内存位置的指针 3.9  指向内存位置的指针 一天,两个变量在街上遇到了: “老兄,你家住哪儿啊?改天找你玩儿去.” “哦,我家在静态存储区的0x0049A024号,你家呢?” “我家在动态存储区的0x0022FF0C号.有空来玩儿啊.” 在前面的章节中,我们学会了用int等数值数据类型表达各种数字数据,用char等字符数据类型表达文字数据,我们甚至还可以用结构体将多个基本数据类型组合形成新的数据类型,用以表达更加复杂的事物.除了这些现实世界中常见的

你好,C++(15)四两拨千斤——3.9 指向内存位置的指针

3.9  指向内存位置的指针 一天,两个变量在街上遇到了: “老兄,你家住哪儿啊?改天找你玩儿去.” “哦,我家在静态存储区的0x0049A024号,你家呢?” “我家在动态存储区的0x0022FF0C号.有空来玩儿啊.” 在前面的章节中,我们学会了用int等数值数据类型表达各种数字数据,用char等字符数据类型表达文字数据,我们甚至还可以用结构体将多个基本数据类型组合形成新的数据类型,用以表达更加复杂的事物.除了这些现实世界中常见的数据之外,在程序设计当中,我们还有另外一种数据经常需要处理,那

金融篇-保证金制度(四两拨千斤)

期货市场中有一种叫做保证金制度,这种制度有以小博大,四两拨千斤的功效.简单的说,就是你可以用100元的钱,买到1000元的东西.有点不好理解了吧,在说清楚点,他的规则是这样的,比如,有一张黄豆的期货合约,每斤黄豆10元,数量为1000斤,这张合约的价值就是10*1000=10000元,按理说,如果你要买这张合约,你就需要10000元,你身上现在只有1000元,但是你明明知道在过一段时间,黄豆价格就要上涨,这就让你看到钱也赚不到.现在有了保证金制度后,你可以这样去做,把你的1000元到期货市场开个

四两拨千斤

1 public void hazardAlertJob(){ 2 Map<String,Map<String,Object>> alertTranNoMaps=new HashMap<String,Map<String,Object>>(); 3 EmConfig config=emConfigMapper.select(); 4 Long startTranNo=0L; 5 if(config!=null&&config.getHazar

一招搞定谷歌搜索、谷歌学术无法访问的问题

最近,谷歌搜索.谷歌学术"突然"无法访问了?我百思不得其解啊,禁不住想问一下:前辈们,你们这是要怎样?我们写个论文容易吗?怒火燃尽,言归正传,其实要解决这个问题也是很简单的,原理不赘述,直接上菜.以下谨代表个人意见,大仙们有好的方法记得留言共享讨论,谢谢! 方法一:修改hosts文件 首先,用记事本打开系统目录C:\Windows\System32\drivers\etc下的hosts文件: 然后,在hosts文件的最下方追加以下四个IP地址,保存,退出. 209.116.186.21

14招搞定JavaScript调试

14招搞定JavaScript调试 译者按: 很多时候,大家可能只是依靠console.log来调试JavaScript代码,这样做的局限性不言而喻,这篇博客将教你几招实用的调试技巧. 原文: The 14 JavaScript debugging tips you probably didn't know) 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用于学习. 掌握工具的使用方法可以极大提高解决问题的效率.尽管JavaScript以难以D

教你一招搞定微信朋友圈照片模糊不清

我们在微信朋友圈发照片时会发现图片变模糊了,有一些齿边,不够清晰,这是因为微信默认启用了图片压缩功能,减小图片大小,节省流量.有强迫症的同学肯定会有不爽的赶脚,ytkah教你一招搞定微信朋友圈照片模糊不清. 1.发送照片的时候,点击右下角的“+”号按钮,然后选择“照片”. 2.选中要发送的照片后,点击左下角的“预览”(这个是重点).在预览照片的左下角看到一个“原图”单选,点中后发送,就可以将未压缩的原照片进行发送了. 这样选原图发送朋友圈,照片就不会模糊了,赶紧去试试吧!

忘记linux中root密码怎么办?两种方法两步教你轻松搞定修改新的密码(仅限CentOS6.X)

忘记了Linux的系统管理员密码时,可以在本地通过进入单用户模式来重置root密码.两种方法(只需两步)具体步骤如下: 方法一: 在进入grub启动菜单的时候 按"a" 键操作编辑 kernel 参数后面加"single"告诉linux内核以单用户模式运行,回车启动即可.进去后,在命令行输入passwd回车,输入新的密码,重复输入,搞定.重启后输入新的密码即可登录.(注:grub界面时间很短,大概5秒,把握机会,如果不想等的话,在linux启动的时候随便按下一个键例

2招搞定压力,远离焦虑失眠狂躁

转自 作者:foruok 链接:http://www.jianshu.com/p/3f15766ec487 來源:简书 压力管理 本文以技术管理者为例来讲压力管理,实际上提到的 ABC .暂停.宣泄等方式适用于大多数人. 心理学家 Richard S. Lazarus(拉扎勒斯)提出:压力是由于事件和责任超出个人应对能力范围时所产生的焦虑状态(紧张状态). 当一位开发者刚刚走上管理岗位时,极容易产生压力--原来他只需要管理好自己,搞定开发任务即可,现在他不但要搞定自己,还要管理下属,还要与产品.