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文件添加大量额外功能.当然我错过了什么?
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) > 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,但我知道这通常不是一个选项(来自痛苦的经历!).
| 归档时间: |
|
| 查看次数: |
59477 次 |
| 最近记录: |