轻松实现数字格式化:JavaScript 中的千分位分隔技巧大揭秘

简介: 轻松实现数字格式化:JavaScript 中的千分位分隔技巧大揭秘

说在前面

在这篇博客中,我们将深入探讨如何利用 JavaScript 将普通数字转换为带有千分位分隔符的格式。我们将介绍多种方法,包括使用内置的 toLocaleString() 方法、Intl.NumberFormat 对象以及自定义函数来实现数字格式化。无论你是初学者还是有一定经验的开发者,本文都将为你揭示数字格式化的各种技巧和灵活性,让你在数据展示方面游刃有余。让我们一起探索如何美化数字,让数据更加清晰和吸引人!

什么是千分位分隔

千分位分割指的是在数字中插入逗号或其他分隔符,以提高数字的可读性。通常,千分位分割会在数字的每三位之间插入一个分隔符,例如逗号。这个分隔符可以帮助我们更清晰地识别数字的大小和结构。

举个例子,假设有一个数字 1234567.6789。在进行千分位分割后,它将被转换为 1,234,567.678,9。通过插入逗号作为分隔符,我们可以更容易地理解这个数值表示的是一个百万级别的数字。

千分位分割广泛应用于金融、统计数据、货币金额等领域,以及在各种数据展示中。它可以使大数字更易读,并且更加美化和规范化。在编程中,我们可以使用各种语言和方法来实现千分位分割,如 JavaScript 中的 toLocaleString() 方法、C# 中的 ToString(“N”) 方法等。

通过千分位分割,我们可以方便地将数字转换为更具可读性和易懂性的格式,使数据更加清晰和吸引人。

代码实现

一、原生JavaScrip实现

function formatNumberWithCommas(number) {
    number += '';
    let [integer,decimal] = number.split('.');
    const doSplit = (num,isInteger = true) => {
        if(num === '') return '';
        if(isInteger) num = num.split('').reverse();
        let str = [];
        for(let i = 0; i < num.length; i++){
            if(i !== 0 && i % 3 === 0) str.push(',');
            str.push(num[i]);
        }
        if(isInteger) return str.reverse().join('');
        return str.join('');
    };
    integer = doSplit(integer);
    decimal = doSplit(decimal,false);
    return integer + (decimal === '' ? '' : '.' + decimal);
};

  • 1、首先将传入的数字参数转换成字符串类型,以便能够进行字符串操作;
  • 2、利用 ES6 的解构语法,将字符串按照小数点进行分割,得到整数部分和小数部分;
  • 3、定义一个内部函数 doSplit,该函数接收一个数字字符串和一个布尔值 isInteger(默认为 true)。如果是整数部分,则 isInteger 为 true;否则为 false。;
  • 4、如果传入的数字字符串为空字符串,直接返回空字符串;
  • 5、如果是整数部分,我们需要在数字从右往左数,每3位插入一个逗号;
  • 6、如果是小数部分,我们需要在数字从左往右数,每3位插入一个逗号;
  • 7、如果是整数部分,则将数组反转,然后通过 join() 方法将数组转换成字符串。如果是小数部分,则直接通过 join() 方法将数组转换成字符串。
  • 8、最后,将整数部分和小数部分用小数点连接起来,返回最终的字符串。

二、正则表达式实现

