format-number() with picture string '#.##'

format-number() with picture string '#.##'

我多年来一直在 XSLT 1.0 代码中使用图片字符串“#.##”来格式化带有小数部分的数字,如果它们有小数部分,则不显示小数。

Saxon 6.5.5.
format-number(123.456,'#.##’)   123.46
format-number(123.000,'#.##’)   123

但是在使用 XSLT 2.0 或 3.0 时,我的行为有所不同。

Saxon 9.9.1.5J
format-number(123.456,'#.##’)   123.46
format-number(123.000,'#.##’)   123.0

我一直想不通为什么最后一个案例有小数部分。 https://www.w3.org/TR/xslt20/#dt-picture-string 状态:

The minimum-fractional-part-size is set to the number of zero-digit-sign characters found in the fractional part of the sub-picture.

https://www.w3.org/TR/xpath-functions-30/#syntax-of-picture-string 状态:

The minimum-fractional-part-size is set to the number of decimal-digit-family characters found in the fractional part of the sub-picture.

并且没有零数字符号和十进制数字系列字符,小数大小应该为零,就像在 XSLT 1.0 中一样。

我是不是漏掉了什么?

Saxon 正在应用规则:

If (after making the above adjustments) the minimum-integer-part-size and the minimum-fractional-part-size are both zero, then the minimum-fractional-part-size is set to 1 (one).

format-number() 的 XSLT 1.0 规范是参考 JDK 1.1 规范定义的,这是一个严重的错误,因为 (a) 它在 JDK 中总是严重不足, (b) JDK 规范的那个版本现在几乎不可能得到。因此,我们花了很多快乐的时间从头开始编写一个新的规范,试图在清晰且没有错误的情况下重现 JDK 规范,但填补了空白。我们考虑了不同 XSLT 1.0 供应商解释规范的方式,但并未将任何现有实现(或 JDK)视为最终实现。

您的测试用例类似于 https://github.com/w3c/qt3tests/blob/master/fn/format-number.xml, and the notes for this test case refer to bug 29164. The bug entry at https://www.w3.org/Bugs/Public/show_bug.cgi?id=29164 处的测试用例 numberformat228 表明上面引用的规则是相当晚的 addition/change 规范(2015 年 9 月 - 在 XPath 2.0 之后很久).

错误条目中的讨论表明主要考虑是防止零被格式化为空字符串。或许,事后看来,我们应该特别对待那个案例。