在XSL模板中将小数部分提取到变量中

时间:2012-07-06 02:02:26

标签: xslt format decimal

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

<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个字符读入变量而不是做任何数学?

1 个答案:

答案 0 :(得分:3)

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

<强>予。使用数字的字符串表示:

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

<强> II。使用标准数学函数:

$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