对于这个XSLT:
<xsl:variable name="source0" select="number(num2)"/>
<xsl:variable name="source1" select="number(num3)"/>
s0 plain: <xsl:value-of select="$source0"/>
s1 plain: <xsl:value-of select="$source1"/>
test11: <xsl:value-of select="format-number($source0, '#.#')"/>
test12: <xsl:value-of select="format-number($source0, '#.###############')"/>
test21: <xsl:value-of select="format-number($source1, '#.#')"/>
test22: <xsl:value-of select="format-number($source1, '#.###############')"/>
对于XML:
<num2>123456.1234</num2>
<num3>1234567.1234</num3>
我得到了这个输出(使用Saxon 9.2,XSLT 2.0)
s0 plain: 123456.1234
s1 plain: 1.2345671234E6
test11: 123456.1
test12: 123456.123399999996764
test21: 1234567.1
test22: 1234567.123399999924004
首先......我很好奇为什么当它超过小数点左边的6位数时,它会突然在标准符号和科学符号之间切换?这是我的问题,我想避免科学记数法。在经过各种其他问题之后,我发现显然我无处可去格式化数字。
但格式号似乎也不起作用。尽管“s1 plain”的输出证明了处理器已知有效位数(我理解转换为double和back可能会失去精度,但是在转换后有正确的数字,所以......?),似乎无法用标准的非科学记数法输出该值。有吗?
答案 0 :(得分:2)
这是我的问题,我想避免 科学计数法。各种各样 其他问题,我发现显然 我坚持使用格式编号 无处不在。
但格式编号似乎没有 工作要么。
显然您没有使用XSLT 2.0 / XPath 2.0的相应功能。
这种转变:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:variable name="vs0" as="xs:decimal"
select="xs:decimal(num2)"/>
<xsl:variable name="vs1" as="xs:decimal"
select="xs:decimal(num3)"/>
s0 plain: <xsl:value-of select="$vs0"/>
s1 plain: <xsl:value-of select="$vs1"/>
test11: <xsl:value-of select="format-number($vs0, '#.#')"/>
test12: <xsl:value-of select="format-number($vs0, '#.###############')"/>
test21: <xsl:value-of select="format-number($vs1, '#.#')"/>
test22: <xsl:value-of select="format-number($vs1, '#.###############')"/>
</xsl:template>
</xsl:stylesheet>
应用于此XML文档时:
<nums>
<num2>123456.1234</num2>
<num3>1234567.1234</num3>
</nums>
产生精确结果:
s0 plain: 123456.1234
s1 plain: 1234567.1234
test11: 123456.1
test12: 123456.1234
test21: 1234567.1
test22: 1234567.1234
结论:当需要高精度时,请始终尝试使用xs:decimal
数据类型。