Andoy Abarquez
Andoy Abarquez

Reputation: 1149

How to change all decimal to Zeroes using XSL

How to change all decimal value to zeroes in XSL

Example value:

from : 9876.123

to : 9876.000

Upvotes: 0

Views: 108

Answers (2)

Dimitre Novatchev
Dimitre Novatchev

Reputation: 243479

In case the number of digits after the decimal point is unknown in advance, use:

concat(substring-before(., '.'),
       '.', 
       translate(substring-after(., '.'), '123456789', '000000000'))

Here is a complete XSLT transformation example:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="d">
    <xsl:value-of select=
        "concat(substring-before(., '.'),
                '.', 
                translate(substring-after(.,'.'), '123456789','000000000'))"/>
  </xsl:template>
</xsl:stylesheet>

When this transformation is applied on the following XML document:

<t>
   <d>9876.1</d>
   <d>9876.12</d>
   <d>9876.123</d>
   <d>9876.1234</d>
   <d>9876.12345</d>
   <d>9876.123456</d>
   <d>9876.1234567</d>
   <d>9876.12345678</d>
   <d>9876.123456789</d>
</t>

the wanted, correct result is produced:

   9876.0
   9876.00
   9876.000
   9876.0000
   9876.00000
   9876.000000
   9876.0000000
   9876.00000000
   9876.000000000

Update

Someone requested that integer values (not containing decimal point) are also processed correctly (copied intact).

I also added to this that negative values and / or currency denominations should also be processed correctly.

Although this falls outside the scope of the current problem, here is again a single XPath 1.0 expression that produces the wanted result:

concat(substring-before(concat(., '.'), '.'),
        translate(., '+-$0123456789', ''), 
        translate(substring-after(.,'.'), '123456789','000000000'))

And here again is the complete transformation:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="d">
    <xsl:value-of select=
    "concat(substring-before(concat(., '.'), '.'),
            translate(., '+-$0123456789', ''), 
            translate(substring-after(.,'.'), '123456789','000000000'))"/>
  </xsl:template>
</xsl:stylesheet>

When this transformation is applied on the following XML document:

<t>
   <d>-$1.234</d>
   <d>-1.234</d>
   <d>-.234</d>
   <d>9876</d>
   <d>9876.1</d>
   <d>9876.12</d>
   <d>9876.123</d>
   <d>9876.1234</d>
   <d>9876.12345</d>
   <d>9876.123456</d>
   <d>9876.1234567</d>
   <d>9876.12345678</d>
   <d>9876.123456789</d>
</t>

the wanted, correct result is produced:

   -$1.000
   -1.000
   -.000
   9876
   9876.0
   9876.00
   9876.000
   9876.0000
   9876.00000
   9876.000000
   9876.0000000
   9876.00000000
   9876.000000000

Upvotes: 1

michael.hor257k
michael.hor257k

Reputation: 116993

Well,

floor(9876.123)

returns:

9876

and:

format-number(floor(9876.123), '#.000')

returns:

9876.000

I don't see why this would be useful, but in case you do want to preserve the number of decimal places, I would use:

format-number(floor($amount), translate($amount, '123456789', '000000000'))

Upvotes: 4

Related Questions