【问题标题】:Using XSLT format-number function to round value to 2 decimal place monatery amount使用 XSLT 格式数字函数将值四舍五入到小数点后 2 位货币金额
【发布时间】:2019-07-22 08:37:37
【问题描述】:

我需要将货币金额格式化为小数点后 2 位,即使金额中实际上有 4 位小数。最后 2 位小数应始终为 0。

举个例子:

2480130 应格式化为 2480100

值的长度应保持不变,但最后 2 位数字应始终为零以向下舍入货币值。

目前我正在使用以下 XSLT:

<xsl:value-of select="format-number((Amounts/NetUnitPrice * 10000),'############00')"/>

但这不会将最后 2 位数字转换为 0。

关于格式数字功能的一些文档可以在这里找到https://www.w3schools.com/xml/func_formatnumber.asp

我可以使用什么模式来使用 format-number 函数来完成此任务?货币价值不得以任何方式更改,除非四舍五入到小数点后 2 位,这一点非常重要。我应该为此使用其他功能吗?

【问题讨论】:

  • 这里的实际输入是什么?将 2480130 舍入到 2480100 很简单:round($number div 100) * 100.

标签: xml xslt format decimal biztalk


【解决方案1】:

使用这个。它将把最后 2 位数字替换为 00。

<xsl:value-of select="replace(format-number((Amounts/NetUnitPrice* 10000),'############00'), '..$', '00')"/>

【讨论】:

  • 谢谢。我忘了提到我只能使用 XSLT 1.0,所以我无法使用替换功能。是否有可用于 XSL 1.0 的类似功能可供我使用?
【解决方案2】:

我设法找到一个解决方案,将金额缩短 2 位小数并在值的末尾连接“00”。这也正确地将值向上/向下舍入。请看下面的代码:

<xsl:value-of select="concat(format-number((Amounts/NetUnitPrice * 100),'#############0'), '00')"/>

【讨论】:

    【解决方案3】:

    请注意,XSLT 1.0 中的 format-number() 并未明确指定使用哪种舍入算法。它是通过参考 JDK 1.1 规范(现在很难掌握)来定义的,但是 Java 提供了舍入算法的选择,而 XSLT 1.0 没有说明使用哪种算法。所以最好不要依赖format-number() 向零舍入,即使这是您当前的实现所做的。

    【讨论】:

    • 感谢您的解释。是的,我知道 format-number 确实使用了一些定义不明确的舍入算法。在这种情况下,尽管它足以满足要求。
    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多