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]