function formatNumberWithRegex(number) {
  return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

  • 1、首先将传入的数字参数转换成字符串类型,以便能够进行正则表达式替换操作。
  • 2、调用字符串对象的 replace() 方法进行替换操作。该方法接收两个参数:
  • 第一个参数是正则表达式 \B(?=(\d{3})+(?!\d)),其中 \B 表示匹配非单词边界,即数字之间的位置;(?=(\d{3})+(?!\d)) 表示匹配连续的三个数字组成的一组,且该组之后不能再有数字。也就是说,该正则表达式匹配所有满足这样条件的数字之间的位置。
  • 第二个参数是逗号 ,,用来替换匹配到的数字之间的位置。
  • 3、在正则表达式中使用了正向肯定预查 (?=…) 和负向否定预查 (?!\d),保证了只匹配数字之间的位置,并且不会匹配到数字本身。
  • 4、通过这种方式,在不需要循环遍历的情况下,直接使用正则表达式完成了千分位分隔符的替换操作。
  • 5、最后返回替换后的字符串。

三、使用toLocaleString方法:

toLocaleString() 是 JavaScript 中用于将数字、日期等数据类型转换为特定地区(locale)格式的方法。它是基于当前执行环境的语言设置和地区设置,返回一个表示格式化后的字符串。

toLocaleString() 方法有多种重载形式,用于不同的数据类型和参数配置。下面分别介绍常见的用法:

  • 1、格式化数字:
  • Number.prototype.toLocaleString():该方法用于将数字格式化为特定地区的数字格式。例如,使用英语环境默认的逗号作为千分位分隔符和小数点作为小数分隔符。
  • 示例:(1234567.89).toLocaleString() // "1,234,567.89"
  • 2、格式化日期和时间:
  • Date.prototype.toLocaleString():该方法用于将日期和时间格式化为特定地区的日期时间格式。根据地区的不同,可以获得不同的日期时间显示格式。
  • 示例:new Date().toLocaleString()
  • 3、格式化货币:
  • Number.prototype.toLocaleString():该方法也可用于将数字格式化为特定地区的货币格式。根据地区设置,可以获得合适的货币符号、货币分组符号和小数位设置。
  • 示例:(1234567.89).toLocaleString("en-US", { style: "currency", currency: "USD" }) // "$1,234,567.89"

需要注意的是,toLocaleString() 方法的具体格式化效果依赖于当前执行环境的语言设置和地区设置。不同的浏览器、操作系统或用户配置可能会导致不同的结果。因此,在使用 toLocaleString() 方法时应谨慎处理,并根据需求进行适当的参数配置。

function formatNumberWithToLocaleString(number) {
  return number.toLocaleString();
}

试了上面这个代码,我么发现它默认是保留3位小数的,那这么办呢?我们还是将其分割为小数和整数两部分来进行处理:

function formatNumberWithLocale(number) {
    let [integer,decimal = ''] = (number + '').split('.');
    integer = (+integer).toLocaleString();
    if(decimal === '') return integer;
    decimal = decimal.split('').reverse().join('');
    decimal = (+decimal).toLocaleString();
    decimal = decimal.split('').reverse().join('');
    return integer + '.' + decimal;
}

四、使用Intl.NumberFormat对象:

function formatNumberWithIntl(number) {
  return new Intl.NumberFormat().format(number);
}

和上一个一样,直接使用的话只能保留3位小数,我们仍要对其进行改造一下:

function formatNumberWithIntl(number) {
    let [integer,decimal = ''] = (number + '').split('.');
    integer = new Intl.NumberFormat().format(integer);
    if(decimal === '') return integer;
    decimal = decimal.split('').reverse().join('');
    decimal = new Intl.NumberFormat().format(decimal);
    decimal = decimal.split('').reverse().join('');
    return integer + '.' + decimal;
}

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
|
1月前
|
JavaScript
uni-app中关于格式化时间的js文件
uni-app中关于格式化时间的js文件
32 0
|
19天前
|
JSON JavaScript 前端开发
设置WebStorm像VSCode一样每行代码结尾自动格式化加入“;”分号(JavaScript、TypeScript格式化)
设置WebStorm像VSCode一样每行代码结尾自动格式化加入“;”分号(JavaScript、TypeScript格式化)
|
2月前
|
JavaScript 前端开发
JavaScript 计算时间差并格式化输出
JavaScript 计算时间差并格式化输出
19 0
|
5月前
|
JavaScript API
js日期、经纬度格式化
js日期、经纬度格式化
37 0
|
8月前
|
JavaScript
JS格式化中国标准时间
JS格式化中国标准时间
|
8月前
|
JSON JavaScript 前端开发
开发了一个json格式化工具,使用js格式化json的代码分享
今天给大家介绍一下如何通过js来格式化json。
71 0
|
9月前
|
JavaScript 前端开发 iOS开发
javascript格式化时间:ios不支持时间戳转换解决方案
javascript格式化时间:ios不支持时间戳转换解决方案
153 0
|
9月前
|
JavaScript 前端开发
javascript整数千分位格式化函数
javascript整数千分位格式化函数
52 0
|
10月前
|
JavaScript 前端开发 API
【moment.js】时间格式化插件
【moment.js】时间格式化插件
113 1
|
11月前
|
JavaScript 前端开发
JavaScript 时间格式化方法
今天我要和大家分享的是 JavaScript 时间格式化方法。很多时候,我们需要把时间戳转换成可读性强的时间格式,如年月日时分秒等等。那么,该如何实现呢?