跳转到内容

XQuery/数字格式化

来自维基教科书,自由的教科书

您希望能够通过指定数字的格式来轻松格式化数字。例如,如果您想使用逗号和两位小数格式化带有前导美元符号的数字,您将使用以下“格式”

   format-number($my-decimal, "$,000.00")

如果输入数字为1234,则输出将为$1,234.00

方法 1 - XSLT 包装器

[编辑 | 编辑源代码]

format-number 是 XSLT 1.0 和 XPath 2.0 中的标准函数。它也包含在XQuery 1.1 需求草案中。为了在 eXist 中使用它,我们只需要为 Saxon XSLT format-number() 函数编写一个包装器。为此,您需要执行以下操作

  1. http://prdownloads.sourceforge.net/saxon/saxonb9-1-0-2j.zip下载 Saxon9B XSLT 程序的副本
  2. 解压缩包并将三个 jar 文件(saxon9.jar、saxon9-dom.jar 和 saxon9-xpath.jar)复制到 eXist lib/endorsed 文件夹中
  3. 在 eXist conf.xml 文件中注释掉以下行 <transformer class="org.apache.xalan.processor.TransformerFactoryImpl"/>
  4. 取消注释三个启用 Saxon 作为默认 XSLT 的行
  5. 重新启动 eXist 服务器
  6. 添加一个将包装简单 XSLT 的函数。请参阅以下示例代码。

源代码

[编辑 | 编辑源代码]

我们将创建一个接受两个参数的 XQuery 函数。一个是十进制数,另一个是指定格式的字符串。我们将这两个参数都传递给一个小型的 XSLT 样式表。

(: the numeric picture format function from XPath 2.0.  To work with eXist we must enable Saxon as the default XSLT engine.  See the conf.xml file in the eXist folder for details. :)

declare function local:format-number($n as xs:decimal ,$s as xs:string) as xs:string {
    string(transform:transform(
      <any/>,
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
         <xsl:template match='/'>
            <xsl:value-of select="format-number({$n},'{$s}')"/>
         </xsl:template>
      </xsl:stylesheet>,
      ()
    ))
};

XSLT 1.0 format-number() 函数接受两个参数。第一个是十进制数,第二个是表示您期望的输出图片的字符串。格式字符串在 Java 类DecimalFormat 中定义

如果您想要使用逗号分隔的值:local:format-number($my-decimal, ',000')

如果您想要使用前导美元符号:local:format-number($my-decimal, '$,000')

负数的格式在第二个格式字符串后面用逗号分隔。

如果您想要负数带有减号:local:format-number($my-decimal, '0,000.00;-0,000.00')

运行测试

[编辑 | 编辑源代码]

运行

方法 2 - XQuery 函数

[编辑 | 编辑源代码]

Minollo 在他的博客中发布了一个 XQuery 函数。他的代码通过了一套测试。

运行测试

我们真诚地希望 XQuery 的未来版本包含允许开发人员轻松格式化数字和日期格式的函数。

参考资料

[编辑 | 编辑源代码]

XML Connections 博客上关于 format-number() 的博客文章,用 XQuery 编写

华夏公益教科书