Solved

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

Posted on 2003-10-21
9
388 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
  • 4
  • 3
  • 2
9 Comments
 
LVL 4

Expert Comment

by:Xikilm
Comment Utility
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
Comment Utility
I am using Altova, the "XML Spy" parser.
0
 
LVL 4

Expert Comment

by:Xikilm
Comment Utility
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
 
LVL 2

Expert Comment

by:weareu
Comment Utility
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
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 

Author Comment

by:rcheney
Comment Utility
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
Comment Utility
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
Comment Utility
<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
Comment Utility
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
Comment Utility
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

Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

Join & Write a Comment

Introduction In my previous article (http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/SSIS/A_9150-Loading-XML-Using-SSIS.html) I showed you how the XML Source component can be used to load XML files into a SQL Server database, us…
The Confluence of Individual Knowledge and the Collective Intelligence At this writing (summer 2013) the term API (http://dictionary.reference.com/browse/API?s=t) has made its way into the popular lexicon of the English language.  A few years ago, …
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…
Here's a very brief overview of the methods PRTG Network Monitor (https://www.paessler.com/prtg) offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…

771 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

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now