declare function local:format-number($number as xs:decimal, $format as xs:string) as xs:string { let $strNumber := string( if (ends-with($format, "%")) then $number*100 else $number ) let $decimalPart := codepoints-to-string( local:format-number-decimal( string-to-codepoints( substring-after($strNumber, ".") ), string-to-codepoints( substring-after($format, ".") ) ) ) let $integerPart := codepoints-to-string( local:format-number-integer( reverse( string-to-codepoints( if(starts-with($strNumber, "0.")) then "" else if( contains($strNumber, ".") ) then substring-before($strNumber, ".") else $strNumber ) ), reverse( string-to-codepoints( if( contains($format, ".") ) then substring-before($format, ".") else $format ) ), 0, -1 ) ) return if (string-length($decimalPart) > 0) then concat($integerPart, ".", $decimalPart) else $integerPart }; declare function local:format-number-decimal($number as xs:integer*, $format as xs:integer*) as xs:integer* { if ($format[1] = 35 or $format[1] = 48) then if (count($number) > 0) then ($number[1], local:format-number-decimal(subsequence($number, 2), subsequence($format, 2))) else if ($format[1] = 35) then () else ($format[1], local:format-number-decimal((), subsequence($format, 2))) else if (count($format) > 0) then ($format[1], local:format-number-decimal($number, subsequence($format, 2))) else () }; declare function local:format-number-integer($number as xs:integer*, $format as xs:integer*, $thousandsCur as xs:integer, $thousandsPos as xs:integer) as xs:integer* { if( $thousandsPos > 0 and $thousandsPos = $thousandsCur and count($number) > 0) then (local:format-number-integer($number, $format, 0, $thousandsCur), 44) else if ($format[1] = 35 or $format[1] = 48) then if (count($number) > 0) then (local:format-number-integer(subsequence($number, 2), subsequence($format, 2), $thousandsCur+1, $thousandsPos), $number[1]) else if ($format[1] = 35) then () else (local:format-number-integer((), subsequence($format, 2), $thousandsCur+1, $thousandsPos), $format[1]) else if (count($format) > 0) then if ($format[1] = 44) then (local:format-number-integer($number, subsequence($format, 2), 0, $thousandsCur), $format[1]) else (local:format-number-integer($number, subsequence($format, 2), $thousandsCur+1, $thousandsPos), $format[1]) else if (count($number) > 0) then (local:format-number-integer(subsequence($number, 2), $format, $thousandsCur+1, $thousandsPos), $number[1]) else () }; local:format-number(12345678.9, '#,###.00')(: Stylus Studio meta-information - (c) 2004-2006. Progress Software Corporation. All rights reserved. :)