数字格式说明符方案

Number format specifier scheme

本文关键字:方案 说明符 格式 数字      更新时间:2023-09-26

我正在为数字寻找一种格式说明符方案,该方案具有普遍存在的"YYYY-MM-DD"等日期格式说明符的特征。我正在寻找:

  1. 易于处理:格式化一个数字不需要花费太多精力(算法复杂性、性能)
  2. (可选)用户友好型:用户直接使用此语法非常直观
  3. 计算数千个分隔符和小数位数

尽管我的目标域是JavaScript(即格式化Number实例),但我更喜欢标准的、直观的说明符方案,而不是JavaScript原生的。不,我认为printf数字格式说明符不够直观,无法呈现给用户。

到目前为止,我提出的方案是:

#,###.##

说:

  1. 整个部分使用由逗号分隔的3个数字组成的组
  2. 使用2小数位,并使用句点作为分隔符

我对这个计划感到"恶心",在看到更好的替代方案之前,我不想在实施它上投入太多时间。

我还经历过的是,使用格式说明符,实际使用具有数千个/十进制分隔符、小数位数等不同属性的首选项对象,并通过向用户提供可供选择的样本数输出来抽象它。

我应该忘记使用格式说明符方案,而只使用在表示层抽象的一组属性吗?是否有符合我在顶部提到的3个标准的标准(ish)说明符?

归根结底,我并非没有解决方案,我有足够的东西让我继续前进。我只是在寻找一个更理想的解决方案。

XSLT是一个具有全面十进制格式方案的标准。

format-number(5351,"#,###.##")

ECMA-402是另一个标准,它具有数字格式API:

可以使用Intl.NumberFormat构造函数和所需的区域设置标记和选项来构造区域性敏感的NumberFormat对象。NumberFormat对象的格式化方法可用于基于区域设置和选项集格式化数字数据。Number.prototype.toLocaleString也已更新为在内部使用Intl.NumberFormat进行区域性敏感格式设置,并且现在支持两个可选参数-区域设置和选项。

var number = 1123456.789;
// request a US formatted number
console.log("United States: " + new Intl.NumberFormat('en-US').format(number));
// limit to three significant digits
console.log("3 significant digits: " + new Intl.NumberFormat('en-US', { maximumSignificantDigits: 3 }).format(number));
// request a French formatted number
console.log("France: " + new Intl.NumberFormat('fr-FR').format(number));
// request a Indian formatted number
console.log("India: " + new Intl.NumberFormat('en-IN').format(number));

一个更用户友好的解决方案是类似于CFML的NumberFormat或DecimalFormat方案。

参考

  • 使用IE11在JavaScript中构建面向世界的应用程序–IEBlog

  • Intl.NumberFormat-JavaScript|MDN

  • 语言子标签查找应用

  • 选择语言标签

  • W3C I18N服务器设置技术