gpt4 book ai didi

xquery - 如何在 xquery 中格式化小数?

转载 作者:行者123 更新时间:2023-12-02 07:03:36 25 4
gpt4 key购买 nike

我正在尝试在 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。

任何帮助将不胜感激。

-----更新-----

根据 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 ()
)
};

最佳答案

使用:

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

这会产生完全想要的正确结果:

5,573,652.23

关于xquery - 如何在 xquery 中格式化小数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5838562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com