diff options
Diffstat (limited to 'libjava/java/text')
-rw-r--r-- | libjava/java/text/Collator.java | 13 | ||||
-rw-r--r-- | libjava/java/text/DateFormatSymbols.h | 2 | ||||
-rw-r--r-- | libjava/java/text/DateFormatSymbols.java | 597 | ||||
-rw-r--r-- | libjava/java/text/DecimalFormatSymbols.h | 66 | ||||
-rw-r--r-- | libjava/java/text/DecimalFormatSymbols.java | 742 |
5 files changed, 41 insertions, 1379 deletions
diff --git a/libjava/java/text/Collator.java b/libjava/java/text/Collator.java index 3e64172..e493182 100644 --- a/libjava/java/text/Collator.java +++ b/libjava/java/text/Collator.java @@ -1,5 +1,6 @@ /* Collator.java -- Perform locale dependent String comparisons. - Copyright (C) 1998, 1999, 2000, 2001, 2004, 2005, 2007 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000, 2001, 2004, 2005, 2007, + 2008 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -38,6 +39,8 @@ exception statement from your version. */ package java.text; +import gnu.java.locale.LocaleHelper; + import java.text.spi.CollatorProvider; import java.util.Comparator; @@ -243,10 +246,7 @@ public abstract class Collator implements Comparator<Object>, Cloneable */ public static synchronized Locale[] getAvailableLocales () { - // FIXME - Locale[] l = new Locale[1]; - l[0] = Locale.US; - return l; + return LocaleHelper.getCollatorLocales(); } /** @@ -342,8 +342,7 @@ public abstract class Collator implements Comparator<Object>, Cloneable throw (InternalError)new InternalError().initCause(x); } } - // FIXME - return getInstance(Locale.US); + return getInstance(LocaleHelper.getFallbackLocale(loc)); } /** diff --git a/libjava/java/text/DateFormatSymbols.h b/libjava/java/text/DateFormatSymbols.h index 9836ea5..d1f25b3 100644 --- a/libjava/java/text/DateFormatSymbols.h +++ b/libjava/java/text/DateFormatSymbols.h @@ -23,6 +23,8 @@ extern "Java" class java::text::DateFormatSymbols : public ::java::lang::Object { + static JArray< ::java::lang::String * > * getStringArray(::java::util::ResourceBundle *, ::java::lang::String *); + JArray< JArray< ::java::lang::String * > * > * getZoneStrings(::java::util::ResourceBundle *, ::java::util::Locale *); JArray< ::java::lang::String * > * formatsForKey(::java::util::ResourceBundle *, ::java::lang::String *); public: DateFormatSymbols(::java::util::Locale *); diff --git a/libjava/java/text/DateFormatSymbols.java b/libjava/java/text/DateFormatSymbols.java deleted file mode 100644 index 2ca513e..0000000 --- a/libjava/java/text/DateFormatSymbols.java +++ /dev/null @@ -1,597 +0,0 @@ -/* DateFormatSymbols.java -- Format over a range of numbers - Copyright (C) 1998, 1999, 2000, 2001, 2003, 2005, 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 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.text; - -import gnu.java.locale.LocaleHelper; - -import java.text.spi.DateFormatSymbolsProvider; - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.MissingResourceException; -import java.util.ResourceBundle; -import java.util.ServiceLoader; -import java.util.TimeZone; - -import java.util.spi.TimeZoneNameProvider; - -/** - * This class acts as container for locale specific date/time formatting - * information such as the days of the week and the months of the year. - * @author Per Bothner (bothner@cygnus.com) - * - * @date October 24, 1998. - */ -/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3. - * Status: Believed complete and correct. - */ -public class DateFormatSymbols implements java.io.Serializable, Cloneable -{ - String[] ampms; - String[] eras; - private String localPatternChars; - String[] months; - String[] shortMonths; - String[] shortWeekdays; - String[] weekdays; - - /** - * The timezone strings supplied by the runtime. - */ - private String[][] runtimeZoneStrings; - - /** - * Custom timezone strings supplied by {@link #setZoneStrings()}. - */ - private String[][] zoneStrings; - - private static final long serialVersionUID = -5987973545549424702L; - - // The order of these prefixes must be the same as in DateFormat - private static final String[] formatPrefixes = - { - "full", "long", "medium", "short" - }; - - // These are each arrays with a value for SHORT, MEDIUM, LONG, FULL, - // and DEFAULT (constants defined in java.text.DateFormat). While - // not part of the official spec, we need a way to get at locale-specific - // default formatting patterns. They are declared package scope so - // as to be easily accessible where needed (DateFormat, SimpleDateFormat). - transient String[] dateFormats; - transient String[] timeFormats; - - private String[] formatsForKey(ResourceBundle res, String key) - { - String[] values = new String [formatPrefixes.length]; - for (int i = 0; i < formatPrefixes.length; i++) - { - values[i] = res.getString(formatPrefixes[i]+key); - } - return values; - } - - /** - * This method initializes a new instance of <code>DateFormatSymbols</code> - * by loading the date format information for the specified locale. - * This constructor only obtains instances using the runtime's resources; - * to also include {@link java.text.spi.DateFormatSymbolsProvider} instances, - * call {@link #getInstance(java.util.Locale)} instead. - * - * @param locale The locale for which date formatting symbols should - * be loaded. - * @throws MissingResourceException if the resources for the specified - * locale could not be found or loaded. - * @see #getInstance(java.util.Locale) - */ - public DateFormatSymbols (Locale locale) - throws MissingResourceException - { - ResourceBundle res - = ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", locale, - ClassLoader.getSystemClassLoader()); - - ampms = res.getStringArray ("ampms"); - eras = res.getStringArray ("eras"); - localPatternChars = res.getString ("localPatternChars"); - months = res.getStringArray ("months"); - shortMonths = res.getStringArray ("shortMonths"); - shortWeekdays = res.getStringArray ("shortWeekdays"); - weekdays = res.getStringArray ("weekdays"); - zoneStrings = (String[][]) res.getObject ("zoneStrings"); - - dateFormats = formatsForKey(res, "DateFormat"); - timeFormats = formatsForKey(res, "TimeFormat"); - } - - /** - * This method loads the format symbol information for the default - * locale. This constructor only obtains instances using the runtime's resources; - * to also include {@link java.text.spi.DateFormatSymbolsProvider} instances, - * call {@link #getInstance()} instead. - * - * @throws MissingResourceException if the resources for the default - * locale could not be found or loaded. - * @see #getInstance() - */ - public DateFormatSymbols() - throws MissingResourceException - { - this (Locale.getDefault()); - } - - /** - * This method returns the list of strings used for displaying AM or PM. - * This is a two element <code>String</code> array indexed by - * <code>Calendar.AM</code> and <code>Calendar.PM</code> - * - * @return The list of AM/PM display strings. - */ - public String[] getAmPmStrings() - { - return ampms; - } - - /** - * This method returns the list of strings used for displaying eras - * (e.g., "BC" and "AD"). This is a two element <code>String</code> - * array indexed by <code>Calendar.BC</code> and <code>Calendar.AD</code>. - * - * @return The list of era disply strings. - */ - public String[] getEras() - { - return eras; - } - - /** - * This method returns the pattern character information for this - * object. This is an 18 character string that contains the characters - * that are used in creating the date formatting strings in - * <code>SimpleDateFormat</code>. The following are the character - * positions in the string and which format character they correspond - * to (the character in parentheses is the default value in the US English - * locale): - * <p> - * <ul> - * <li>0 - era (G)</li> - * <li>1 - year (y)</li> - * <li>2 - month (M)</li> - * <li>3 - day of month (d)</li> - * <li>4 - hour out of 12, from 1-12 (h)</li> - * <li>5 - hour out of 24, from 0-23 (H)</li> - * <li>6 - minute (m)</li> - * <li>7 - second (s)</li> - * <li>8 - millisecond (S)</li> - * <li>9 - date of week (E)</li> - * <li>10 - date of year (D)</li> - * <li>11 - day of week in month, eg. "4th Thur in Nov" (F)</li> - * <li>12 - week in year (w)</li> - * <li>13 - week in month (W)</li> - * <li>14 - am/pm (a)</li> - * <li>15 - hour out of 24, from 1-24 (k)</li> - * <li>16 - hour out of 12, from 0-11 (K)</li> - * <li>17 - time zone (z)</li> - * </ul> - * - * @return The format patter characters - */ - public String getLocalPatternChars() - { - return localPatternChars; - } - - /** - * This method returns the list of strings used for displaying month - * names (e.g., "January" and "February"). This is a thirteen element - * string array indexed by <code>Calendar.JANUARY</code> through - * <code>Calendar.UNDECEMBER</code>. Note that there are thirteen - * elements because some calendars have thriteen months. - * - * @return The list of month display strings. - */ - public String[] getMonths () - { - return months; - } - - /** - * This method returns the list of strings used for displaying abbreviated - * month names (e.g., "Jan" and "Feb"). This is a thirteen element - * <code>String</code> array indexed by <code>Calendar.JANUARY</code> - * through <code>Calendar.UNDECEMBER</code>. Note that there are thirteen - * elements because some calendars have thirteen months. - * - * @return The list of abbreviated month display strings. - */ - public String[] getShortMonths () - { - return shortMonths; - } - - /** - * This method returns the list of strings used for displaying abbreviated - * weekday names (e.g., "Sun" and "Mon"). This is an eight element - * <code>String</code> array indexed by <code>Calendar.SUNDAY</code> - * through <code>Calendar.SATURDAY</code>. Note that the first element - * of this array is ignored. - * - * @return This list of abbreviated weekday display strings. - */ - public String[] getShortWeekdays () - { - return shortWeekdays; - } - - /** - * This method returns the list of strings used for displaying weekday - * names (e.g., "Sunday" and "Monday"). This is an eight element - * <code>String</code> array indexed by <code>Calendar.SUNDAY</code> - * through <code>Calendar.SATURDAY</code>. Note that the first element - * of this array is ignored. - * - * @return This list of weekday display strings. - */ - public String[] getWeekdays () - { - return weekdays; - } - - /** - * This method returns this list of localized timezone display strings. - * This is a two dimensional <code>String</code> array where each row in - * the array contains five values: - * <P> - * <ul> - * <li>0 - The non-localized time zone id string.</li> - * <li>1 - The long name of the time zone (standard time).</li> - * <li>2 - The short name of the time zone (standard time).</li> - * <li>3 - The long name of the time zone (daylight savings time).</li> - * <li>4 - the short name of the time zone (daylight savings time).</li> - * </ul> - * - * @return The list of time zone display strings. - */ - public String[] [] getZoneStrings () - { - return zoneStrings; - } - - /** - * This method sets the list of strings used to display AM/PM values to - * the specified list. - * This is a two element <code>String</code> array indexed by - * <code>Calendar.AM</code> and <code>Calendar.PM</code> - * - * @param value The new list of AM/PM display strings. - */ - public void setAmPmStrings (String[] value) - { - ampms = value; - } - - /** - * This method sets the list of strings used to display time eras to - * to the specified list. - * This is a two element <code>String</code> - * array indexed by <code>Calendar.BC</code> and <code>Calendar.AD</code>. - * - * @param labels The new list of era display strings. - */ - public void setEras (String[] labels) - { - eras = labels; - } - - /** - * This method sets the list of characters used to specific date/time - * formatting strings. - * This is an 18 character string that contains the characters - * that are used in creating the date formatting strings in - * <code>SimpleDateFormat</code>. The following are the character - * positions in the string and which format character they correspond - * to (the character in parentheses is the default value in the US English - * locale): - * <p> - * <ul> - * <li>0 - era (G)</li> - * <li>1 - year (y)</li> - * <li>2 - month (M)</li> - * <li>3 - day of month (d)</li> - * <li>4 - hour out of 12, from 1-12 (h)</li> - * <li>5 - hour out of 24, from 0-23 (H)</li> - * <li>6 - minute (m)</li> - * <li>7 - second (s)</li> - * <li>8 - millisecond (S)</li> - * <li>9 - date of week (E)</li> - * <li>10 - date of year (D)</li> - * <li>11 - day of week in month, eg. "4th Thur in Nov" (F)</li> - * <li>12 - week in year (w)</li> - * <li>13 - week in month (W)</li> - * <li>14 - am/pm (a)</li> - * <li>15 - hour out of 24, from 1-24 (k)</li> - * <li>16 - hour out of 12, from 0-11 (K)</li> - * <li>17 - time zone (z)</li> - * </ul> - * - * @param chars The new format pattern characters - */ - public void setLocalPatternChars (String chars) - { - localPatternChars = chars; - } - - /** - * This method sets the list of strings used to display month names. - * This is a thirteen element - * string array indexed by <code>Calendar.JANUARY</code> through - * <code>Calendar.UNDECEMBER</code>. Note that there are thirteen - * elements because some calendars have thriteen months. - * - * @param labels The list of month display strings. - */ - public void setMonths (String[] labels) - { - months = labels; - } - - /** - * This method sets the list of strings used to display abbreviated month - * names. - * This is a thirteen element - * <code>String</code> array indexed by <code>Calendar.JANUARY</code> - * through <code>Calendar.UNDECEMBER</code>. Note that there are thirteen - * elements because some calendars have thirteen months. - * - * @param labels The new list of abbreviated month display strings. - */ - public void setShortMonths (String[] labels) - { - shortMonths = labels; - } - - /** - * This method sets the list of strings used to display abbreviated - * weekday names. - * This is an eight element - * <code>String</code> array indexed by <code>Calendar.SUNDAY</code> - * through <code>Calendar.SATURDAY</code>. Note that the first element - * of this array is ignored. - * - * @param labels This list of abbreviated weekday display strings. - */ - public void setShortWeekdays (String[] labels) - { - shortWeekdays = labels; - } - - /** - * This method sets the list of strings used to display weekday names. - * This is an eight element - * <code>String</code> array indexed by <code>Calendar.SUNDAY</code> - * through <code>Calendar.SATURDAY</code>. Note that the first element - * of this array is ignored. - * - * @param labels This list of weekday display strings. - */ - public void setWeekdays (String[] labels) - { - weekdays = labels; - } - - /** - * This method sets the list of display strings for time zones. - * This is a two dimensional <code>String</code> array where each row in - * the array contains five values: - * <P> - * <ul> - * <li>0 - The non-localized time zone id string.</li> - * <li>1 - The long name of the time zone (standard time).</li> - * <li>2 - The short name of the time zone (standard time).</li> - * <li>3 - The long name of the time zone (daylight savings time).</li> - * <li>4 - the short name of the time zone (daylight savings time).</li> - * </ul> - * - * @params zones The list of time zone display strings. - */ - public void setZoneStrings (String[][] zones) - { - zoneStrings = zones; - } - - /* Does a "deep" equality test - recurses into arrays. */ - private static boolean equals (Object x, Object y) - { - if (x == y) - return true; - if (x == null || y == null) - return false; - if (! (x instanceof Object[]) || ! (y instanceof Object[])) - return x.equals(y); - Object[] xa = (Object[]) x; - Object[] ya = (Object[]) y; - if (xa.length != ya.length) - return false; - for (int i = xa.length; --i >= 0; ) - { - if (! equals(xa[i], ya[i])) - return false; - } - return true; - } - - private static int hashCode (Object x) - { - if (x == null) - return 0; - if (! (x instanceof Object[])) - return x.hashCode(); - Object[] xa = (Object[]) x; - int hash = 0; - for (int i = 0; i < xa.length; i++) - hash = 37 * hashCode(xa[i]); - return hash; - } - - /** - * This method tests a specified object for equality against this object. - * This will be true if and only if the specified object: - * <p> - * <ul> - * <li> Is not <code>null</code>.</li> - * <li> Is an instance of <code>DateFormatSymbols</code>.</li> - * <li> Contains identical formatting symbols to this object.</li> - * </ul> - * - * @param obj The <code>Object</code> to test for equality against. - * - * @return <code>true</code> if the specified object is equal to this one, - * <code>false</code> otherwise. - */ - public boolean equals (Object obj) - { - if (! (obj instanceof DateFormatSymbols)) - return false; - DateFormatSymbols other = (DateFormatSymbols) obj; - return (equals(ampms, other.ampms) - && equals(eras, other.eras) - && equals(localPatternChars, other.localPatternChars) - && equals(months, other.months) - && equals(shortMonths, other.shortMonths) - && equals(shortWeekdays, other.shortWeekdays) - && equals(weekdays, other.weekdays) - && equals(zoneStrings, other.zoneStrings)); - } - - /** - * Returns a new copy of this object. - * - * @return A copy of this object - */ - public Object clone () - { - try - { - return super.clone (); - } - catch (CloneNotSupportedException e) - { - return null; - } - } - - /** - * This method returns a hash value for this object. - * - * @return A hash value for this object. - */ - public int hashCode () - { - return (hashCode(ampms) - ^ hashCode(eras) - ^ hashCode(localPatternChars) - ^ hashCode(months) - ^ hashCode(shortMonths) - ^ hashCode(shortWeekdays) - ^ hashCode(weekdays) - ^ hashCode(zoneStrings)); - } - - /** - * Returns a {@link DateFormatSymbols} instance for the - * default locale obtained from either the runtime itself - * or one of the installed - * {@link java.text.spi.DateFormatSymbolsProvider} instances. - * This is equivalent to calling - * <code>getInstance(Locale.getDefault())</code>. - * - * @return a {@link DateFormatSymbols} instance for the default - * locale. - * @since 1.6 - */ - public static final DateFormatSymbols getInstance() - { - return getInstance(Locale.getDefault()); - } - - /** - * Returns a {@link DateFormatSymbols} instance for the - * specified locale obtained from either the runtime itself - * or one of the installed - * {@link java.text.spi.DateFormatSymbolsProvider} instances. - * - * @param locale the locale for which an instance should be - * returned. - * @return a {@link DateFormatSymbols} instance for the specified - * locale. - * @throws NullPointerException if <code>locale</code> is - * <code>null</code>. - * @since 1.6 - */ - public static final DateFormatSymbols getInstance(Locale locale) - { - try - { - DateFormatSymbols syms = new DateFormatSymbols(locale); - return syms; - } - catch (MissingResourceException e) - { - /* This means runtime support for the locale - * is not available, so we check providers. */ - } - for (DateFormatSymbolsProvider p : - ServiceLoader.load(DateFormatSymbolsProvider.class)) - { - for (Locale loc : p.getAvailableLocales()) - { - if (loc.equals(locale)) - { - DateFormatSymbols syms = p.getInstance(locale); - if (syms != null) - return syms; - break; - } - } - } - return getInstance(LocaleHelper.getFallbackLocale(locale)); - } - -} diff --git a/libjava/java/text/DecimalFormatSymbols.h b/libjava/java/text/DecimalFormatSymbols.h index 8967572..8d29377 100644 --- a/libjava/java/text/DecimalFormatSymbols.h +++ b/libjava/java/text/DecimalFormatSymbols.h @@ -22,49 +22,49 @@ class java::text::DecimalFormatSymbols : public ::java::lang::Object { public: - ::java::lang::Object * clone(); + virtual ::java::lang::Object * clone(); DecimalFormatSymbols(); private: ::java::lang::String * safeGetString(::java::util::ResourceBundle *, ::java::lang::String *, ::java::lang::String *); jchar safeGetChar(::java::util::ResourceBundle *, ::java::lang::String *, jchar); public: DecimalFormatSymbols(::java::util::Locale *); - jboolean equals(::java::lang::Object *); - ::java::util::Currency * getCurrency(); - ::java::lang::String * getCurrencySymbol(); - jchar getDecimalSeparator(); - jchar getDigit(); + virtual jboolean equals(::java::lang::Object *); + virtual ::java::util::Currency * getCurrency(); + virtual ::java::lang::String * getCurrencySymbol(); + virtual jchar getDecimalSeparator(); + virtual jchar getDigit(); public: // actually package-private - jchar getExponential(); + virtual jchar getExponential(); public: - jchar getGroupingSeparator(); - ::java::lang::String * getInfinity(); - ::java::lang::String * getInternationalCurrencySymbol(); - jchar getMinusSign(); - jchar getMonetaryDecimalSeparator(); - ::java::lang::String * getNaN(); - jchar getPatternSeparator(); - jchar getPercent(); - jchar getPerMill(); - jchar getZeroDigit(); - jint hashCode(); - void setCurrency(::java::util::Currency *); - void setCurrencySymbol(::java::lang::String *); - void setDecimalSeparator(jchar); - void setDigit(jchar); + virtual jchar getGroupingSeparator(); + virtual ::java::lang::String * getInfinity(); + virtual ::java::lang::String * getInternationalCurrencySymbol(); + virtual jchar getMinusSign(); + virtual jchar getMonetaryDecimalSeparator(); + virtual ::java::lang::String * getNaN(); + virtual jchar getPatternSeparator(); + virtual jchar getPercent(); + virtual jchar getPerMill(); + virtual jchar getZeroDigit(); + virtual jint hashCode(); + virtual void setCurrency(::java::util::Currency *); + virtual void setCurrencySymbol(::java::lang::String *); + virtual void setDecimalSeparator(jchar); + virtual void setDigit(jchar); public: // actually package-private - void setExponential(jchar); + virtual void setExponential(jchar); public: - void setGroupingSeparator(jchar); - void setInfinity(::java::lang::String *); - void setInternationalCurrencySymbol(::java::lang::String *); - void setMinusSign(jchar); - void setMonetaryDecimalSeparator(jchar); - void setNaN(::java::lang::String *); - void setPatternSeparator(jchar); - void setPercent(jchar); - void setPerMill(jchar); - void setZeroDigit(jchar); + virtual void setGroupingSeparator(jchar); + virtual void setInfinity(::java::lang::String *); + virtual void setInternationalCurrencySymbol(::java::lang::String *); + virtual void setMinusSign(jchar); + virtual void setMonetaryDecimalSeparator(jchar); + virtual void setNaN(::java::lang::String *); + virtual void setPatternSeparator(jchar); + virtual void setPercent(jchar); + virtual void setPerMill(jchar); + virtual void setZeroDigit(jchar); private: void readObject(::java::io::ObjectInputStream *); public: diff --git a/libjava/java/text/DecimalFormatSymbols.java b/libjava/java/text/DecimalFormatSymbols.java deleted file mode 100644 index b72f144..0000000 --- a/libjava/java/text/DecimalFormatSymbols.java +++ /dev/null @@ -1,742 +0,0 @@ -/* DecimalFormatSymbols.java -- Format symbols used by DecimalFormat - Copyright (C) 1999, 2000, 2001, 2004, 2007 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., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 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.text; - -import gnu.java.locale.LocaleHelper; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.Serializable; - -import java.text.spi.DecimalFormatSymbolsProvider; - -import java.util.Currency; -import java.util.Locale; -import java.util.MissingResourceException; -import java.util.ResourceBundle; -import java.util.ServiceLoader; - -/** - * This class is a container for the symbols used by - * <code>DecimalFormat</code> to format numbers and currency. These are - * normally handled automatically, but an application can override - * values as desired using this class. - * - * @author Tom Tromey (tromey@cygnus.com) - * @author Aaron M. Renn (arenn@urbanophile.com) - * @date February 24, 1999 - */ -/* Written using "Java Class Libraries", 2nd edition, plus online - * API docs for JDK 1.2 from http://www.javasoft.com. - * Status: Believed complete and correct to 1.2. - */ -public final class DecimalFormatSymbols implements Cloneable, Serializable -{ - public Object clone () - { - try - { - return super.clone (); - } - catch(CloneNotSupportedException e) - { - return null; - } - } - - /** - * This method initializes a new instance of - * <code>DecimalFormatSymbols</code> for the default locale. - * This constructor only obtains instances using the runtime's resources; - * to also include {@link java.text.spi.DateFormatSymbolsProvider} instances, - * call {@link #getInstance()} instead. - * - * @see #getInstance() - */ - public DecimalFormatSymbols () - { - this (Locale.getDefault()); - } - - private String safeGetString(ResourceBundle bundle, - String name, String def) - { - if (bundle != null) - { - try - { - return bundle.getString(name); - } - catch (MissingResourceException x) - { - } - } - return def; - } - - private char safeGetChar(ResourceBundle bundle, - String name, char def) - { - String r = null; - if (bundle != null) - { - try - { - r = bundle.getString(name); - } - catch (MissingResourceException x) - { - } - } - if (r == null || r.length() < 1) - return def; - return r.charAt(0); - } - - /** - * This method initializes a new instance of - * <code>DecimalFormatSymbols</code> for the specified locale. - * <strong>Note</strong>: if the locale does not have an associated - * <code>Currency</code> instance, the currency symbol and - * international currency symbol will be set to the strings "?" - * and "XXX" respectively. This generally happens with language - * locales (those with no specified country), such as - * <code>Locale.ENGLISH</code>. This constructor only obtains - * instances using the runtime's resources; to also include - * {@link java.text.spi.DecimalFormatSymbolsProvider} instances, - * call {@link #getInstance(java.util.Locale)} instead. - * - * @param loc The local to load symbols for. - * @throws NullPointerException if the locale is null. - * @see #getInstance(java.util.Locale) - */ - public DecimalFormatSymbols (Locale loc) - { - ResourceBundle res; - try - { - res = ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", - loc, ClassLoader.getSystemClassLoader()); - } - catch (MissingResourceException x) - { - res = null; - } - currency = Currency.getInstance("XXX"); - currencySymbol = "?"; - intlCurrencySymbol = "XXX"; - try - { - Currency localeCurrency = Currency.getInstance(loc); - if (localeCurrency != null) - { - setCurrency(localeCurrency); - } - } - catch(IllegalArgumentException exception) - { - /* Locale has an invalid currency */ - } - decimalSeparator = safeGetChar (res, "decimalSeparator", '.'); - digit = safeGetChar (res, "digit", '#'); - exponential = safeGetChar (res, "exponential", 'E'); - groupingSeparator = safeGetChar (res, "groupingSeparator", ','); - infinity = safeGetString (res, "infinity", "\u221e"); - try - { - monetarySeparator = safeGetChar (res, "monetarySeparator", '.'); - } - catch (MissingResourceException x) - { - monetarySeparator = decimalSeparator; - } - minusSign = safeGetChar (res, "minusSign", '-'); - NaN = safeGetString (res, "NaN", "\ufffd"); - patternSeparator = safeGetChar (res, "patternSeparator", ';'); - percent = safeGetChar (res, "percent", '%'); - perMill = safeGetChar (res, "perMill", '\u2030'); - zeroDigit = safeGetChar (res, "zeroDigit", '0'); - locale = loc; - } - - /** - * This method this this object for equality against the specified object. - * This will be true if and only if the following criteria are met with - * regard to the specified object: - * <p> - * <ul> - * <li>It is not <code>null</code>.</li> - * <li>It is an instance of <code>DecimalFormatSymbols</code>.</li> - * <li>All of its symbols are identical to the symbols in this object.</li> - * </ul> - * - * @return <code>true</code> if the specified object is equal to this - * object, <code>false</code> otherwise. - */ - public boolean equals (Object obj) - { - if (! (obj instanceof DecimalFormatSymbols)) - return false; - DecimalFormatSymbols dfs = (DecimalFormatSymbols) obj; - return (currencySymbol.equals(dfs.currencySymbol) - && decimalSeparator == dfs.decimalSeparator - && digit == dfs.digit - && exponential == dfs.exponential - && groupingSeparator == dfs.groupingSeparator - && infinity.equals(dfs.infinity) - && intlCurrencySymbol.equals(dfs.intlCurrencySymbol) - && minusSign == dfs.minusSign - && monetarySeparator == dfs.monetarySeparator - && NaN.equals(dfs.NaN) - && patternSeparator == dfs.patternSeparator - && percent == dfs.percent - && perMill == dfs.perMill - && zeroDigit == dfs.zeroDigit); - } - - /** - * Returns the currency corresponding to the currency symbol stored - * in the instance of <code>DecimalFormatSymbols</code>. - * - * @return An instance of <code>Currency</code> which matches - * the currency used, or null if there is no corresponding - * instance. - */ - public Currency getCurrency () - { - return currency; - } - - /** - * This method returns the currency symbol in local format. For example, - * "$" for Canadian dollars. - * - * @return The currency symbol in local format. - */ - public String getCurrencySymbol () - { - return currencySymbol; - } - - /** - * This method returns the character used as the decimal point. - * - * @return The character used as the decimal point. - */ - public char getDecimalSeparator () - { - return decimalSeparator; - } - - /** - * This method returns the character used to represent a digit in a - * format pattern string. - * - * @return The character used to represent a digit in a format - * pattern string. - */ - public char getDigit () - { - return digit; - } - - // This is our own extension. - char getExponential () - { - return exponential; - } - - /** - * This method sets the character used to separate groups of digits. For - * example, the United States uses a comma (,) to separate thousands in - * a number. - * - * @return The character used to separate groups of digits. - */ - public char getGroupingSeparator () - { - return groupingSeparator; - } - - /** - * This method returns the character used to represent infinity. - * - * @return The character used to represent infinity. - */ - public String getInfinity () - { - return infinity; - } - - /** - * This method returns the currency symbol in international format. For - * example, "C$" for Canadian dollars. - * - * @return The currency symbol in international format. - */ - public String getInternationalCurrencySymbol () - { - return intlCurrencySymbol; - } - - /** - * This method returns the character used to represent the minus sign. - * - * @return The character used to represent the minus sign. - */ - public char getMinusSign () - { - return minusSign; - } - - /** - * This method returns the character used to represent the decimal - * point for currency values. - * - * @return The decimal point character used in currency values. - */ - public char getMonetaryDecimalSeparator () - { - return monetarySeparator; - } - - /** - * This method returns the string used to represent the NaN (not a number) - * value. - * - * @return The string used to represent NaN - */ - public String getNaN () - { - return NaN; - } - - /** - * This method returns the character used to separate positive and negative - * subpatterns in a format pattern. - * - * @return The character used to separate positive and negative subpatterns - * in a format pattern. - */ - public char getPatternSeparator () - { - return patternSeparator; - } - - /** - * This method returns the character used as the percent sign. - * - * @return The character used as the percent sign. - */ - public char getPercent () - { - return percent; - } - - /** - * This method returns the character used as the per mille character. - * - * @return The per mille character. - */ - public char getPerMill () - { - return perMill; - } - - /** - * This method returns the character used to represent the digit zero. - * - * @return The character used to represent the digit zero. - */ - public char getZeroDigit () - { - return zeroDigit; - } - - /** - * This method returns a hash value for this object. - * - * @return A hash value for this object. - */ - public int hashCode () - { - // Compute based on zero digit, grouping separator, and decimal - // separator -- JCL book. This probably isn't a very good hash - // code. - return zeroDigit << 16 + groupingSeparator << 8 + decimalSeparator; - } - - /** - * This method sets the currency symbol and ISO 4217 currency - * code to the values obtained from the supplied currency. - * - * @param currency the currency from which to obtain the values. - * @throws NullPointerException if the currency is null. - */ - public void setCurrency (Currency currency) - { - setCurrencySymbol (currency.getSymbol()); - this.currency = currency; - } - - /** - * This method sets the currency symbol to the specified value. - * - * @param currency The new currency symbol - */ - public void setCurrencySymbol (String currency) - { - currencySymbol = currency; - } - - /** - * This method sets the decimal point character to the specified value. - * - * @param decimalSep The new decimal point character - */ - public void setDecimalSeparator (char decimalSep) - { - decimalSeparator = decimalSep; - } - - /** - * This method sets the character used to represents a digit in a format - * string to the specified value. - * - * @param digit The character used to represent a digit in a format pattern. - */ - public void setDigit (char digit) - { - this.digit = digit; - } - - // This is our own extension. - void setExponential (char exp) - { - exponential = exp; - } - - /** - * This method sets the character used to separate groups of digits. - * - * @param groupSep The character used to separate groups of digits. - */ - public void setGroupingSeparator (char groupSep) - { - groupingSeparator = groupSep; - } - - /** - * This method sets the string used to represents infinity. - * - * @param infinity The string used to represent infinity. - */ - public void setInfinity (String infinity) - { - this.infinity = infinity; - } - - /** - * This method sets the international currency symbol to the - * specified value. If a valid <code>Currency</code> instance - * exists for the international currency code, then this is - * used for the currency attribute, and the currency symbol - * is set to the corresponding value from this instance. - * Otherwise, the currency attribute is set to null and the - * symbol is left unmodified. - * - * @param currencyCode The new international currency symbol. - */ - public void setInternationalCurrencySymbol (String currencyCode) - { - intlCurrencySymbol = currencyCode; - try - { - currency = Currency.getInstance(currencyCode); - } - catch (IllegalArgumentException exception) - { - currency = null; - } - if (currency != null) - { - setCurrencySymbol(currency.getSymbol(locale)); - } - } - - /** - * This method sets the character used to represent the minus sign. - * - * @param minusSign The character used to represent the minus sign. - */ - public void setMinusSign (char minusSign) - { - this.minusSign = minusSign; - } - - /** - * This method sets the character used for the decimal point in currency - * values. - * - * @param decimalSep The decimal point character used in currency values. - */ - public void setMonetaryDecimalSeparator (char decimalSep) - { - monetarySeparator = decimalSep; - } - - /** - * This method sets the string used to represent the NaN (not a - * number) value. - * - * @param nan The string used to represent NaN - */ - public void setNaN (String nan) - { - NaN = nan; - } - - /** - * This method sets the character used to separate positive and negative - * subpatterns in a format pattern. - * - * @param patternSep The character used to separate positive and - * negative subpatterns in a format pattern. - */ - public void setPatternSeparator (char patternSep) - { - patternSeparator = patternSep; - } - - /** - * This method sets the character used as the percent sign. - * - * @param percent The character used as the percent sign. - */ - public void setPercent (char percent) - { - this.percent = percent; - } - - /** - * This method sets the character used as the per mille character. - * - * @param perMill The per mille character. - */ - public void setPerMill (char perMill) - { - this.perMill = perMill; - } - - /** - * This method sets the character used to represent the digit zero. - * - * @param zeroDigit The character used to represent the digit zero. - */ - public void setZeroDigit (char zeroDigit) - { - this.zeroDigit = zeroDigit; - } - - /** - * @serial A string used for the local currency - */ - private String currencySymbol; - /** - * @serial The <code>char</code> used to separate decimals in a number. - */ - private char decimalSeparator; - /** - * @serial This is the <code>char</code> used to represent a digit in - * a format specification. - */ - private char digit; - /** - * @serial This is the <code>char</code> used to represent the exponent - * separator in exponential notation. - */ - private char exponential; - /** - * @serial This separates groups of thousands in numbers. - */ - private char groupingSeparator; - /** - * @serial This string represents infinity. - */ - private String infinity; - /** - * @serial This string represents the local currency in an international - * context, eg, "C$" for Canadian dollars. - */ - private String intlCurrencySymbol; - /** - * @serial This is the character used to represent the minus sign. - */ - private char minusSign; - /** - * @serial This character is used to separate decimals when formatting - * currency values. - */ - private char monetarySeparator; - /** - * @serial This string is used the represent the Java NaN value for - * "not a number". - */ - private String NaN; - /** - * @serial This is the character used to separate positive and negative - * subpatterns in a format pattern. - */ - private char patternSeparator; - /** - * @serial This is the percent symbols - */ - private char percent; - /** - * @serial This character is used for the mille percent sign. - */ - 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 = 2; - /** - * @serial This is the character used to represent 0. - */ - private char zeroDigit; - - /** - * @serial The locale of these currency symbols. - */ - private Locale locale; - - /** - * The currency used for the symbols in this instance. - * This is stored temporarily for efficiency reasons, - * as well as to ensure that the correct instance - * is restored from the currency code. - * - * @serial Ignored. - */ - private transient Currency currency; - - private static final long serialVersionUID = 5772796243397350300L; - - private void readObject(ObjectInputStream stream) - throws IOException, ClassNotFoundException - { - stream.defaultReadObject(); - if (serialVersionOnStream < 1) - { - monetarySeparator = decimalSeparator; - exponential = 'E'; - } - if (serialVersionOnStream < 2) - locale = Locale.getDefault(); - - serialVersionOnStream = 2; - } - - /** - * Returns a {@link DecimalFormatSymbols} instance for the - * default locale obtained from either the runtime itself - * or one of the installed - * {@link java.text.spi.DecimalFormatSymbolsProvider} instances. - * This is equivalent to calling - * <code>getInstance(Locale.getDefault())</code>. - * - * @return a {@link DecimalFormatSymbols} instance for the default - * locale. - * @since 1.6 - */ - public static final DecimalFormatSymbols getInstance() - { - return getInstance(Locale.getDefault()); - } - - /** - * Returns a {@link DecimalFormatSymbols} instance for the - * specified locale obtained from either the runtime itself - * or one of the installed - * {@link java.text.spi.DecimalFormatSymbolsProvider} instances. - * - * @param locale the locale for which an instance should be - * returned. - * @return a {@link DecimalFormatSymbols} instance for the specified - * locale. - * @throws NullPointerException if <code>locale</code> is - * <code>null</code>. - * @since 1.6 - */ - public static final DecimalFormatSymbols getInstance(Locale locale) - { - try - { - if (!locale.equals(Locale.ROOT)) - ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", - locale, - ClassLoader.getSystemClassLoader()); - return new DecimalFormatSymbols(locale); - } - catch (MissingResourceException x) - { - /* This means runtime support for the locale - * is not available, so we check providers. */ - } - for (DecimalFormatSymbolsProvider p : - ServiceLoader.load(DecimalFormatSymbolsProvider.class)) - { - for (Locale loc : p.getAvailableLocales()) - { - if (loc.equals(locale)) - { - DecimalFormatSymbols syms = p.getInstance(locale); - if (syms != null) - return syms; - break; - } - } - } - return getInstance(LocaleHelper.getFallbackLocale(locale)); - } - -} |