【问题标题】:XSLT formatting numbers, insert '-' after every 4 digits starting from the right most digitXSLT 格式化数字,从最右边的数字开始,每 4 位数字后插入“-”
【发布时间】:2013-07-10 19:42:40
【问题描述】:

我有一个 27 位数字的号码,为了便于阅读,我需要按如下格式进行格式化:

Input : 999967799857791961574987365

Expected output : 999-9677-9985-7791-9615-7498-7365

也就是说,从最右边开始,我需要在每 4 个数字后插入一个“-”

我一直在用

<xsl:value-of select="format-number($ID, '###-####-####-####-####-####-####-####')" />

但它根本不起作用。

任何帮助或指点都会很棒..干杯

【问题讨论】:

  • 您使用的是 XSLT1 还是 2?

标签: xslt numbers format


【解决方案1】:

你不能像以前那样只传递格式字符串并让它工作的原因是格式字符串中的字符都有特殊的意义。 “-”被理解为减号,而不是分组分隔符。要使其工作,您必须使用 xsl:decimal-format 定义格式并使用可选的第三个参数来引用它 format-number。这是一个完整的样式表,您可以调用任何 XML 文件来说明:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">
  <xsl:output method="text"/>
  <xsl:decimal-format name="dashes" grouping-separator="-"/>
  <xsl:template match="/">
    <xsl:value-of select="format-number(999967799857791961574987365,
                                        '-####', 'dashes')"/>
    <xsl:text>&#x0A;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

【讨论】:

  • 我知道有一种不那么老套的方法。 +1
  • 感谢@Shaun,添加十进制格式成功了,我不得不稍作修改:我的最终代码如下:&lt;xsl:value-of select='concat($RECEIPT_ID_PREFIX," ",format-number($RECEIPT_ID_UNFORMATTED,"###-####-####-####-####-####-####-####", "dashes"))'/&gt; 但是字符串 I 的最后 10 位数字格式化后得到的与我通过的不同。 Input : 11192878690839099**9898961410** Output : 111-9287-8690-8390-99**57-6890-1632** 关于为什么会发生这种情况的任何指针? PS:抱歉,评论区的格式似乎不对
【解决方案2】:

这对我来说似乎是一个 hack,但你可以试试:

<xsl:value-of select="translate(format-number($ID,',####'),',','-')"/>

这对我来说适用于 XSLT 1.0 和 2.0。

注意:$ID 必须是整数。您可能需要使用 xs:integer($ID)(可能需要 2.0 处理器)。


回复评论:

试试这个模板:

<xsl:template name="ReceiptId">
    <xsl:param name="RECEIPT_ID_UNFORMATTED"/>
    <xsl:variable name="RECEIPT_ID_FORMATTED" select="translate(format-number(xs:integer($RECEIPT_ID_UNFORMATTED),',####'),',','-')"/>
    <div class="line">
        <xsl:value-of select="concat($RECEIPT_ID_PREFIX,&quot; &quot;,$RECEIPT_ID_FORMATTED)"/>
    </div>
</xsl:template>

不要忘记在xsl:stylesheet (xmlns:xs="http://www.w3.org/2001/XMLSchema") 中声明xs 命名空间,以便您可以使用xs:integer()

【讨论】:

  • 感谢@Daniel Haley 的回复。我尝试了如下提示&lt;xsl:template name="ReceiptId" &gt; &lt;xsl:param name="RECEIPT_ID_UNFORMATTED" /&gt; &lt;xsl:variable name="RECEIPT_ID_FORMATTED" value="translate(format-number($RECEIPT_ID_UNFORMATTED,',####'),',','-')"/&gt; &lt;div class="line"&gt; &lt;xsl:value-of select='concat($RECEIPT_ID_PREFIX," ",$RECEIPT_ID_FORMATTED)' /&gt; &lt;/div&gt; &lt;/xsl:template&gt; 它给我一个样式表错误。我尝试将其转换为整数,引发异常。请您看看上面的代码并告诉我我做错了什么。
  • @Sandeep - 请查看我的编辑。你在xsl:variable 中有value 而不是select。我还假设您在样式表的其他位置声明了 $RECEIPT_ID_PREFIX
  • 是的,RECEIPT_ID_PREFIX 在其他地方声明,@Daniel,看起来我对我使用的 XSLT 版本有误,发现我们在工作中使用 XSLT 1.0 而不是最初告诉我的 2.0 . XSLT 1.0 中有 xs:integer() 的替代品吗?我试过number() 不起作用,还有其他选择吗?..我明天试试..谢谢
猜你喜欢
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 2021-05-06
  • 2014-11-09
相关资源
最近更新 更多