diff options
author | Tom Tromey <tromey@redhat.com> | 2001-09-05 00:00:55 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2001-09-05 00:00:55 +0000 |
commit | a1f4e5ed0ad7c060fc1b90c3b363877cb8cca198 (patch) | |
tree | e84d2d5f42b8908733b2858f19c7f95e32335a86 /libjava/java/text/NumberFormat.java | |
parent | 45932d27fb140524de00d4a08efea4cf75dd7ca0 (diff) | |
download | gcc-a1f4e5ed0ad7c060fc1b90c3b363877cb8cca198.zip gcc-a1f4e5ed0ad7c060fc1b90c3b363877cb8cca198.tar.gz gcc-a1f4e5ed0ad7c060fc1b90c3b363877cb8cca198.tar.bz2 |
SimpleDateFormat.java: Re-merged with Classpath.
* java/text/SimpleDateFormat.java: Re-merged with Classpath.
* gnu/gcj/text/LocaleData.java, gnu/gcj/text/LocaleData_en.java,
gnu/gcj/text/LocaleData_en_US.java: Removed.
* java/text/DateFormatSymbols.java (clone): Use Classpath
implementation.
(equals): Simplified.
(DateFormatSymbols): Look in gnu.java.locale for information.
(DateFormatSymbols(DateFormatSymbols)): Removed.
(safeGetResource): Removed.
(DateFormatSymbols): Throws MissingResourceException.
(ampmsDefault, erasDefault, localPatternCharsDefault,
monthsDefault, shortMonthsDefault, shortWeekdaysDefault,
weekdaysDefault, zoneStringsDefault): Removed.
* java/text/Collator.java (getAvailableLocales): Use modified
Classpath implementation.
(getInstance): Look in gnu.java.locale for information.
(clone): Rewrote.
* java/text/MessageFormat.java: Reindented.
(clone): Rewrote.
* java/text/FieldPosition.java: Merged with Classpath.
* java/text/ParsePosition.java: Merged with Classpath.
* java/text/Format.java: Merged with Classpath.
* java/text/StringCharacterIterator.java
(StringCharacterIterator(StringCharacterIterator,int,int)): New
constructor from Classpath.
* java/text/Annotation.java,
java/text/AttributedCharacterIterator.java,
java/text/AttributedString.java,
java/text/AttributedStringIterator.java: New from Classpath.
* java/text/CharacterIterator.java: Copied from Classpath.
* java/text/ChoiceFormat.java: Reindented.
(clone): Removed.
* gnu/java/text/BaseBreakIterator.java,
gnu/java/text/CharacterBreakIterator.java,
gnu/java/text/LineBreakIterator.java,
gnu/java/text/LocaleData_en.java,
gnu/java/text/LocaleData_en_US.java,
gnu/java/text/SentenceBreakIterator.java,
gnu/java/text/WordBreakIterator.java: Renamed from gnu/gcj/text/*.
* gnu/gcj/text/BaseBreakIterator.java (last): Advance past final
character.
* java/text/BreakIterator.java (getAvailableLocales): Use
Classpath implementation.
(getInstance): Look in gnu.java.locale for information.
(getCharacterInstance, getLineInstance, getSentenceInstance,
getWordInstance): Look in gnu.java.text for implementations.
* java/text/DecimalFormatSymbols.java: Reindented
(clone): Use Classpath implementation.
(DecimalFormatSymbols(DecimalFormatSymbols)): Removed.
(DecimalFormatSymbols(Locale)): Look in gnu.java.locale for
information.
* java/text/DateFormat.java: Merged with Classpath.
(getAvailableLocales): Use Classpath implementation.
(format(Object,StringBuffer,FieldPosition)): Minor cleanup.
(computeInstance): Look in gnu.java.locale for information.
* java/text/NumberFormat.java: Reindented.
(computeInstance): Look in gnu.java.locale for information.
(getAvailableLocales): Use implementation from Classpath.
(setMaximumIntegerDigits): Likewise.
(setMinimumIntegerDigits): Likewise.
(setMaximumFractionDigits): Likewise.
(clone): Removed.
* java/text/DecimalFormat.java: Reindented.
* gnu/java/locale/LocaleInformation_en.java: Copied from Classpath.
* gnu/java/locale/LocaleInformation_en_US.java: Copied from Classpath.
* Makefile.in: Rebuilt.
* Makefile.am (ordinary_java_source_files): Added all new files.
(ordinary_java_source_files): Renamed or removed gnu/gcj/text/*.
* java/security/spec/AlgorithmParameterSpec.java,
java/security/spec/KeySpec.java: Re-merged with Classpath.
From-SVN: r45390
Diffstat (limited to 'libjava/java/text/NumberFormat.java')
-rw-r--r-- | libjava/java/text/NumberFormat.java | 591 |
1 files changed, 446 insertions, 145 deletions
diff --git a/libjava/java/text/NumberFormat.java b/libjava/java/text/NumberFormat.java index 80d5c13..739ca31 100644 --- a/libjava/java/text/NumberFormat.java +++ b/libjava/java/text/NumberFormat.java @@ -1,10 +1,29 @@ -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation +/* NumberFormat.java -- Formats and parses numbers + Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - This file is part of libgcj. +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. + +As a special exception, if you link this library with other files to +produce an executable, this library does not by itself cause the +resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why the +executable file might be covered by the GNU General Public License. */ -This software is copyrighted work licensed under the terms of the -Libgcj License. Please consult the file "LIBGCJ_LICENSE" for -details. */ package java.text; @@ -16,50 +35,108 @@ import java.io.ObjectOutputStream; import java.io.IOException; /** + * This is the abstract superclass of all classes which format and + * parse numeric values such as decimal numbers, integers, currency values, + * and percentages. These classes perform their parsing and formatting + * in a locale specific manner, accounting for such items as differing + * currency symbols and thousands separators. + * <p> + * To create an instance of a concrete subclass of <code>NumberFormat</code>, + * do not call a class constructor directly. Instead, use one of the + * static factory methods in this class such as + * <code>getCurrencyInstance</code>. + * * @author Tom Tromey <tromey@cygnus.com> + * @author Aaron M. Renn (arenn@urbanophile.com) * @date March 4, 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, except getAvailableLocales. */ - public abstract class NumberFormat extends Format implements Cloneable { + /** + * This is a constant used to create a <code>FieldPosition</code> object + * that will return the integer portion of a formatted number. + */ public static final int INTEGER_FIELD = 0; + + /** + * This is a constant used to create a <code>FieldPosition</code> object + * that will return the fractional portion of a formatted number. + */ public static final int FRACTION_FIELD = 1; + /** + * This method is a specialization of the format method that performs + * a simple formatting of the specified <code>long</code> number. + * + * @param number The <code>long</code> to format. + * + * @return The formatted number + */ public final String format (long number) - { - StringBuffer sbuf = new StringBuffer(50); - format (number, sbuf, null); - return sbuf.toString(); - } + { + StringBuffer sbuf = new StringBuffer(50); + format (number, sbuf, null); + return sbuf.toString(); + } public final StringBuffer format (Object obj, StringBuffer sbuf, FieldPosition pos) - { - if (obj instanceof Number) - return format(((Number) obj).doubleValue(), sbuf, pos); - else - throw new IllegalArgumentException - ("Cannot format given Object as a Number"); - } + { + if (obj instanceof Number) + return format(((Number) obj).doubleValue(), sbuf, pos); + else + throw new IllegalArgumentException + ("Cannot format given Object as a Number"); + } + /** + * This method formats the specified <code>double</code> and appends it to + * a <code>StringBuffer</code>. + * + * @param number The <code>double</code> to format. + * @param sb The <code>StringBuffer</code> to append the formatted number to. + * @param pos The desired <code>FieldPosition</code>. + * + * @return The <code>StringBuffer</code> with the appended number. + */ public abstract StringBuffer format (double number, StringBuffer sbuf, FieldPosition pos); + /** + * This method formats the specified <code>long</code> and appends it to + * a <code>StringBuffer</code>. + * + * @param number The <code>long</code> to format. + * @param sb The <code>StringBuffer</code> to append the formatted number to. + * @param pos The desired <code>FieldPosition</code>. + * + * @return The <code>StringBuffer</code> with the appended number. + */ public abstract StringBuffer format (long number, StringBuffer sbuf, FieldPosition pos); - public Object clone () - { - // We know the superclass just uses Object's generic cloner. - // Why not just inherit? Because the online docs specify that - // this method exists for this class. - return super.clone (); - } - + /** + * This method tests the specified object for equality against this object. + * This will be <code>true</code> if the following conditions are met: + * <p> + * <ul> + * <li>The specified object is not <code>null</code>. + * <li>The specified object is an instance of <code>NumberFormat</code>. + * </ul> + * <p> + * Since this method does not test much, it is highly advised that + * concrete subclasses override this method. + * + * @param obj The <code>Object</code> to test against equality with + * this object. + * + * @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 NumberFormat)) @@ -73,182 +150,406 @@ public abstract class NumberFormat extends Format implements Cloneable && parseIntegerOnly == nf.parseIntegerOnly); } + /** + * This method returns a list of locales for which concrete instances + * of <code>NumberFormat</code> subclasses may be created. + * + * @return The list of available locales. + */ public static Locale[] getAvailableLocales () - { - // FIXME. - return null; - } + { + Locale[] list = new Locale[1]; + list[0] = Locale.US; + return list; + } private static final NumberFormat computeInstance (Locale loc, String resource, String def) - { - ResourceBundle res; - try - { - res = ResourceBundle.getBundle("gnu.gcj.text.LocaleData", loc); - } - catch (MissingResourceException x) - { - res = null; - } - String fmt; - try - { - fmt = res == null ? def : res.getString(resource); - } - catch (MissingResourceException x) - { - fmt = def; - } - DecimalFormatSymbols dfs = new DecimalFormatSymbols (loc); - return new DecimalFormat (fmt, dfs); - } + { + ResourceBundle res; + try + { + res = ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", + loc); + } + catch (MissingResourceException x) + { + res = null; + } + String fmt; + try + { + fmt = res == null ? def : res.getString(resource); + } + catch (MissingResourceException x) + { + fmt = def; + } + DecimalFormatSymbols dfs = new DecimalFormatSymbols (loc); + return new DecimalFormat (fmt, dfs); + } + /** + * This method returns an instance of <code>NumberFormat</code> suitable + * for formatting and parsing currency values in the default locale. + * + * @return An instance of <code>NumberFormat</code> for handling currencies. + */ public static final NumberFormat getCurrencyInstance () - { - return getCurrencyInstance (Locale.getDefault()); - } + { + return getCurrencyInstance (Locale.getDefault()); + } + /** + * This method returns an instance of <code>NumberFormat</code> suitable + * for formatting and parsing currency values in the specified locale. + * + * @return An instance of <code>NumberFormat</code> for handling currencies. + */ public static NumberFormat getCurrencyInstance (Locale loc) - { - return computeInstance (loc, "currencyFormat", "$#,##0.00;($#,##0.00)"); - } + { + return computeInstance (loc, "currencyFormat", "$#,##0.00;($#,##0.00)"); + } + /** + * This method returns a default instance 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 the default <code>NumberFormat</code> class. + */ public static final NumberFormat getInstance () - { - return getInstance (Locale.getDefault()); - } + { + return getInstance (Locale.getDefault()); + } + /** + * This method returns a default instance for the specified locale. This + * 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 NumberFormat getInstance (Locale loc) - { - // For now always return a number instance. - return getNumberInstance (loc); - } + { + // For now always return a number instance. + return getNumberInstance (loc); + } + /** + * This method returns the maximum number of digits allowed in the fraction + * portion of a number. + * + * @return The maximum number of digits allowed in the fraction + * portion of a number. + */ public int getMaximumFractionDigits () - { - return maximumFractionDigits; - } + { + return maximumFractionDigits; + } + /** + * This method returns the maximum number of digits allowed in the integer + * portion of a number. + * + * @return The maximum number of digits allowed in the integer + * portion of a number. + */ public int getMaximumIntegerDigits () - { - return maximumIntegerDigits; - } + { + return maximumIntegerDigits; + } + /** + * This method returns the minimum number of digits allowed in the fraction + * portion of a number. + * + * @return The minimum number of digits allowed in the fraction + * portion of a number. + */ public int getMinimumFractionDigits () - { - return minimumFractionDigits; - } + { + return minimumFractionDigits; + } + /** + * This method returns the minimum number of digits allowed in the integer + * portion of a number. + * + * @return The minimum number of digits allowed in the integer + * portion of a number. + */ public int getMinimumIntegerDigits () - { - return minimumIntegerDigits; - } + { + return minimumIntegerDigits; + } + /** + * This method returns a default instance for the specified locale. This + * 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 () - { - return getNumberInstance (Locale.getDefault()); - } + { + return getNumberInstance (Locale.getDefault()); + } + /** + * This method returns a general purpose number 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 a generic number formatter for the default locale. + */ public static NumberFormat getNumberInstance (Locale loc) - { - return computeInstance (loc, "numberFormat", "#,##0.###"); - } + { + return computeInstance (loc, "numberFormat", "#,##0.###"); + } + /** + * This method returns an instance of <code>NumberFormat</code> suitable + * for formatting and parsing percentage values in the default locale. + * + * @return An instance of <code>NumberFormat</code> for handling percentages. + */ public static final NumberFormat getPercentInstance () - { - return getPercentInstance (Locale.getDefault()); - } + { + return getPercentInstance (Locale.getDefault()); + } + /** + * This method returns an instance of <code>NumberFormat</code> suitable + * for formatting and parsing percentage values in the specified locale. + * + * @param locale The desired locale. + * + * @return An instance of <code>NumberFormat</code> for handling percentages. + */ public static NumberFormat getPercentInstance (Locale loc) - { - return computeInstance (loc, "percentFormat", "#,##0%"); - } + { + return computeInstance (loc, "percentFormat", "#,##0%"); + } + /** + * This method returns a hash value for this object. + * + * @return The hash code. + */ public int hashCode () - { - int hash = super.hashCode(); - hash ^= (maximumFractionDigits + maximumIntegerDigits - + minimumFractionDigits + minimumIntegerDigits); - if (groupingUsed) - hash ^= 0xf0f0; - if (parseIntegerOnly) - hash ^= 0x0f0f; - return hash; - } + { + int hash = super.hashCode(); + hash ^= (maximumFractionDigits + maximumIntegerDigits + + minimumFractionDigits + minimumIntegerDigits); + if (groupingUsed) + hash ^= 0xf0f0; + if (parseIntegerOnly) + hash ^= 0x0f0f; + return hash; + } + /** + * This method tests whether or not grouping is in use. Grouping is + * a method of marking separations in numbers, such as thousand separators + * in the US English locale. The grouping positions and symbols are all + * locale specific. As an example, with grouping disabled, the number one + * million would appear as "1000000". With grouping enabled, this number + * might appear as "1,000,000". (Both of these assume the US English + * locale). + * + * @return <code>true</code> if grouping is enabled, + * <code>false</code> otherwise. + */ public boolean isGroupingUsed () - { - return groupingUsed; - } + { + return groupingUsed; + } + /** + * This method tests whether or not only integer values should be parsed. + * If this class is parsing only integers, parsing stops at the decimal + * point. + * + * @return <code>true</code> if only integers are parsed, + * <code>false</code> otherwise. + */ public boolean isParseIntegerOnly () - { - return parseIntegerOnly; - } + { + return parseIntegerOnly; + } + /** + * This is a default constructor for use by subclasses. + */ public NumberFormat () - { - } + { + } + /** + * This method parses the specified string into a <code>Number</code>. This + * will be a <code>Long</code> if possible, otherwise it will be a + * <code>Double</code>. If no number can be parsed, no exception is + * thrown. Instead, the parse position remains at its initial index. + * + * @param str The string to parse. + * @param pp The desired <code>ParsePosition</code>. + * + * @return The parsed <code>Number</code> + */ public abstract Number parse (String sourceStr, ParsePosition pos); + /** + * This method parses the specified string into a <code>Number</code>. This + * will be a <code>Long</code> if possible, otherwise it will be a + * <code>Double</code>. If no number can be parsed, an exception will be + * thrown. + * + * @param str The string to parse. + * + * @return The parsed <code>Number</code> + * + * @exception ParseException If no number can be parsed. + */ public Number parse (String sourceStr) throws ParseException - { - ParsePosition pp = new ParsePosition (0); - Number r = parse (sourceStr, pp); - if (r == null) - { - int index = pp.getErrorIndex(); - if (index < 0) - index = pp.getIndex(); - throw new ParseException ("couldn't parse number", index); - } - return r; - } + { + ParsePosition pp = new ParsePosition (0); + Number r = parse (sourceStr, pp); + if (r == null) + { + int index = pp.getErrorIndex(); + if (index < 0) + index = pp.getIndex(); + throw new ParseException ("couldn't parse number", index); + } + return r; + } + /** + * This method parses the specified string into an <code>Object</code>. This + * will be a <code>Long</code> if possible, otherwise it will be a + * <code>Double</code>. If no number can be parsed, no exception is + * thrown. Instead, the parse position remains at its initial index. + * + * @param str The string to parse. + * @param pp The desired <code>ParsePosition</code>. + * + * @return The parsed <code>Object</code> + */ public final Object parseObject (String sourceStr, ParsePosition pos) - { - return parse (sourceStr, pos); - } + { + return parse (sourceStr, pos); + } + /** + * This method sets the grouping behavior of this formatter. Grouping is + * a method of marking separations in numbers, such as thousand separators + * in the US English locale. The grouping positions and symbols are all + * locale specific. As an example, with grouping disabled, the number one + * million would appear as "1000000". With grouping enabled, this number + * might appear as "1,000,000". (Both of these assume the US English + * locale). + * + * @param groupingUsed <code>true</code> to enable grouping, + * <code>false</code> to disable it. + */ public void setGroupingUsed (boolean newValue) - { - groupingUsed = newValue; - } + { + groupingUsed = newValue; + } + /** + * This method sets the maximum number of digits allowed in the fraction + * portion of a number to the specified value. If this is less than the + * current minimum allowed digits, the minimum allowed digits value will + * be lowered to be equal to the new maximum allowed digits value. + * + * @param maximumFractionDigits The new maximum fraction digits value. + */ public void setMaximumFractionDigits (int newValue) - { - maximumFractionDigits = newValue; - } + { + maximumFractionDigits = newValue; + if (getMinimumFractionDigits () > maximumFractionDigits) + setMinimumFractionDigits (maximumFractionDigits); + } + /** + * This method sets the maximum number of digits allowed in the integer + * portion of a number to the specified value. If this is less than the + * current minimum allowed digits, the minimum allowed digits value will + * be lowered to be equal to the new maximum allowed digits value. + * + * @param maximumIntegerDigits The new maximum integer digits value. + */ public void setMaximumIntegerDigits (int newValue) - { - maximumIntegerDigits = newValue; - } + { + maximumIntegerDigits = newValue; + if (getMinimumIntegerDigits () > maximumIntegerDigits) + setMinimumIntegerDigits (maximumIntegerDigits); + } + /** + * This method sets the minimum number of digits allowed in the fraction + * portion of a number to the specified value. If this is greater than the + * current maximum allowed digits, the maximum allowed digits value will + * be raised to be equal to the new minimum allowed digits value. + * + * @param minimumFractionDigits The new minimum fraction digits value. + */ public void setMinimumFractionDigits (int newValue) - { - minimumFractionDigits = newValue; - } + { + minimumFractionDigits = newValue; + if (getMaximumFractionDigits () < minimumFractionDigits) + setMaximumFractionDigits (minimumFractionDigits); + } + /** + * This method sets the minimum number of digits allowed in the integer + * portion of a number to the specified value. If this is greater than the + * current maximum allowed digits, the maximum allowed digits value will + * be raised to be equal to the new minimum allowed digits value. + * + * @param minimumIntegerDigits The new minimum integer digits value. + */ public void setMinimumIntegerDigits (int newValue) - { - minimumIntegerDigits = newValue; - } + { + minimumIntegerDigits = newValue; + if (getMaximumIntegerDigits () < minimumIntegerDigits) + setMaximumIntegerDigits (minimumIntegerDigits); + } + /** + * This method sets the parsing behavior of this object to parse only + * integers or not. + * + * @param parseIntegerOnly <code>true</code> to parse only integers, + * <code>false</code> otherwise. + */ public void setParseIntegerOnly (boolean value) - { - parseIntegerOnly = value; - } + { + parseIntegerOnly = value; + } + /** + * This method is a specialization of the format method that performs + * a simple formatting of the specified <code>double</code> number. + * + * @param number The <code>double</code> to format. + * + * @return The formatted number + */ public final String format (double number) - { - StringBuffer sbuf = new StringBuffer(50); - format (number, sbuf, null); - return sbuf.toString(); - } + { + StringBuffer sbuf = new StringBuffer(50); + format (number, sbuf, null); + return sbuf.toString(); + } // These field names are fixed by the serialization spec. boolean groupingUsed; |