数字格式化器,免费
使用逗号、缩写、货币符号和自定义小数位数格式化数字。
工作原理
- 输入您的数字:输入或粘贴数字值 · 整数、小数、大数字或科学记数法。
- 选择格式选项:选择您的区域(美国、欧洲等)、小数位数、分组分隔符,以及如有需要的货币符号。
- 复制格式化结果:数字立即以您选择的格式显示。复制后用于报告、文档或导出。
为什么使用数字格式化器?
在不同地区,数字的书写方式不同。美国将一千写作 1,000.00,而许多欧洲国家写作 1.000,00。在不同系统之间复制原始数字会导致解析错误、误读和财务错误。数字格式化器确保您的数字能正确地展示给任何受众 · 无论是准备财务报告、本地化内容,还是清理数据以作展示。
功能特性
- 区域敏感的格式化:支持美国、欧洲和国际格式,带有正确的小数分隔符和分组分隔符。
- 小数精度控制:精确设置要显示多少位小数。
- 千位分组:一键添加或移除千位分隔符。
- 货币格式化:在数字前添加货币符号,将其格式化为货币值。
- 科学记数法:为极大或极小的数字在科学记数法与标准形式之间转换。
常见问题
美国和欧洲的数字格式有什么区别?
在美国,小数分隔符是点(.),千位分隔符是逗号(,)· 例如 1,234.56。在大多数欧洲国家则正好相反:1.234,56。此工具可在两种格式之间正确转换。
可以为货币格式化数字吗?
可以。启用货币模式并选择一个符号($ € £ ¥ 等),使其作为前缀显示在格式化的数字之前。对于使用负数约定的会计格式,请启用会计模式。
可以处理非常大或非常小的数字吗?
可以。格式化器处理多位数字,可以以标准、分组或科学记数法显示。浮点精度应用于配置的小数位。
数字格式化标准从何而来
今天在软件中看到的数字格式由一小堆标准定义,这些标准花了三十年才稳定下来。IEEE 754(1985),在2008年和2019年修订,确定了二进制浮点数的位布局:64位分为1位符号、11位指数、52位尾数,这就是每个JavaScript数字在底层的样子。ISO 4217(1978,当前版本2015)定义了三字母货币代码,USD、EUR、JPY、INR、BRL,以及每种货币有多少子单位(USD为2,JPY为0,KWD为3,CLF为4)。Unicode CLDR(Common Locale Data Repository)于2003年首次发布,是记录每个区域设置的分组分隔符、小数分隔符、货币符号和复数规则的开放数据集;当前版本是CLDR 46(2024年10月)。ECMA-402(2012),ECMAScript国际化API,通过Intl.NumberFormat给JavaScript提供了对这些数据的原生绑定,后者由V8、JavaScriptCore和SpiderMonkey中的ICU(International Components for Unicode)支持。这四个规范共同使得(1234567).toLocaleString('de-DE')返回1.234.567而不是1,234,567。
你将遇到的六种区域设置模式
野生的大多数数字格式属于六种模式。记住这六种覆盖任何全球产品~95%的用户群。
- en-US、en-GB、ja-JP、zh-CN、ko-KR,逗号分组,句点小数:
1,234,567.89。 - de-DE、es-ES、it-IT、nl-NL、pt-BR,句点分组,逗号小数:
1.234.567,89。小心将其粘贴到美国电子表格中。 - fr-FR、ru-RU、sv-SE、pl-PL,窄不间断空格分组(Unicode U+202F),逗号小数:
1 234 567,89。分隔符不是常规空格;通过规范化空白的系统复制粘贴会损坏它。 - de-CH,右单引号分组(U+2019),句点小数:
1’234’567.89。瑞士在这里独一无二。 - en-IN、hi-IN,逗号分组,句点小数,但分组是2-2-3而不是3-3-3:
12,34,567.89。这反映了lakh/crore系统:1 lakh = 10⁵,1 crore = 10⁷。 - ar-EG、ar-SA,阿拉伯-印度数字(٠١٢٣٤٥٦٧٨٩),阿拉伯小数U+066B,阿拉伯千位分隔符U+066C:
١٬٢٣٤٬٥٦٧٫٨٩。大多数阿拉伯语开发环境内部使用拉丁数字,仅在显示时切换。
舍入模式,它们实际做什么
ECMA-402(2023)为Intl.NumberFormat添加了九种舍入模式。选择改变财务总计、科学报告和税务计算。三种在实践中最重要。
halfExpand(默认)。 2.5舍入到3,−2.5舍入到−3。这是大家在学校学到的舍入方式,也是JavaScript的默认值。halfEven(银行家舍入)。 2.5舍入到2,3.5舍入到4,平局总是去到偶数位。IEEE 754要求浮点运算使用。用于美国税表、科学计算和主要会计系统,以消除halfExpand在数百万次舍入中引入的小系统性偏差。trunc。丢弃截断后的所有内容而不舍入。2.9到2,−2.9到−2。当你字面上想丢弃精度时使用,绝不用于钱。- 其他六种(
ceil、floor、expand、halfCeil、halfFloor、halfTrunc)处理专门情况,如运费总是向上舍入或税务折扣总是向下舍入。慎重选择,如果涉及钱或合规,不要接受默认值。
此工具发挥价值之处
- 财务报告。为演示文稿格式化收入、支出、比率。在美国和欧盟格式之间切换以匹配受众的国家。
- 商店区域设置检查。以所需格式键入价格,并验证它与你的电商网站为德国或印度客户呈现的内容匹配。
- CSV准备。在导入到期望句点小数的工作表之前,将德国
1.234,56行转换为美国1234.56,或反之。 - 印度卢比格式化。将12,500,000转换为1,25,00,000(1.25 crore)用于南亚受众。大多数美国构建的工具不这样做。
- 仪表板紧凑显示。在水平空间紧张的小部件中将1,234,567转换为
1.23M。紧凑表示法也是区域感知的:德语显示1,23 Mio. - 货币符号前缀。在每个区域设置的正确位置添加$、€、£、¥、₹,美元在前面,德国欧元在后面。
- Excel科学记数法转义。粘贴的大ID(如Twitter snowflakes)被转换为
1.23E+18并丢失精度。在粘贴前用分组加前导撇号格式化它们,以便Excel将其视为文本。
甚至有经验的开发者也会犯的错误
- 钱上的浮点运算。
0.1 + 0.2 === 0.30000000000000004在每种IEEE 754语言中,不仅仅是JavaScript。将货币存储为整数子单位(分)或使用如decimal.js的十进制库。格式化隐藏错误,它不修复错误。 - 对区域字符串的天真解析。
parseFloat("1,234.56")返回1,不是1234.56。parseFloat("1.234,56")返回1.234。要解析区域格式化的数字,去除分组分隔符然后替换小数标记,理想情况下由Intl.NumberFormat(locale).formatToParts()驱动。 - 大整数精度损失。超过
2⁵³ − 1 = 9,007,199,254,740,991的整数在存储为number时会默默丢失精度。Twitter ID、Stripe ID、区块链交易哈希都超过此限制。将它们作为字符串接收或使用BigInt;Intl.NumberFormat原生接受BigInt。 - Stripe风格的子单位。Stripe为$4.99发送
amount: 499。在格式化前除以100(或除以该货币的ISO 4217子单位数量)。JPY、KRW、VND、ISK、HUF使用0子单位,无需除法。 - 百分比输入是一个分数。
new Intl.NumberFormat('en', {style: 'percent'}).format(0.5)返回50%,不是0.5%。如果你将值存储为百分比,在格式化前将存储的值乘以0.01。 - 在热循环中构造NumberFormat。每次构造函数调用都加载ICU区域数据。跨调用重用单个实例:使用缓存实例的1M次格式化在V8中约需60毫秒,如果每次都重新构造则约需3秒。
- JPY带两位小数。
¥1000.00看起来错误,因为JPY有0子单位。为JPY、KRW、VND、ISK、HUF、CLP设置minimumFractionDigits: 0, maximumFractionDigits: 0。
更多常见问题
为什么0.1 + 0.2不等于0.3?
因为IEEE 754二进制浮点数无法精确存储十进制小数0.1,就像10进制无法精确存储1/3。最接近0.1的64位double大约是0.1000000000000000055511151231257827021181583404541015625。相加两个这样的近似值产生一个舍入到0.30000000000000004而不是0.3的结果。每种IEEE 754语言都有此行为:Java、Python、C++、Swift,所有的。对于精确十进制运算,使用整数分或如decimal.js / Python的Decimal / Java的BigDecimal的库。
Intl.NumberFormat和toLocaleString有什么区别?
相同引擎,不同的人体工程学。(1234.5).toLocaleString('de-DE', {style: 'currency', currency: 'EUR'})和new Intl.NumberFormat('de-DE', {style: 'currency', currency: 'EUR'}).format(1234.5)产生相同输出。区别:Intl.NumberFormat可重用,所以如果你用相同选项格式化许多数字,实例化一次并缓存。toLocaleString每次调用读取构造函数选项,在紧密循环中显著较慢。
印度数字系统如何工作?
印度英语和印地语以2-2-3模式而不是3-3-3分组数字:最右边三位,然后是两位的组。100,000写为1,00,000,称为一lakh(10⁵)。10,000,000写为1,00,00,000,称为一crore(10⁷)。Intl.NumberFormat('en-IN').format(12345678)返回1,23,45,678。系统扩展到arab(10⁹)和kharab(10¹¹),尽管这些在现代使用中很少见。
此工具可以处理多大的数字?
高达Number.MAX_SAFE_INTEGER = 2⁵³ − 1 = 9,007,199,254,740,991,任何整数都能精确地经历往返。超过此值,精度开始泄漏。JSON.parse("9007199254740993")返回9007199254740992,最接近的可表示double。对于更大的值,将它们粘贴为BigInt字面量(末尾带n)或将它们视为字符串。格式化器接受两者。
我的数字会被发送到任何地方吗?
不会。Intl.NumberFormat和区域数据随你的浏览器一起发货;整个管道在本地运行。在DevTools中打开网络标签并格式化一个数字,你将看到零出站请求。对于工资、收入、账户余额或任何你不会粘贴到托管服务的数据都是安全的。