Solved

zero after decimal point dropped when no number before decimal point, .06 cents becomes .60 cents

Posted on 2003-10-21
9
399 Views
Last Modified: 2012-06-21
When I transform my XML to HTML, I lose the zero after the decimal point, IF, there is no number before the decimal point.

In the XML                  In the HTML

1.06                        1.06
0.06                        0.6
.06                        0.6

My XSL

<xsl:template match="value">
<xsl:choose>
  <xsl:when test=".!=''">
    <xsl:choose>
      <xsl:when test="number(.)=number(.)">
        <xsl:value-of select="format-number(.,'###,##0.0###')" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="." />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:when>

I have tried (.,'###,##0.####')
and      (.,'###,##0.00##'),    etc.,  with no luck.    6 cents always ends up as 60 cents.
0
Comment
Question by:rcheney
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
  • 2
9 Comments
 
LVL 4

Expert Comment

by:Xikilm
ID: 9591032
Hi rcheney:

What are you using for your parser?  I passed the above numbers and stylesheet through Xalan, and it returns the correct results.



-Xikilm
0
 

Author Comment

by:rcheney
ID: 9591519
I am using Altova, the "XML Spy" parser.
0
 
LVL 4

Expert Comment

by:Xikilm
ID: 9591587
Just did a quick search and found this:

http://www.altova.com/Fixed_Defects.html
3573 | XSLT format-number removes leading 0 from decimal part of value | Spy Ent | AltovaXSLT

Sounds like its a known problem that is fixed in "Release 3".  HTH.


-Xikilm
0
Tutorials alone can't teach real engineering

So we built better training tools.

-Hands-on Labs
-Instructor Mentoring
-Scenario-Based Tests
-Dedicated Cloud Servers

All at your fingertips. What are you waiting for?

 
LVL 2

Expert Comment

by:weareu
ID: 9593242
It is a known problem and it was supposedly fixed in release 3 but it still doesn't seem to always work correctly... I suggest just writing an ugly little hack which check if the value starts with either 0 or '.' and then after formatting just selecting the value of the first part (before the '.') + a '.0' and then the value after the '.'. Quite nasty but successful.
0
 

Author Comment

by:rcheney
ID: 9593570
You are right.  They either didn't fix it, or it was working correctly and they broke it.  Anyway I agree the nasty hack is the way to go.  Could I trouble you for a little help or just point me in the right direction.  I started the hack by finding the decimal point and zero like you said <xsl:when test="contains(number(.),'.0')">  but how do I split the number and deal with the before and after the decimal point parts?

<xsl:template match="value">
<xsl:choose>
<xsl:when test=".!=''">
<xsl:choose>
<xsl:when test="number(.)=0">0</xsl:when>
<xsl:when test="number(.)=number(.)">
<xsl:choose>
<xsl:when test="contains(number(.),'.0')">

Here I find the decimal point zero but how do I split the before and after and format separately??

</xsl:when>
</xsl:choose>
<xsl:value-of select="format-number(.,'###,##0.0###')"/></xsl:when>
0
 

Author Comment

by:rcheney
ID: 9593705
I think I need to make a parameter and then create the before and after variables.

<xsl:param name="numwithdecimal" select="number(.)"/>
<xsl:variable name="beforedecimal" select="substring-before(numwithdecimal, '.')"/>
<xsl:variable name="afterdecimal" select="substring-before(substring-after(numwithdecimal, '.'),'.')"/>

and then (after formatting the separate pieces) put the result back together like below

<xsl:when test="contains(number(.),'.0')">
<xsl:value-of select="beforedecimal"/> AND <xsl:value-of select="afterdecimal"/>

    How do I format the separate pieces?
0
 
LVL 2

Accepted Solution

by:
weareu earned 125 total points
ID: 9593922
<xsl:template match="value">
<xsl:choose>
  <xsl:when test=".!=''">
    <xsl:choose>
      <xsl:when test="number(.)=number(.)">
         <xsl:choose>
            <xsl:when test="starts-with(.,'.') or starts-with(.,'0')">
                  <xsl:value-of select="format-number(number(substring-before(.,'.')),'###,###')"/>.0<xsl:value-of select="format-number(number(substring-after(.,'.')),'##')"/>
             </xsl:when>
             <xsl:otherwise>
                <xsl:value-of select="format-number(.,'###,##0.0###')"/>
             </xsl:otherwise>
         </xsl:choose>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="." />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:when>
  <xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:template>

couldn't really test this, but see if it works or if you could rip it appart and make it work...
0
 

Author Comment

by:rcheney
ID: 9594061
Thanks that looks great.  I haven't had time to test it yet but it gets me close enough so I can tweak it, if necessary.   A big thanks to wearu and  Xikilm.
0
 
LVL 4

Expert Comment

by:Xikilm
ID: 9594066
When I run ".06" through it returns a "NaN.06".  Not sure if you're having similar problems with your parser.  If so, you can fix it with:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:decimal-format name="test" NaN="0"/>
    <xsl:template match="value">
<xsl:choose>
  <xsl:when test=".!=''">
    <xsl:choose>
      <xsl:when test="number(.)=number(.)">
         <xsl:choose>
            <xsl:when test="starts-with(.,'.') or starts-with(.,'0')">
                  <xsl:value-of select="format-number(number(substring-before(.,'.')),'###,###','test')"/>.0<xsl:value-of select="format-number(number(substring-after(.,'.')),'##')"/>
             </xsl:when>
             <xsl:otherwise>
                <xsl:value-of select="format-number(.,'###,##0.0###')"/>
             </xsl:otherwise>
         </xsl:choose>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="." />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:when>
  <xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>


-Xikilm
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
Many times as a report developer I've been asked to display normalized data such as three rows with values Jack, Joe, and Bob as a single comma-separated string such as 'Jack, Joe, Bob', and vice versa.  Here's how to do it. 
Michael from AdRem Software explains how to view the most utilized and worst performing nodes in your network, by accessing the Top Charts view in NetCrunch network monitor (https://www.adremsoft.com/). Top Charts is a view in which you can set seve…
Sometimes it takes a new vantage point, apart from our everyday security practices, to truly see our Active Directory (AD) vulnerabilities. We get used to implementing the same techniques and checking the same areas for a breach. This pattern can re…

615 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question