2011-04-30 58 views
5

我想在XQuery中格式化小數。小數點是貨幣,所以格式應該是,###.##如何格式化xquery中的小數?

例如:

5573652.23應該5,573,652.23

352769352,769(或352,769.00如果它更容易/清潔劑)

現在,我使用這個函數http://www.xqueryhacker.com/2009/09/format-number-in-xquery/,但我不能用小數:

declare function local:format-int($i as xs:int) as xs:string 
{ 
    let $input := 
    if ($i lt 0) then fn:substring(fn:string($i), 2) 
    else fn:string($i) 
    let $rev := fn:reverse(fn:string-to-codepoints(fn:string($input))) 
    let $comma := fn:string-to-codepoints(',') 

    let $chars := 
    for $c at $i in $rev 
    return (
     $c, 
     if ($i mod 3 eq 0 and fn:not($i eq count($rev))) 
     then $comma else() 
    ) 

    return fn:concat(
    if ($i lt 0) then '-' else(), 
    fn:codepoints-to-string(fn:reverse($chars)) 
) 
}; 

我爲我的處理器使用了Saxon 9HE。

任何幫助將不勝感激。

----- ----- UPDATE

基於Dimitre的回答,我修改了功能,節省小數部分,並將其添加到返回字符串的結尾。

新功能

declare function local:format-dec($i as xs:decimal) as xs:string 
{ 
    let $input := tokenize(string(abs($i)),'\.')[1] 
    let $dec := substring(tokenize(string($i),'\.')[2],1,2) 
    let $rev := reverse(string-to-codepoints(string($input))) 
    let $comma := string-to-codepoints(',') 

    let $chars := 
    for $c at $i in $rev 
    return (
     $c, 
     if ($i mod 3 eq 0 and not($i eq count($rev))) 
     then $comma else() 
    ) 

    return concat(if ($i lt 0) then '-' else(), 
       codepoints-to-string(reverse($chars)), 
       if ($dec != '') then concat('.',$dec) else() 
       ) 
}; 
+0

問得好,+1。查看我的答案以獲得完整且簡短的解決方案:) – 2011-05-01 18:02:30

+0

對於標準XPath函數,不需要使用任何名稱空間前綴。如果你省略了前綴「fn:」,你的代碼將更具可讀性。另外,目前你的編碼是不一致的:你爲什麼在'concat()'函數的前綴,而不是'substring()'函數的前綴? – 2011-05-02 01:35:00

+0

@Dimitre:我通常不會前綴標準函數,但是我從上面提到的網站複製了這個函數。這是不一致的,因爲我在進行修改時沒有去掉前綴。我必須經過並清理它,以免混淆任何人。再次感謝。非常感激你的幫助! – 2011-05-02 01:48:16

回答

3

使用

let $n := 5573652.23 
return 
     concat(local:format-int(xs:int(floor($n))), 
      '.', 
      substring(string($n - floor($n)), 3) 
      ) 

這正好產生想要的,正確的結果

5,573,652.23 
+0

非常感謝Dimitre。基於這個答案,我更新了我正在使用的功能。 +1並接受答案。 – 2011-05-02 01:08:40

+0

@DevNull:不客氣。 – 2011-05-02 01:14:54

0

這並不爲你工作?:

format-number(5573652.23,",###.##") 

你可以用這個here玩。我很確定撒克遜人支持這個功能。

編輯:此功能在撒克遜不支持(見下面的註釋)。

+1

不,不支持'format-number()'。那是我嘗試的第一件事。我嘗試從HE更改爲PE&EE,但仍然出現錯誤:'F [Saxon-EE XQuery 9.3.0.4]系統函數格式 - 編號#2不適用於此主機語言。 +1雖然 – 2011-04-30 20:49:55

+0

'format-number()'僅在XSLT的範圍內,所以建議使用一個好的建議。 – 2011-05-01 03:06:58