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]