如何在XSLT中实现小数位截断(而非四舍五入)?
如何用XSLT截断小数位(不进行四舍五入)
嘿,这个问题我太熟悉了!你用format-number()的时候发现它自动四舍五入,没法实现纯截断的需求对吧?确实,format-number()默认会做四舍五入处理,所以得换个思路。下面给你几种实用的解决方案,适配不同的场景和XSLT版本:
方法1:用floor()函数(正数专属)
如果你的数值都是正数(就像你给出的17.99、19.01这些例子),floor()函数刚好能满足需求——它会返回小于等于当前数值的最大整数,相当于直接砍掉小数位:
<xsl:value-of select="floor(17.99)" /> <!-- 输出 17 --> <xsl:value-of select="floor(19.01)" /> <!-- 输出 19 --> <xsl:value-of select="floor(18.0)" /> <!-- 输出 18 -->
⚠️ 小提醒:如果要处理负数的话,floor()会返回更小的负数(比如floor(-17.99)会得到-18)。如果你需要对负数也向零截断(比如-17.99变成-17),可以看下面的方法2或3。
方法2:字符串截取法(通用所有场景)
不管数值是正还是负,也不管有没有小数点,都可以通过字符串操作直接提取整数部分,这种方法兼容性拉满:
<xsl:value-of select="if (contains(., '.')) then substring-before(., '.') else ." />
测试你的几个例子:
17.99→ 包含小数点,取小数点前的1719.01→ 取小数点前的1918.0→ 取小数点前的18- 像
20这种不带小数的数值,直接返回原数就行。
方法3:XSLT 2.0+ 类型转换(简洁通用)
如果你用的是XSLT 2.0或更高版本,直接把数值转换成xs:integer类型就搞定了——它会自动向零截断小数部分,正负都适用:
<xsl:value-of select="xs:integer(17.99)" /> <!-- 输出 17 --> <xsl:value-of select="xs:integer(-17.99)" /> <!-- 输出 -17 -->
这个方法代码最简洁,推荐在支持XSLT2.0的环境下优先使用。
内容的提问来源于stack exchange,提问作者prime
相关产品推荐
相关产品推荐

