Intl.NumberFormat用于数字计算

本文介绍了Intl.NumberFormat如何用于数字格式化,包括数字分组、位数控制、长度、字节、百分比、货币、质量和温度等单位的表示,以及复合单位和大数字的处理。通过示例展示了在中文和英文环境下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Intl.NumberFormat是国际化的数字处理方案,它可以用来显示不同国家对数字对处理偏好,但是一般情况下,我们还是处理中文数字比较多,但是我发现这个Intl.NumberFormat也挺好用的。
这个插件的官方地址是:https://formatjs.io/docs/intl/
数字分组

new Intl.NumberFormat('zh-CN',{useGrouping:true}).format(12345678);
"12,345,678"
new Intl.NumberFormat('zh-CN',{useGrouping:false}).format(12345678)
"12345678"

位数控制

new Intl.NumberFormat('zh-CN',{minimumIntegerDigits:2}).format(12345678);
"12"

minimumIntegerDigits表示整数部分最小要几位置,默认1,范围[1,21]
minimumFractionDigits表示小数部分最小要几位,默认0,范围[0,20]
maximumFractionDigits表示小数部分最多几位,范围[0,20]。纯数字默认3,货币,百分比默认2。
minimumSignificantDigits表示整体最小的位数,范围[1,21],默认1
maximumSignificantDigits表示整体最大的位数,范围[1,21]:
整体位数的控制权大于局部位数的控制权。

长度表示

const formatter = new Intl.NumberFormat('zh-CN', {
  style: 'unit',
  unit: 'meter',
});
const res = formatter.format(8848.86);
// 则输出:8,848.86米
// 若语言设置为'en',则输出:8,848.86m

当然在高度或长度方面还存在别的单位,如:毫米、厘米、千米等等(millimeter,centimeter,meter,kilometer,inch,foot,yard,mile,mile-scandinavian)。

字节单位表示
kB、MB、Gb、Tb这几个单位在日常生活中也是常见的。

const formatter = new Intl.NumberFormat('zh-CN', {
  style: 'unit',
  unit: 'megabyte',
});
const res = formatter.format(1024);
// 则输出:1,024 MB

// 其他
// ...
// 若unit设置"gigabit",则:1,024 Gb
// 若unit设置"terabit",则:1,024 Tb
// ...

复合单位表示
单位连接组合,如:‘40 小时/周’ (每周工作40小时)。

const formatter = new Intl.NumberFormat('zh-CN', {
  style: 'unit',
  unit: 'hour-per-week',
});
const res = formatter.format(40);
// 中文输出:40小时/周
// 英文输出:40 hr/w

unit由hour与week组合而成的单位,同样还有km/h(千米/小时: km/h),就可以设置unit为:‘kilometer-per-hour’。还有常见的当前网速,每秒多少兆,设置 ‘megabyte-per-second’(5MB/秒);

百分比表示
常见统计类数据将会以百分比表示;如成功率占据95%,则可设置unit为percent即可。

const formatter = new Intl.NumberFormat('zh-CN', {
  style: 'unit',
  unit: 'percent',
  // signDisplay: 'always',
  // signDisplay: 'exceptZero',
});
const res = formatter.format(95);
// 则输出:95%
// 设置 signDisplay: 'always',则输出:+95% 或 -95%

在某些情况下(例如显示增量),即使数字为正数,也有助于显式显示符号,如:+95%或-95%。可设置signDisplay: 'always’即可。排除输出+0%或-0%时设置signDisplay: 'exceptZero’即可。

货币表示
例如输出人民币5000000(500万)。

const formatter = new Intl.NumberFormat('zh-CN', {
  style: 'currency',
  // 输出人民币
  currency: 'CNY',
  // 输出美元,语言设置为'en'
  // currency: 'USD',
  // currencySign选项启用记帐格式
  currencySign: 'accounting',
});
const res = formatter.format(5000000);
//输出结果:¥5,000,000.00
// 其他
// 人民币:输出结果:¥5,000,000.00
// 美元:输出结果:$5,000,000.00

同样以英文输出美元,设置其语言项与货币类型即可。如人民币CNY,美元USD,欧元EUR等等。

质量表示
例如:输出500千克;千克设置’kilogram’即可。

const formatter = new Intl.NumberFormat('zh-CN', {
  style: 'unit',
  unit: 'kilogram',
});
const res = formatter.format(500);
// 输出:500kg

更多单位如:gram,kilogram,ounce,pound,stone。

温度表示
例如:今天气温在28度。

const formatter = new Intl.NumberFormat('zh-CN', {
  style: 'unit',
  unit: 'celsius',
});
const res = formatter.format(28);
// 输出:28°C

更多单位选择celsius,fahrenheit。

容积表示

const formatter = new Intl.NumberFormat('zh-CN', {
  style: 'unit',
  unit: 'milliliter',
});
const res = formatter.format(28);
// 中文输出:28毫升
// 英文输出:28 mL

更多单位选择liter(升),milliliter(毫升),gallon(加仑),fluid-ounce(液盎司)。

角度表示

const formatter = new Intl.NumberFormat('zh-CN', {
  style: 'unit',
  unit: 'degree',
});
const res = formatter.format(90);
// 输出:90°

大数字表示
如:中国大陆有14多亿人,那该如何表示,1400000000这样显示看起来有点费劲,在中文里,我们可以表示14亿。

