XSL - 舍入/格式数问题

Jul*_*lio 26 xml xslt formatting numbers rounding

我试图从我的xml中获取一个数字的值到2 dec的位置.

XML:<Quantity>0.0050</Quantity>

XSL:<xsl:value-of select="format-number($quantity, '####0.00')" />

但是,XSL似乎0.00在页面的一个区域和另一个区域中存在此值和输出的问题0.01.当然,在这种情况下,有利于0.01 所有领域的产出.

另一个区域具有4.221XSL输出的价值4.23.

我确实意识到,format-number作为一种方法,将数字转换为字符串.

不知道如何解决这个问题.


编辑:

好了一下,我发现这有效:

<xsl:value-of select='format-number( round(100*$quantity) div 100 ,"##0.00" )' />
Run Code Online (Sandbox Code Playgroud)

通过这个网站

正如这个家伙提到的那样,XSL使用"银行家四舍五入"来舍入到偶数而不是更大的数字.

解决方案似乎不太优雅,意味着为已经庞大而复杂的XSL文件添加大量额外功能.当然我错过了什么?

ann*_*ata 20

不确定为什么格式会如此不一致,但是从内存来看,它的规格是......复杂的.

同时,您可以使用round函数(ref).这不是完美的,但功能性.如果您需要特定数量的sig figs,您可以使用THE POWER OF MATHS!并做一些类似的事情:

<xsl:value-of select="round(yournum*100) div 100"/>


Gil*_*les 15

我在XSLT/XPath 1.0中遇到了无穷无尽的小数问题,通常是将小数表示为浮点数并使用半偶数舍入(银行家舍入)的组合.不幸的是,round(yournum*100) div 100由于浮点不精确,这种方法对我不起作用.例如,将1.255乘以100得到125.49999999999999(这并不意味着依赖于实现,因为它应该是IEEE 754,但我不知道是否所有实现都遵循这一点).四舍五入时,则得到125,而不是所需的126.

我采取了以下方法,我觉得有效(虽然这总是一个棘手的领域,所以我不会声明太多的信心!).但是,它取决于支持EXSLT扩展的XSLT引擎.它假设您想要舍入到小数点后两位.

<func:function name="local:RoundHalfUp">
    <xsl:param name="number"/>

    <xsl:choose>
        <xsl:when test="contains($number, '.')">
            <xsl:variable name="decimal" select="estr:split($number, '.')[2]"/>
            <xsl:choose>
                <xsl:when test="string-length($decimal) &gt; 2">
                    <func:result select="format-number(concat($number, '1'), '0.00')"/>
                </xsl:when>
                <xsl:otherwise>
                    <func:result select="format-number($number, '0.00')"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:when>
        <xsl:otherwise>
            <func:result select="format-number($number, '0.00')"/>
        </xsl:otherwise>
    </xsl:choose>

</func:function>
Run Code Online (Sandbox Code Playgroud)

可以这样称为:

<xsl:value-of select="local:RoundHalfUp(1.255)"/>
Run Code Online (Sandbox Code Playgroud)

命名空间是:

xmlns:func="http://exslt.org/functions"
xmlns:estr="http://exslt.org/strings"
xmlns:local="http://www.acme.org/local_function"
Run Code Online (Sandbox Code Playgroud)

重要的是要注意该函数附加一个'1',而不是添加0.001或类似.

如果它是一个选项(因为它有一个正确的十进制类型),最好使用XSLT 2.0,但我知道这通常不是一个选项(来自痛苦的经历!).