Hi folks,
here is a patch for I18nTransformer:
1) new tag int-currency introduced:
   In merchandise calculations often
   the calculations are done not with double
   ($1,23+$4,56) but with integers:
   (cent 123+cent 456)
   Soo give the value 579 will result
   in 5.79 for US locale but 579 for spanish locale
   because there is no sub currency in Spain.
2) the <i18n:number> tag did not preserve
   trailing and leading zeros and did only show
   three decimal places.
   Soo <i18n:number>0.12345</i18n:number>
   was transformed to 0.123
   and <i18n:number>0.10000</i18n:number>
   was transformed to 0.1
   This is now fixed.
Could a commiter commit please?

Regards,
Michael

--- I18nTransformer.java.orig   Thu Sep  6 15:46:30 2001
+++ I18nTransformer.java        Fri Sep  7 12:57:30 2001
@@ -258,7 +258,8 @@
 
     /**
      * <code>sub-type</code> attribute is used with <code>i18:number</code> to
-     * indicate a sub-type: <code>currency</code> or <code>percent</code>.
+     * indicate a sub-type: <code>currency</code>, <code>int-currency</code>
+     * or <code>percent</code>.
      */
     public static final String I18N_SUB_TYPE_ATTRIBUTE = "sub-type";
 
@@ -1058,6 +1059,8 @@
 
         // src format
         DecimalFormat from_fmt = (DecimalFormat)NumberFormat.getInstance(srcLoc);
+       int int_currency = 0;
+
        // src-pattern overwrites locale format
         if (srcPattern != null) {
             from_fmt.applyPattern(srcPattern);
@@ -1065,10 +1068,28 @@
 
        // to format
         DecimalFormat to_fmt = null;
+        char dec = from_fmt.getDecimalFormatSymbols().getDecimalSeparator();
+        int decAt = 0;
+        boolean appendDec = false;
         if (subType == null) {
             to_fmt = (DecimalFormat)NumberFormat.getInstance(loc);
+            to_fmt.setMaximumFractionDigits(309);
+            for(int i=value.length()-1;
+                i>=0 && value.charAt(i)!=dec;i--,decAt++);
+            if(decAt < value.length()) to_fmt.setMinimumFractionDigits(decAt);
+            decAt = 0;
+            for(int i = 0; i < value.length() && value.charAt(i) != dec; i++) {
+              if(Character.isDigit(value.charAt(i))) decAt++;
+            }
+            to_fmt.setMinimumIntegerDigits(decAt);
+            if(value.charAt(value.length()-1) == dec) appendDec = true;
         } else if (subType.equals("currency")) {
             to_fmt = (DecimalFormat)NumberFormat.getCurrencyInstance(loc);
+        } else if (subType.equals("int-currency")) {
+            to_fmt = (DecimalFormat)NumberFormat.getCurrencyInstance(loc);
+           int_currency = 1;
+           for(int i=0;i<to_fmt.getMaximumFractionDigits();i++)
+               int_currency *= 10;
         } else if (subType.equals("percent")) {
             to_fmt = (DecimalFormat)NumberFormat.getPercentInstance(loc);
         }
@@ -1083,6 +1104,12 @@
         } else {
             try {
                 numberValue = from_fmt.parse(value);
+                if(int_currency > 0)
+                   numberValue = new Double(numberValue.doubleValue()/
+                                            int_currency);
+                else {
+
+                }
             } catch (ParseException pe) {
                 throw new SAXException(this.getClass().getName()
                                        + "i18n:number - parsing error.", pe);
@@ -1091,6 +1118,7 @@
 
         // we have all necessary data here: do formatting.
         String result = to_fmt.format(numberValue);
+        if(appendDec) result = result + dec;
         debug("i18n:number result: " + result);
         return result;
     }
--- i18n-transformer.xml.orig   Fri Sep  7 14:50:02 2001
+++ i18n-transformer.xml        Fri Sep  7 14:49:35 2001
@@ -189,6 +189,7 @@
                                </p>
                                        <ul>
                                                <li><code><![CDATA[<i18n:number 
sub-type="currency" value="1703.74" />]]></code> will result in localized presentation 
of the <code>value</code> - $1,703.74 for US locale.</li>
+                                               <li><code><![CDATA[<i18n:number 
+sub-type="int-currency" value="170374" />]]></code> will result in localized 
+presentation of the <code>value</code> - $1,703.74 for US locale, 170374 for a 
+currency without subunit.</li>
                                                <li><code><![CDATA[<i18n:number 
sub-type="percent" value="1.2" />]]></code> will result in localized percent 
<code>value</code> - %120 for most of the locales.</li>
                                        </ul>
                                <p>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to