我想在XQuery中格式化小數。小數點是貨幣,所以格式應該是,###.##
。如何格式化xquery中的小數?
例如:
5573652.23
應該5,573,652.23
和
352769
應352,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()
)
};
問得好,+1。查看我的答案以獲得完整且簡短的解決方案:) – 2011-05-01 18:02:30
對於標準XPath函數,不需要使用任何名稱空間前綴。如果你省略了前綴「fn:」,你的代碼將更具可讀性。另外,目前你的編碼是不一致的:你爲什麼在'concat()'函數的前綴,而不是'substring()'函數的前綴? – 2011-05-02 01:35:00
@Dimitre:我通常不會前綴標準函數,但是我從上面提到的網站複製了這個函數。這是不一致的,因爲我在進行修改時沒有去掉前綴。我必須經過並清理它,以免混淆任何人。再次感謝。非常感激你的幫助! – 2011-05-02 01:48:16