xsl-list
[Top] [All Lists]

RE: convert integers to words

2004-09-17 11:31:34
In Saxon it can be done with rather fewer lines of code. Try:

<xsl:number value="$n" format="w" language="en"/>

Michael Kay 

-----Original Message-----
From: Matthew L. Avizinis [mailto:mla(_at_)gleim(_dot_)com] 
Sent: 17 September 2004 19:13
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] convert integers to words

Hello all,
  Anyone ever post something like this?  I haven't really been paying 
very close attention lately.
  It's a coupla stylesheets that convert integers to words.  
The first 
is simply to call the main one and spit out an xsl:message.  It takes 
one param, the number you want to convert and can be in the 
range 1 < x 
< 10E66.
  Personally, I needed it to convert some number <100.  The rest was 
just for fun.

Matthew L. Avizinis
mla at gleim dot com
Gleim Publications, Inc.
______________________________________________________________
___________________________

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
    <xsl:import href="int2word.xslt"/>
    <xsl:output method="xml" version="1.0" encoding="UTF-8" 
indent="yes"/>
    <xsl:param name="number"/>
    <xsl:template match="/">
       <xsl:variable name="num-in-words">
         <xsl:call-template name="int2word">
           <xsl:with-param name="in-integer" select="$number"/>
         </xsl:call-template>
       </xsl:variable>
<xsl:message><xsl:text>
</xsl:text>### <xsl:value-of select="$number"/> in words : 
<xsl:value-of 
select="$num-in-words"/> ###<xsl:text> </xsl:text></xsl:message>
    </xsl:template>
</xsl:stylesheet>


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:output method="xml" version="1.0" encoding="UTF-8" 
indent="yes"/>

  <xsl:variable name="int2word" select=" 
'1One|2Two|3Three|4Four|5Five|6Six|7Seven|8Eight|9Nine|10Ten|1
1Eleven|12Twelve|13Thirteen|14Fourteen|15Fifteen|16Sixteen|17S
eventeen|18Eighteen|19Nineteen|' 
"/>
  <xsl:variable name="tens2word" select=" 
'2Twenty|3Thirty|4Forty|5Fifty|6Sixty|7Seventy|8Eighty|9Ninety|' "/>
 
  <xsl:template name="int2word">
    <xsl:param name="in-integer" select="1"/>
    <!-- this is the number you want to convert to a word or words -->
    <xsl:variable name="the-number" 
select="translate($in-integer, ',.', 
'')"/>
    <!-- remove any formatting characters -->
    <xsl:variable name="num-length" 
select="string-length($the-number)"/>
    <xsl:variable name="group-length">
      <xsl:choose>
        <xsl:when test="($num-length mod 3) = 0">3</xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$num-length mod 3"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:variable name="first-group" 
select="substring($the-number, 1, 
$group-length)"/>
    <xsl:variable name="the-rest" select="substring($the-number, 
$group-length + 1, $num-length)"/>
    <xsl:choose>
      <xsl:when test="number($the-rest)">
        <xsl:call-template name="hundreds2words">
          <xsl:with-param name="group" select="$first-group"/>
        </xsl:call-template>
        <xsl:choose>
          <xsl:when test="string-length($the-rest) = 3"> Thousand 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 6"> 
Million </xsl:when>
          <xsl:when test="string-length($the-rest) = 9"> 
Billion </xsl:when>
          <xsl:when test="string-length($the-rest) = 12"> Trillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 15"> Quadrillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 18"> Quintillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 21"> Sextillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 24"> Septillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 27"> Octillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 30"> Nonillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 33"> Decillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 36"> Undecillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 39"> 
Duodecillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 42"> 
Tredecillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 45"> 
Quattuordecillion </xsl:when>
          <xsl:when test="string-length($the-rest) = 48"> 
Quindecillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 51"> 
Sexdecillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 54"> 
Septendecillion </xsl:when>
          <xsl:when test="string-length($the-rest) = 57"> 
Octodecillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 60"> 
Novemdecillion 
</xsl:when>
          <xsl:when test="string-length($the-rest) = 63"> 
Vigintillion 
</xsl:when>
        </xsl:choose>
        <xsl:call-template name="int2word">
          <xsl:with-param name="in-integer" select="$the-rest"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="hundreds2words">
          <xsl:with-param name="group" select="$first-group"/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <!--Every group of three in American numbering is the basis for 
counting hundreds of - - thousands, millions, etc. -->
  <xsl:template name="hundreds2words">
    <xsl:param name="group"/>
    <xsl:variable name="first-digit" 
select="substring(number($group), 
1, 1)"/>
    <xsl:variable name="remaining-digits">
       <xsl:choose>
        <xsl:when test="(19 &lt; number($group)) and (number($group) 
&lt; 100) "><xsl:value-of select="substring(number($group), 2, 
1)"/></xsl:when>
        <xsl:when test="(99 &lt; number($group)) and (number($group) 
&lt; 1000) "><xsl:value-of select="substring(number($group), 2, 
2)"/></xsl:when>
      </xsl:choose>
    </xsl:variable>
    <xsl:choose>
      <xsl:when test="number($remaining-digits)">
          <xsl:choose>
            <xsl:when test="string-length($remaining-digits) = 1">
              <xsl:value-of 
select="concat(substring-before(substring-after($tens2word, 
$first-digit), '|'), ' ')"/>
            </xsl:when>
            <xsl:when test="string-length($remaining-digits) = 2">
              <xsl:value-of 
select="substring-before(substring-after($int2word, 
$first-digit), '|')"/>
              <xsl:value-of select=" ' Hundred ' "/>
            </xsl:when>
          </xsl:choose>
          <xsl:call-template name="hundreds2words">
             <xsl:with-param name="group" select="$remaining-digits"/>
          </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
         <xsl:choose>
           <xsl:when test="number($group) &lt; 20">
             <xsl:value-of 
select="substring-before(substring-after($int2word, 
number($group)), '|')"/>
           </xsl:when>
           <xsl:otherwise>
             <xsl:value-of 
select="substring-before(substring-after($int2word, 
$first-digit), '|')"/>
           </xsl:otherwise>
         </xsl:choose>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>


--+------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--





<Prev in Thread] Current Thread [Next in Thread>