[kaffe] CVS kaffe (guilhem): New "Java 1.4" java.text methods + java.util.Currency implementation
Kaffe CVS
Kaffe Mailing List <kaffe@kaffe.org>
Wed Aug 27 07:35:02 2003
PatchSet 3987
Date: 2003/08/27 14:32:09
Author: guilhem
Branch: HEAD
Tag: (none)
Log:
New "Java 1.4" java.text methods + java.util.Currency implementation
Members:
libraries/javalib/Makefile.am:1.133->1.134
libraries/javalib/Makefile.in:1.180->1.181
libraries/javalib/essential.files:1.23->1.24
libraries/javalib/java/text/DecimalFormat.java:1.19->1.20
libraries/javalib/java/text/DecimalFormatSymbols.java:1.11->1.12
libraries/javalib/java/text/MessageFormat.java:1.19->1.20
libraries/javalib/java/text/NumberFormat.java:1.17->1.18
libraries/javalib/java/util/Currency.java:INITIAL->1.1
Index: kaffe/libraries/javalib/Makefile.am
diff -u kaffe/libraries/javalib/Makefile.am:1.133 kaffe/libraries/javalib/Makefile.am:1.134
--- kaffe/libraries/javalib/Makefile.am:1.133 Mon Aug 25 06:14:47 2003
+++ kaffe/libraries/javalib/Makefile.am Wed Aug 27 14:32:09 2003
@@ -1543,6 +1543,7 @@
java/util/Collections.java \
java/util/Comparator.java \
java/util/ConcurrentModificationException.java \
+ java/util/Currency.java \
java/util/Date.java \
java/util/Dictionary.java \
java/util/EmptyStackException.java \
Index: kaffe/libraries/javalib/Makefile.in
diff -u kaffe/libraries/javalib/Makefile.in:1.180 kaffe/libraries/javalib/Makefile.in:1.181
--- kaffe/libraries/javalib/Makefile.in:1.180 Mon Aug 25 06:14:47 2003
+++ kaffe/libraries/javalib/Makefile.in Wed Aug 27 14:32:09 2003
@@ -1842,6 +1842,7 @@
java/util/Collections.java \
java/util/Comparator.java \
java/util/ConcurrentModificationException.java \
+ java/util/Currency.java \
java/util/Date.java \
java/util/Dictionary.java \
java/util/EmptyStackException.java \
Index: kaffe/libraries/javalib/essential.files
diff -u kaffe/libraries/javalib/essential.files:1.23 kaffe/libraries/javalib/essential.files:1.24
--- kaffe/libraries/javalib/essential.files:1.23 Mon Aug 25 06:30:12 2003
+++ kaffe/libraries/javalib/essential.files Wed Aug 27 14:32:09 2003
@@ -248,6 +248,7 @@
java/util/Calendar.java
java/util/Collection.java
java/util/Collections.java
+java/util/Currency.java
java/util/Comparator.java
java/util/ConcurrentModificationException.java
java/util/Date.java
Index: kaffe/libraries/javalib/java/text/DecimalFormat.java
diff -u kaffe/libraries/javalib/java/text/DecimalFormat.java:1.19 kaffe/libraries/javalib/java/text/DecimalFormat.java:1.20
--- kaffe/libraries/javalib/java/text/DecimalFormat.java:1.19 Tue Aug 26 15:03:10 2003
+++ kaffe/libraries/javalib/java/text/DecimalFormat.java Wed Aug 27 14:32:10 2003
@@ -736,6 +736,11 @@
return dest;
}
+ public Currency getCurrency()
+ {
+ return symbols.getCurrency();
+ }
+
public DecimalFormatSymbols getDecimalFormatSymbols ()
{
return symbols;
@@ -953,6 +958,11 @@
pos.setIndex(index + suffix.length());
return result;
+ }
+
+ public void setCurrency(Currency currency)
+ {
+ symbols.setCurrency(currency);
}
public void setDecimalFormatSymbols (DecimalFormatSymbols newSymbols)
Index: kaffe/libraries/javalib/java/text/DecimalFormatSymbols.java
diff -u kaffe/libraries/javalib/java/text/DecimalFormatSymbols.java:1.11 kaffe/libraries/javalib/java/text/DecimalFormatSymbols.java:1.12
--- kaffe/libraries/javalib/java/text/DecimalFormatSymbols.java:1.11 Sat Aug 16 11:03:47 2003
+++ kaffe/libraries/javalib/java/text/DecimalFormatSymbols.java Wed Aug 27 14:32:10 2003
@@ -39,6 +39,7 @@
package java.text;
import java.io.Serializable;
+import java.util.Currency;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
@@ -157,6 +158,7 @@
percent = safeGetChar (res, "percent", '%');
perMill = safeGetChar (res, "perMill", '\u2030');
zeroDigit = safeGetChar (res, "zeroDigit", '0');
+ locale = loc;
}
/**
@@ -195,6 +197,18 @@
}
/**
+ * Returns the currency corresponding to the currency symbol stored
+ * in the instance of <code>DecimalFormatSymbols</code>.
+ *
+ * @return A new instance of <code>Currency</code> if
+ * the currency code matches a known one.
+ */
+ public Currency getCurrency ()
+ {
+ return Currency.getInstance (currencySymbol);
+ }
+
+ /**
* This method returns the currency symbol in local format. For example,
* "$" for Canadian dollars.
*
@@ -354,6 +368,16 @@
}
/**
+ * This method sets the currency to the specified value.
+ *
+ * @param currency The new currency
+ */
+ public void setCurrency (Currency currency)
+ {
+ setCurrencySymbol (currency.getSymbol());
+ }
+
+ /**
* This method sets the currency symbol to the specified value.
*
* @param currencySymbol The new currency symbol
@@ -556,14 +580,20 @@
private char perMill;
/**
* @serial This value represents the type of object being de-serialized.
- * 0 indicates a pre-Java 1.1.6 version, 1 indicates 1.1.6 or later.
+ * 0 indicates a pre-Java 1.1.6 version, 1 indicates 1.1.6 or later,
+ * 2 indicates 1.4 or later
*/
- private int serialVersionOnStream = 1;
+ private int serialVersionOnStream = 2;
/**
* @serial This is the character used to represent 0.
*/
private char zeroDigit;
+ /**
+ * @serial the locale of these currency symbols.
+ */
+ private Locale locale;
+
private static final long serialVersionUID = 5772796243397350300L;
private void readObject(ObjectInputStream stream)
@@ -574,7 +604,11 @@
{
monetarySeparator = decimalSeparator;
exponential = 'E';
- serialVersionOnStream = 1;
}
+ if (serialVersionOnStream < 2)
+ {
+ locale = Locale.getDefault();
+ }
+ serialVersionOnStream = 2;
}
}
Index: kaffe/libraries/javalib/java/text/MessageFormat.java
diff -u kaffe/libraries/javalib/java/text/MessageFormat.java:1.19 kaffe/libraries/javalib/java/text/MessageFormat.java:1.20
--- kaffe/libraries/javalib/java/text/MessageFormat.java:1.19 Tue Aug 26 15:03:10 2003
+++ kaffe/libraries/javalib/java/text/MessageFormat.java Wed Aug 27 14:32:10 2003
@@ -453,6 +453,8 @@
else
formatter.format(thisArg, appendBuf, ignore);
}
+
+ elements[i].format = formatter;
}
if (output_iterator != null)
@@ -547,16 +549,38 @@
/**
* Creates a new MessageFormat object with
- * the specified pattern
+ * the specified pattern. The locale resource bundle
+ * is taken as the system default one.
*
- * @param aPattern The Pattern
+ * @param pattern The Pattern
*/
public MessageFormat (String pattern)
{
- locale = Locale.getDefault();
+ this(pattern, Locale.getDefault());
+ }
+
+ /**
+ * Creates a new MessageFormat object with
+ * the specified pattern and Locale context.
+ *
+ * @param pattern the pattern
+ * @param locale Locale environment to use
+ */
+ public MessageFormat (String pattern, Locale locale)
+ {
+ this.locale = locale;
applyPattern (pattern);
}
+ /**
+ * Parse a string <code>sourceStr</code> against the pattern specified
+ * to the MessageFormat constructor.
+ *
+ * @param sourceStr the string to be parsed.
+ * @param pos the current parse position (and eventually the error position).
+ * @return the array of parsed objects sorted according to their argument number
+ * in the pattern.
+ */
public Object[] parse (String sourceStr, ParsePosition pos)
{
// Check initial text.
@@ -704,6 +728,72 @@
public String toPattern ()
{
return pattern;
+ }
+
+ /**
+ * Return the formatters used sorted by argument index. It uses the
+ * internal table to fill in this array: if a format has been
+ * set using <code>setFormat</code> or <code>setFormatByArgumentIndex</code>
+ * then it returns it at the right index. If not it uses the detected
+ * formatters during a <code>format</code> call. If nothing is known
+ * about that argument index it just puts null at that position.
+ * To get useful informations you may have to call <code>format</code>
+ * at least once.
+ *
+ * @return an array of formatters sorted by argument index.
+ */
+ public Format[] getFormatsByArgumentIndex()
+ {
+ int argNumMax = 0;
+ // First, find the greatest argument number.
+ for (int i=0;i<elements.length;i++)
+ if (elements[i].argNumber > argNumMax)
+ argNumMax = elements[i].argNumber;
+
+ Format[] formats = new Format[argNumMax];
+ for (int i=0;i<elements.length;i++)
+ {
+ if (elements[i].setFormat != null)
+ formats[elements[i].argNumber] = elements[i].setFormat;
+ else if (elements[i].format != null)
+ formats[elements[i].argNumber] = elements[i].format;
+ }
+ return formats;
+ }
+
+ /**
+ * Set the format to used using the argument index number.
+ *
+ * @param argumentIndex the argument index.
+ * @param newFormat the format to use for this argument.
+ */
+ public void setFormatByArgumentIndex(int argumentIndex,
+ Format newFormat)
+ {
+ for (int i=0;i<elements.length;i++)
+ {
+ if (elements[i].argNumber == argumentIndex)
+ elements[i].setFormat = newFormat;
+ }
+ }
+
+ /**
+ * Set the format for argument using a specified array of formatters
+ * which is sorted according to the argument index. If the number of
+ * elements in the array is fewer than the number of arguments only
+ * the arguments specified by the array are touched.
+ *
+ * @param newFormats array containing the new formats to set.
+ *
+ * @throws NullPointerException if newFormats is null
+ */
+ public void setFormatsByArgumentIndex(Format[] newFormats)
+ {
+ for (int i=0;i<newFormats.length;i++)
+ {
+ // Nothing better than that can exist here.
+ setFormatByArgumentIndex(i, newFormats[i]);
+ }
}
// The pattern string.
Index: kaffe/libraries/javalib/java/text/NumberFormat.java
diff -u kaffe/libraries/javalib/java/text/NumberFormat.java:1.17 kaffe/libraries/javalib/java/text/NumberFormat.java:1.18
--- kaffe/libraries/javalib/java/text/NumberFormat.java:1.17 Tue Aug 26 15:03:10 2003
+++ kaffe/libraries/javalib/java/text/NumberFormat.java Wed Aug 27 14:32:10 2003
@@ -41,6 +41,7 @@
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.MissingResourceException;
+import java.util.Currency;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
@@ -316,6 +317,16 @@
return computeInstance (loc, "currencyFormat", "$#,##0.00;($#,##0.00)");
}
+ public Currency getCurrency()
+ {
+ throw new UnsupportedOperationException("getCurrency");
+ }
+
+ public void setCurrency(Currency currency)
+ {
+ throw new UnsupportedOperationException("setCurrency");
+ }
+
/**
* This method returns a default instance for the default locale. This
* will be a concrete subclass of <code>NumberFormat</code>, but the
@@ -396,8 +407,6 @@
* will be a concrete subclass of <code>NumberFormat</code>, but the
* actual class returned is dependent on the locale.
*
- * @param locale The desired locale.
- *
* @return An instance of the default <code>NumberFormat</code> class.
*/
public static final NumberFormat getNumberInstance ()
@@ -411,11 +420,41 @@
* <code>NumberFormat</code>, but the actual class returned is dependent
* on the locale.
*
- * @return An instance of a generic number formatter for the default locale.
+ * @param loc the desired locale.
+ *
+ * @return An instance of a generic number formatter for the specified locale.
*/
public static NumberFormat getNumberInstance (Locale loc)
{
return computeInstance (loc, "numberFormat", "#,##0.###");
+ }
+
+ /**
+ * This method returns an integer formatting and parsing class for the
+ * default locale. This will be a concrete subclass of <code>NumberFormat</code>,
+ * but the actual class returned is dependent on the locale.
+ *
+ * @return An instance of an integer number formatter for the default locale.
+ */
+ public static final NumberFormat getIntegerInstance()
+ {
+ return getIntegerInstance (Locale.getDefault());
+ }
+
+ /**
+ * This method returns an integer formatting and parsing class for the
+ * default locale. This will be a concrete subclass of <code>NumberFormat</code>,
+ * but the actual class returned is dependent on the locale.
+ *
+ * @param loc the desired locale.
+ *
+ * @return An instance of an integer number formatter for the default locale.
+ */
+ public static NumberFormat getIntegerInstance(Locale loc)
+ {
+ NumberFormat format = computeInstance (loc, "numberFormat", "#,##0");
+ format.setParseIntegerOnly (true);
+ return format;
}
/**
===================================================================
Checking out kaffe/libraries/javalib/java/util/Currency.java
RCS: /home/cvs/kaffe/kaffe/libraries/javalib/java/util/Currency.java,v
VERS: 1.1
***************
--- /dev/null Sun Aug 4 19:57:58 2002
+++ kaffe/libraries/javalib/java/util/Currency.java Wed Aug 27 14:34:00 2003
@@ -0,0 +1,189 @@
+/* Currency.java -- Representation of a currency
+ Copyright (C) 2003 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+package java.util;
+
+import java.io.Serializable;
+import java.util.ResourceBundle;
+import java.util.Locale;
+import java.text.NumberFormat;
+
+public final class Currency implements Serializable
+{
+ static final long serialVersionUID = -158308464356906721L;
+
+ private Locale locale;
+ private ResourceBundle res;
+
+ // For deserialization
+ private Currency ()
+ {
+ }
+
+ private Currency (Locale loc)
+ {
+ this.locale = loc;
+ this.res = ResourceBundle.getBundle ("gnu.java.locale.LocaleInformation", locale);
+ }
+
+ /**
+ * Returns the ISO4217 currency code of this currency.
+ *
+ * @return a <code>String</code> containing currency code.
+ */
+ public String getCurrencyCode ()
+ {
+ try
+ {
+ return res.getString ("intlCurrencySymbol");
+ }
+ catch (Exception _)
+ {
+ return null;
+ }
+ }
+
+ /**
+ * @return number of digits after decimal separator for this currency.
+ */
+ public int getDefaultFractionDigits ()
+ {
+ NumberFormat currency = NumberFormat.getCurrencyInstance (locale);
+
+ return currency.getMaximumFractionDigits();
+ }
+
+ /**
+ * Builds a new currency instance for this locale.
+ *
+ * @param locale a <code>Locale</code> instance.
+ *
+ * @return a new <code>Currency</code> instance.
+ */
+ public static Currency getInstance (Locale locale)
+ {
+ return new Currency (locale);
+ }
+
+ /**
+ * Builds the currency corresponding to the specified currency code.
+ *
+ * @param currencyCode a string representing a currency code.
+ *
+ * @return a new <code>Currency</code> instance.
+ */
+ public static Currency getInstance (String currencyCode)
+ {
+ Locale[] all_locales = Locale.getAvailableLocales ();
+
+ for (int i=0;i<all_locales.length;i++)
+ {
+ Currency test_currency = getInstance (all_locales[i]);
+
+ if (test_currency.getCurrencyCode() != null &&
+ test_currency.getCurrencyCode().equals(currencyCode))
+ return test_currency;
+ }
+
+ return null;
+ }
+
+ /**
+ * This method returns the currency symbol.
+ *
+ * @return the currency symbol.
+ */
+ public String getSymbol()
+ {
+ try
+ {
+ return res.getString ("currencySymbol");
+ }
+ catch (Exception _)
+ {
+ return null;
+ }
+ }
+
+ /**
+ * This methods returns the currency symbol expressed in the specified locale.
+ *
+ * @param locale the locale to express the symbol in.
+ * @return the currency symbol.
+ */
+ public String getSymbol(Locale locale)
+ {
+ // TODO. The behaviour is unclear if locale != this.locale.
+ // First we need to implement fully LocaleInformation*.java
+ try
+ {
+ ResourceBundle res = ResourceBundle.getBundle ("gnu.java.locale.LocaleInformation", locale);
+
+ if (res.equals(this.res))
+ return res.getString ("currencySymbol");
+ else
+ return res.getString ("intlCurrencySymbol");
+ }
+ catch (Exception e1)
+ {
+ try
+ {
+ return res.getString ("intlCurrencySymbol");
+ }
+ catch (Exception e2)
+ {
+ return null;
+ }
+ }
+ }
+
+ /**
+ * Returns the international ISO4217 currency code of this currency.
+ *
+ * @return a <code>String</code> containing the ISO4217 currency code.
+ */
+ public String toString()
+ {
+ try
+ {
+ return res.getString ("intlCurrencySymbol");
+ }
+ catch (Exception _)
+ {
+ return "(unknown currency)";
+ }
+ }
+}