4

在执行 ceil 函数之前,我需要将小数点后的 2 个位置(货币金额,因此最多只需要 2 个位置)存储在 XSL 变量中。

<xsl:element name="BaseFare"><xsl:value-of select="ceiling(BaseAmount/Amount * (1 - ($promoDisc div 100)))"/></xsl:element>

例如。如果金额的结果是 499 并且 promoDisc = 8%,那么折扣金额将为 459.08 - 我需要将“08”(带零)存储在一个变量中以备后用,同时我返回上限金额 (460)在输出 XML 中。以为我可以只做一个字符串函数并将小数点后的 2 个字符读入变量而不是做任何数学运算?

4

1 回答 1

4

有多种方法可以进行此提取:

I. 使用数字的字符串表示

concat('.',substring(substring-after($x, '.'), 1, 2))

二、使用标准数学函数

$x - floor($x)

这将计算为任何正数的小数部分$x

使用以下函数之一:format-number(), round(), round-half-to-even()(仅 XPath 2.0 / XSLT 2.0 可用的最后一个函数)将其四舍五入到小数点后两位。

在 XSLT 1.0 中,从正数中准确获取小数点后两位小数的数字的一种方法(截断不四舍五入)是:

format-number(
              floor(100* $x) div 100
             -
              floor(floor(100* $x) div 100),
              '.00'
              )

以下是所描述方法的完整示例:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">

   <xsl:value-of select=
   "concat('.',substring(substring-after(0.12543, '.'), 1, 2))"/>
=========
   <xsl:value-of select=
      "format-number(0.12543, '.00')"/>
=========
   <xsl:value-of select=
    "format-number(
                   floor(100* 999.12543) div 100
                  -
                   floor(floor(100* 999.12543) div 100),
                   '.00'
                   )
      "/>
 </xsl:template>
</xsl:stylesheet>

当将此转换应用于任何 XML 文档(未使用)时,结果是:

   .12
=========
   .13
=========
   .12
于 2012-07-06T03:07:13.020 回答