const formatter = new Intl.NumberFormat('zh-CN', {
  notation: 'compact',
});
const res = formatter.format(1400000000);
// 输出:14亿
<think>好的,用户问的是如何在JavaScript中保留小数点后两位。我需要详细地分步骤解答,确保结构清晰,同时符合他们的格式要求。首先,我得回忆一下常用的几种方法,比如toFixed、Math.round,可能还有toPrecision,或者字符串处理的方法? 首先,toFixed方法应该是最直接的,但用户可能需要注意它会四舍五入,并且返回的是字符串。需要提醒他们转换回数字的情况,比如用Number()或者加+号。 然后,Math.round配合乘除运算也是一种方式,但可能不够灵活,特别是如果用户想要的是截断而不是四舍五入的话,这时候可能需要别的方法,比如先乘以100,用Math.floor再除以100,不过这样可能无法处理像1.345这样的数,四舍五入到两位的话应该是1.35,但用Math.floor的话会变成1.34,这时候需要确认用户的需求。 另外,toPrecision方法可能不太适合,因为它处理的是有效数字,而不是特定的小数位,除非数值的整数部分位数较少,否则可能不太适用。 还有,正则表达式的方法,可能适用于字符串处理,比如将数字转换为字符串后,用正则匹配到小数点后两位,但需要注意四舍五入的问题,或者只是简单的截断。不过这种方法可能比较复杂,容易出错。 另外,考虑国际化API,比如Intl.NumberFormat,这可能提供更灵活的格式化选项,并且自动处理本地化的问题,比如千分位分隔符,但用户可能只需要简单的方法,所以这个可以作为高级选项提到。 需要举例子说明每种方法的用法,比如使用toFixed(2),然后指出它的返回值类型是字符串,以及如何处理成数字。比如var num = 2.3456; num.toFixed(2) 得到"2.35",然后转换回数值。 对于Math.round的方法,举例num = Math.round(num * 100) / 100,但同样需要注意四舍五入的问题,和toFixed类似的结果,但返回的是数值类型。 如果用户不想四舍五入,而是直接截断,可能需要使用Math.trunc或者转换成字符串后处理,比如将字符串按小数点分割,取前两位,再拼接。但这种情况可能会有边缘情况,比如数字本身不足两位小数,或者没有小数点的情况,需要处理。 比如,函数可以写成:function truncateDecimal(num) { return Number(num.toString().match(/^-?\d+(?:\.\d{0,2})?/)[0]); } 不过这可能比较复杂,用户可能需要更简单的方法,或者使用toFixed但替换掉后面的数字,不过这样可能还是会有四舍五入的问题,所以可能需要先转换为字符串,然后截断。 另外,需要考虑浮点数精度的问题,比如0.1 + 0.2的问题,但保留两位小数通常可以避免,因为toFixed会处理这些,不过在某些情况下可能还是会出现问题,需要提醒用户注意。 总结下来,常用的方法有: 1. toFixed方法,注意返回字符串,可能需要转换。 2. Math.round方法,结合乘除,返回数值。 3. 字符串处理和正则表达式,用于截断。 4. Intl.NumberFormat进行格式化。 需要按这些步骤详细说明,并给出例子,比较它们的优缺点,以及适用场景。比如,如果只需要显示,toFixed足够;如果需要数值类型,可以用Math.round的方法;如果需要截断而不是四舍五入,可能需要字符串处理或者Math.floor等。 最后提醒用户注意不同方法的差异,尤其是四舍五入和截断的区别,以及返回类型的不同,避免在后续计算中出现类型错误。</think>在JavaScript中保留小数点后两位的常用方法如下,分为四舍五入和截断两种场景: --- ### 一、四舍五入保留两位小数 #### 1. `toFixed()` 方法 **语法**:`数值.toFixed(2)` **特点**:返回字符串类型,自动四舍五入 **示例**: ```javascript let num = 3.1415; let result = num.toFixed(2); // 返回字符串 "3.14" result = Number(result); // 转换为数值类型 3.14 ``` #### 2. `Math.round()` + 乘除法 **语法**:`Math.round(数值 * 100) / 100` **特点**:直接返回数值类型,四舍五入 **示例**: ```javascript let num = 3.1415; let result = Math.round(num * 100) / 100; // 3.14 ``` --- ### 二、截断保留两位小数(不四舍五入) #### 1. `Math.trunc()` + 乘除法 **语法**:`Math.trunc(数值 * 100) / 100` **特点**:直接截断多余小数位 **示例**: ```javascript let num = 3.1415; let result = Math.trunc(num * 100) / 100; // 3.14 ``` #### 2. 正则表达式处理 **语法**:`数值.toString().match(正则)` **特点**:通过字符串截断 **示例**: ```javascript function truncateDecimal(num) { return Number(num.toString().match(/^-?\d+(?:\.\d{0,2})?/)[0]); } let result = truncateDecimal(3.1415); // 3.14 ``` --- ### 三、高级方法:国际化API 使用`Intl.NumberFormat`格式化输出: ```javascript let formatter = new Intl.NumberFormat('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); let result = formatter.format(3.1415); // 字符串 "3.14" ``` --- ### 注意事项 1. **浮点数精度问题**:如`0.1 + 0.2 = 0.30000000000000004`,建议用整数运算后转换。 2. **返回值类型**:`toFixed()`返回字符串,其他方法返回数值。 3. **边界情况**:数值不足两位时(如`5` → `5.00`),需根据需求处理。 根据需求选择合适的方法!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值