如何在XSL中提取并格式化价格为两位小数?
解决XSL中价格格式化为两位小数的问题
看起来你的当前代码处理后得到的字符串里包含了多余内容,我们需要先提取出正确的价格数值,再将其格式化为89.00这样的两位小数形式。下面分XSLT版本给出解决方案:
如果你使用的是XSLT 2.0及以上版本(推荐)
这个版本支持更强大的字符串处理函数,一行代码就能搞定:
<xsl:value-of select="format-number(tokenize(normalize-space(translate(g:price, ' PLN', '')), ' ')[last()], '0.00')"/>
代码解释:
translate(g:price, ' PLN', ''):移除价格字符串中的空格和PLN字符normalize-space():去除字符串首尾空格并将中间多个空格合并为一个tokenize(..., ' '):将处理后的字符串按空格分割成多个子片段[last()]:取分割后的最后一个元素,也就是目标价格数值89.0000format-number(..., '0.00'):将数值格式化为保留两位小数的形式
如果你使用的是XSLT 1.0版本
XSLT 1.0没有tokenize函数,需要用递归模板提取最后一个数值,再进行格式化:
首先定义一个用于提取最后一个字符串片段的模板:
<xsl:template name="get-last-token"> <xsl:param name="string"/> <xsl:choose> <xsl:when test="contains($string, ' ')"> <xsl:call-template name="get-last-token"> <xsl:with-param name="string" select="substring-after($string, ' ')"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$string"/> </xsl:otherwise> </xsl:choose> </xsl:template>
然后在需要处理价格的地方使用以下代码:
<!-- 先处理原始价格字符串,移除多余字符和空格 --> <xsl:variable name="processed-price" select="normalize-space(translate(g:price, ' PLN', ''))"/> <!-- 调用模板提取最后一个数值部分 --> <xsl:variable name="raw-price"> <xsl:call-template name="get-last-token"> <xsl:with-param name="string" select="$processed-price"/> </xsl:call-template> </xsl:variable> <!-- 格式化为两位小数 --> <xsl:value-of select="format-number(number($raw-price), '0.00')"/>
代码解释:
- 模板
get-last-token通过递归调用,每次截取空格后的字符串,直到没有空格为止,最终得到最后一个数值片段 number($raw-price)将提取到的字符串转换为数值类型,确保format-number能正确处理format-number(..., '0.00')负责将数值格式化为两位小数的形式
这样处理后,就能把你的原始输出转换成89.00的格式啦。
内容的提问来源于stack exchange,提问作者Dawid Kwiatoń
相关产品推荐
相关产品推荐

