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 之后很久).
错误条目中的讨论表明主要考虑是防止零被格式化为空字符串。或许,事后看来,我们应该特别对待那个案例。
我多年来一直在 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 theminimum-fractional-part-size
are both zero, then theminimum-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 之后很久).
错误条目中的讨论表明主要考虑是防止零被格式化为空字符串。或许,事后看来,我们应该特别对待那个案例。