Many thanks Christian - I don't know why I didn't think of decimal. I will review my xquery types and arrays. Thanks again - much appreciated :) Adam ! lobotomy()
On Thu, Feb 4, 2021 at 11:57 PM Christian Grün christian.gruen@gmail.com wrote:
Hi Adam,
It’s recommendable to use xs:decimal instead of xs:float. Here’s one solution…
declare function local:sumVec($seq) { let $count := max(($seq ! string() ! replace(., '[^_]', '') ! string-length())) + 1 let $sums := ( for $c in 1 to $count return sum( for $item in $seq let $tokens := tokenize(string($item), '_') return try { xs:decimal($tokens[$c]) } catch * { 0 } ) ) return string-join($sums, '_') };
…and another one (presumably more cryptic):
declare function local:sumVec($seq) { let $numbers := ( for $item in $seq return array { for $token in tokenize(string($item), '_') return try { xs:decimal($token) } catch * { 0 } } ) return string-join( for $c in 1 to max($numbers ! array:size(.)) return sum($numbers[array:size(.) >= $c]?($c)) , '_') };
Hope this helps, Christian
On 2/4/21, Adam Law adamjameslaw@gmail.com wrote:
(: Hello I have a hopefully not too silly question ... Is there an easy way to remove the exponent notation and return 30000201_30000000 without working out where the E is in the parts and padding zeros ====> <a> <d>3.0000201E7_3.0E7</d>
</a> :) declare function local:sumVec($a,$opt){ let $a := <x>{for $w at $pos in $a return for $v at $pos in tokenize(xs:string($w),"_") return element {'a'} { (attribute {'pos'} {$pos}, try {xs:float($v)} catch * {0} )} }</x> let $b := string-join(for $w in distinct-values($a//@pos) return if ($opt=0) then sum($a/a[@pos=$w]) ,"_") return $b };
let $a := '' return <a>
<d>{local:sumVec(('10000001_10000000','10000000_10000000','10000000_10000000','100_',100),0)}</d>
</a>