You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2006/10/11 00:18:37 UTC
svn commit: r462605 [4/8] - in
/incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java:
java/text/ org/apache/harmony/text/ org/apache/harmony/text/internal/nls/
Modified: incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/DecimalFormatSymbols.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/DecimalFormatSymbols.java?view=diff&rev=462605&r1=462604&r2=462605
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/DecimalFormatSymbols.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/DecimalFormatSymbols.java Tue Oct 10 15:18:35 2006
@@ -17,7 +17,6 @@
package java.text;
-
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
@@ -34,503 +33,511 @@
*/
public final class DecimalFormatSymbols implements Cloneable, Serializable {
- private static final long serialVersionUID = 5772796243397350300L;
+ private static final long serialVersionUID = 5772796243397350300L;
- private final int ZeroDigit = 0, Digit = 1, DecimalSeparator = 2,
- GroupingSeparator = 3, PatternSeparator = 4, Percent = 5,
- PerMill = 6, Exponent = 7, MonetaryDecimalSeparator = 8,
- MinusSign = 9;
-
- transient char[] patternChars;
-
- private transient Currency currency;
-
- private transient Locale locale;
-
- private String infinity, NaN, currencySymbol, intlCurrencySymbol;
-
- /**
- * Constructs a new DecimalFormatSymbols containing the symbols for the
- * default Locale.
- */
- public DecimalFormatSymbols() {
- this(Locale.getDefault());
- }
-
- /**
- * Constructs a new DecimalFormatSymbols containing the symbols for the
- * specified Locale.
- *
- * @param locale
- * the Locale
- */
- public DecimalFormatSymbols(Locale locale) {
- ResourceBundle bundle = Format.getBundle(locale);
- patternChars = bundle.getString("DecimalPatternChars").toCharArray(); //$NON-NLS-1$
- infinity = bundle.getString("Infinity"); //$NON-NLS-1$
- NaN = bundle.getString("NaN"); //$NON-NLS-1$
- this.locale = locale;
- try {
- currency = Currency.getInstance(locale);
- currencySymbol = currency.getSymbol(locale);
- intlCurrencySymbol = currency.getCurrencyCode();
- } catch (IllegalArgumentException e) {
- currency = Currency.getInstance("XXX"); //$NON-NLS-1$
- currencySymbol = bundle.getString("CurrencySymbol"); //$NON-NLS-1$
- intlCurrencySymbol = bundle.getString("IntCurrencySymbol"); //$NON-NLS-1$
- }
- }
-
- /**
- * Answers a new DecimalFormatSymbols with the same symbols as this
- * DecimalFormatSymbols.
- *
- * @return a shallow copy of this DecimalFormatSymbols
- *
- * @see java.lang.Cloneable
- */
- public Object clone() {
- try {
- DecimalFormatSymbols symbols = (DecimalFormatSymbols) super.clone();
- symbols.patternChars = (char[]) patternChars.clone();
- return symbols;
- } catch (CloneNotSupportedException e) {
- return null;
- }
- }
-
- /**
- * Compares the specified object to this DecimalFormatSymbols and answer if
- * they are equal. The object must be an instance of DecimalFormatSymbols
- * with the same symbols.
- *
- * @param object
- * the object to compare with this object
- * @return true if the specified object is equal to this
- * DecimalFormatSymbols, false otherwise
- *
- * @see #hashCode
- */
- public boolean equals(Object object) {
- if (this == object)
- return true;
- if (!(object instanceof DecimalFormatSymbols))
- return false;
- DecimalFormatSymbols obj = (DecimalFormatSymbols) object;
- return Arrays.equals(patternChars, obj.patternChars)
- && infinity.equals(obj.infinity) && NaN.equals(obj.NaN)
- && currencySymbol.equals(obj.currencySymbol)
- && intlCurrencySymbol.equals(obj.intlCurrencySymbol);
- }
-
- /**
- * Answers the currency.
- * <p>
- * <code>null<code> is returned
- * if <code>setInternationalCurrencySymbol()</code> has been previously called
- * with a value that is not a valid ISO 4217 currency code.
- * <p>
- *
- * @return the currency that was set in the constructor, <code>setCurrency()</code>,
- * or <code>setInternationalCurrencySymbol()</code>, or </code>null</code>
- *
- * @see #setCurrency(Currency)
- * @see #setInternationalCurrencySymbol(String)
- */
- public Currency getCurrency() {
- return currency;
- }
-
- /**
- * Answers the international currency symbol.
- *
- * @return a String
- */
- public String getInternationalCurrencySymbol() {
- return intlCurrencySymbol;
- }
-
- /**
- * Answers the currency symbol.
- *
- * @return a String
- */
- public String getCurrencySymbol() {
- return currencySymbol;
- }
-
- /**
- * Answers the character which represents the decimal point in a number.
- *
- * @return a char
- */
- public char getDecimalSeparator() {
- return patternChars[DecimalSeparator];
- }
-
- /**
- * Answers the character which represents a single digit in a format
- * pattern.
- *
- * @return a char
- */
- public char getDigit() {
- return patternChars[Digit];
- }
-
- /**
- * Answers the character used as the thousands separator in a number.
- *
- * @return a char
- */
- public char getGroupingSeparator() {
- return patternChars[GroupingSeparator];
- }
-
- /**
- * Answers the String which represents infinity.
- *
- * @return a String
- */
- public String getInfinity() {
- return infinity;
- }
-
- String getLocalPatternChars() {
- // Don't include the MonetaryDecimalSeparator or the MinusSign
- return new String(patternChars, 0, patternChars.length - 2);
- }
-
- /**
- * Answers the minus sign character.
- *
- * @return a char
- */
- public char getMinusSign() {
- return patternChars[MinusSign];
- }
-
- /**
- * Answers the character which represents the decimal point in a monetary
- * value.
- *
- * @return a char
- */
- public char getMonetaryDecimalSeparator() {
- return patternChars[MonetaryDecimalSeparator];
- }
-
- /**
- * Answers the String which represents NaN.
- *
- * @return a String
- */
- public String getNaN() {
- return NaN;
- }
-
- /**
- * Answers the character which separates the positive and negative patterns
- * in a format pattern.
- *
- * @return a char
- */
- public char getPatternSeparator() {
- return patternChars[PatternSeparator];
- }
-
- /**
- * Answers the percent character.
- *
- * @return a char
- */
- public char getPercent() {
- return patternChars[Percent];
- }
-
- /**
- * Answers the mille percent sign character.
- *
- * @return a char
- */
- public char getPerMill() {
- return patternChars[PerMill];
- }
-
- /**
- * Answers the character which represents zero.
- *
- * @return a char
- */
- public char getZeroDigit() {
- return patternChars[ZeroDigit];
- }
-
- char getExponential() {
- return patternChars[Exponent];
- }
-
- /**
- * Answers an integer hash code for the receiver. Objects which are equal
- * answer the same value for this method.
- *
- * @return the receiver's hash
- *
- * @see #equals
- */
- public int hashCode() {
- return new String(patternChars).hashCode() + infinity.hashCode()
- + NaN.hashCode() + currencySymbol.hashCode()
- + intlCurrencySymbol.hashCode();
- }
-
- /**
- * Sets the currency.
- * <p>
- * The international currency symbol and currency symbol are updated, but
- * the min and max number of fraction digits stay the same.
- * <p>
- *
- * @param currency
- * the new currency
- *
- * @throws java.lang.NullPointerException
- * if currency is null
- */
- public void setCurrency(Currency currency) {
- if (currency == null)
- throw new NullPointerException();
- if (currency == this.currency)
- return;
- this.currency = currency;
- intlCurrencySymbol = currency.getCurrencyCode();
- currencySymbol = currency.getSymbol(locale);
- }
-
- /**
- * Sets the international currency symbol.
- * <p>
- * currency and currency symbol also are updated, if <code>value</code> is
- * a valid ISO4217 currency code.
- * <p>
- * The min and max number of fraction digits stay the same.
- *
- * @param value
- * currency code
- */
- public void setInternationalCurrencySymbol(String value) {
- if (value == null) {
- currency = null;
- intlCurrencySymbol = null;
- return;
- }
-
- if (value.equals(intlCurrencySymbol))
- return;
-
- try {
- currency = Currency.getInstance(value);
- currencySymbol = currency.getSymbol(locale);
- } catch (IllegalArgumentException e) {
- currency = null;
- }
- intlCurrencySymbol = value;
- }
-
- /**
- * Sets the currency symbol.
- *
- * @param value
- * a String
- */
- public void setCurrencySymbol(String value) {
- currencySymbol = value;
- }
-
- /**
- * Sets the character which represents the decimal point in a number.
- *
- * @param value
- * the decimal separator character
- */
- public void setDecimalSeparator(char value) {
- patternChars[DecimalSeparator] = value;
- }
-
- /**
- * Sets the character which represents a single digit in a format pattern.
- *
- * @param value
- * the digit character
- */
- public void setDigit(char value) {
- patternChars[Digit] = value;
- }
-
- /**
- * Sets the character used as the thousands separator in a number.
- *
- * @param value
- * the grouping separator character
- */
- public void setGroupingSeparator(char value) {
- patternChars[GroupingSeparator] = value;
- }
-
- /**
- * Sets the String which represents infinity.
- *
- * @param value
- * the String
- */
- public void setInfinity(String value) {
- infinity = value;
- }
-
- /**
- * Sets the minus sign character.
- *
- * @param value
- * the minus sign character
- */
- public void setMinusSign(char value) {
- patternChars[MinusSign] = value;
- }
-
- /**
- * Sets the character which represents the decimal point in a monetary
- * value.
- *
- * @param value
- * the monetary decimal separator character
- */
- public void setMonetaryDecimalSeparator(char value) {
- patternChars[MonetaryDecimalSeparator] = value;
- }
-
- /**
- * Sets the String which represents NaN.
- *
- * @param value
- * the String
- */
- public void setNaN(String value) {
- NaN = value;
- }
-
- /**
- * Sets the character which separates the positive and negative patterns in
- * a format pattern.
- *
- * @param value
- * the pattern separator character
- */
- public void setPatternSeparator(char value) {
- patternChars[PatternSeparator] = value;
- }
-
- /**
- * Sets the percent character.
- *
- * @param value
- * the percent character
- */
- public void setPercent(char value) {
- patternChars[Percent] = value;
- }
-
- /**
- * Sets the mille percent sign character.
- *
- * @param value
- * the mille percent character
- */
- public void setPerMill(char value) {
- patternChars[PerMill] = value;
- }
-
- /**
- * Sets the character which represents zero.
- *
- * @param value
- * the zero digit character
- */
- public void setZeroDigit(char value) {
- patternChars[ZeroDigit] = value;
- }
-
- void setExponential(char value) {
- patternChars[Exponent] = value;
- }
-
- private static final ObjectStreamField[] serialPersistentFields = {
- new ObjectStreamField("currencySymbol", String.class), //$NON-NLS-1$
- new ObjectStreamField("decimalSeparator", Character.TYPE), //$NON-NLS-1$
- new ObjectStreamField("digit", Character.TYPE), //$NON-NLS-1$
- new ObjectStreamField("exponential", Character.TYPE), //$NON-NLS-1$
- new ObjectStreamField("groupingSeparator", Character.TYPE), //$NON-NLS-1$
- new ObjectStreamField("infinity", String.class), //$NON-NLS-1$
- new ObjectStreamField("intlCurrencySymbol", String.class), //$NON-NLS-1$
- new ObjectStreamField("minusSign", Character.TYPE), //$NON-NLS-1$
- new ObjectStreamField("monetarySeparator", Character.TYPE), //$NON-NLS-1$
- new ObjectStreamField("NaN", String.class), //$NON-NLS-1$
- new ObjectStreamField("patternSeparator", Character.TYPE), //$NON-NLS-1$
- new ObjectStreamField("percent", Character.TYPE), //$NON-NLS-1$
- new ObjectStreamField("perMill", Character.TYPE), //$NON-NLS-1$
- new ObjectStreamField("serialVersionOnStream", Integer.TYPE), //$NON-NLS-1$
- new ObjectStreamField("zeroDigit", Character.TYPE), //$NON-NLS-1$
- new ObjectStreamField("locale", Locale.class),}; //$NON-NLS-1$
-
- private void writeObject(ObjectOutputStream stream) throws IOException {
- ObjectOutputStream.PutField fields = stream.putFields();
- fields.put("currencySymbol", currencySymbol); //$NON-NLS-1$
- fields.put("decimalSeparator", getDecimalSeparator()); //$NON-NLS-1$
- fields.put("digit", getDigit()); //$NON-NLS-1$
- fields.put("exponential", getExponential()); //$NON-NLS-1$
- fields.put("groupingSeparator", getGroupingSeparator()); //$NON-NLS-1$
- fields.put("infinity", infinity); //$NON-NLS-1$
- fields.put("intlCurrencySymbol", intlCurrencySymbol); //$NON-NLS-1$
- fields.put("minusSign", getMinusSign()); //$NON-NLS-1$
- fields.put("monetarySeparator", getMonetaryDecimalSeparator()); //$NON-NLS-1$
- fields.put("NaN", NaN); //$NON-NLS-1$
- fields.put("patternSeparator", getPatternSeparator()); //$NON-NLS-1$
- fields.put("percent", getPercent()); //$NON-NLS-1$
- fields.put("perMill", getPerMill()); //$NON-NLS-1$
- fields.put("serialVersionOnStream", 1); //$NON-NLS-1$
- fields.put("zeroDigit", getZeroDigit()); //$NON-NLS-1$
- fields.put("locale", locale); //$NON-NLS-1$
- stream.writeFields();
- }
-
- private void readObject(ObjectInputStream stream) throws IOException,
- ClassNotFoundException {
- ObjectInputStream.GetField fields = stream.readFields();
- patternChars = new char[10];
- currencySymbol = (String) fields.get("currencySymbol", ""); //$NON-NLS-1$ //$NON-NLS-2$
- setDecimalSeparator(fields.get("decimalSeparator", '.')); //$NON-NLS-1$
- setDigit(fields.get("digit", '#')); //$NON-NLS-1$
- setGroupingSeparator(fields.get("groupingSeparator", ',')); //$NON-NLS-1$
- infinity = (String) fields.get("infinity", ""); //$NON-NLS-1$ //$NON-NLS-2$
- intlCurrencySymbol = (String) fields.get("intlCurrencySymbol", ""); //$NON-NLS-1$ //$NON-NLS-2$
- setMinusSign(fields.get("minusSign", '-')); //$NON-NLS-1$
- NaN = (String) fields.get("NaN", ""); //$NON-NLS-1$ //$NON-NLS-2$
- setPatternSeparator(fields.get("patternSeparator", ';')); //$NON-NLS-1$
- setPercent(fields.get("percent", '%')); //$NON-NLS-1$
- setPerMill(fields.get("perMill", '\u2030')); //$NON-NLS-1$
- setZeroDigit(fields.get("zeroDigit", '0')); //$NON-NLS-1$
- locale = (Locale)fields.get("locale", null); //$NON-NLS-1$
- if (fields.get("serialVersionOnStream", 0) == 0) { //$NON-NLS-1$
- setMonetaryDecimalSeparator(getDecimalSeparator());
- setExponential('E');
- } else {
- setMonetaryDecimalSeparator(fields.get("monetarySeparator", '.')); //$NON-NLS-1$
- setExponential(fields.get("exponential", 'E')); //$NON-NLS-1$
-
- }
- try {
- currency = Currency.getInstance(intlCurrencySymbol);
- } catch (IllegalArgumentException e) {
- currency = null;
- }
- }
+ private final int ZeroDigit = 0, Digit = 1, DecimalSeparator = 2,
+ GroupingSeparator = 3, PatternSeparator = 4, Percent = 5,
+ PerMill = 6, Exponent = 7, MonetaryDecimalSeparator = 8,
+ MinusSign = 9;
+
+ transient char[] patternChars;
+
+ private transient Currency currency;
+
+ private transient Locale locale;
+
+ private String infinity, NaN, currencySymbol, intlCurrencySymbol;
+
+ /**
+ * Constructs a new DecimalFormatSymbols containing the symbols for the
+ * default Locale.
+ */
+ public DecimalFormatSymbols() {
+ this(Locale.getDefault());
+ }
+
+ /**
+ * Constructs a new DecimalFormatSymbols containing the symbols for the
+ * specified Locale.
+ *
+ * @param locale
+ * the Locale
+ */
+ public DecimalFormatSymbols(Locale locale) {
+ ResourceBundle bundle = Format.getBundle(locale);
+ patternChars = bundle.getString("DecimalPatternChars").toCharArray(); //$NON-NLS-1$
+ infinity = bundle.getString("Infinity"); //$NON-NLS-1$
+ NaN = bundle.getString("NaN"); //$NON-NLS-1$
+ this.locale = locale;
+ try {
+ currency = Currency.getInstance(locale);
+ currencySymbol = currency.getSymbol(locale);
+ intlCurrencySymbol = currency.getCurrencyCode();
+ } catch (IllegalArgumentException e) {
+ currency = Currency.getInstance("XXX"); //$NON-NLS-1$
+ currencySymbol = bundle.getString("CurrencySymbol"); //$NON-NLS-1$
+ intlCurrencySymbol = bundle.getString("IntCurrencySymbol"); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Answers a new DecimalFormatSymbols with the same symbols as this
+ * DecimalFormatSymbols.
+ *
+ * @return a shallow copy of this DecimalFormatSymbols
+ *
+ * @see java.lang.Cloneable
+ */
+ @Override
+ public Object clone() {
+ try {
+ DecimalFormatSymbols symbols = (DecimalFormatSymbols) super.clone();
+ symbols.patternChars = patternChars.clone();
+ return symbols;
+ } catch (CloneNotSupportedException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Compares the specified object to this DecimalFormatSymbols and answer if
+ * they are equal. The object must be an instance of DecimalFormatSymbols
+ * with the same symbols.
+ *
+ * @param object
+ * the object to compare with this object
+ * @return true if the specified object is equal to this
+ * DecimalFormatSymbols, false otherwise
+ *
+ * @see #hashCode
+ */
+ @Override
+ public boolean equals(Object object) {
+ if (this == object) {
+ return true;
+ }
+ if (!(object instanceof DecimalFormatSymbols)) {
+ return false;
+ }
+ DecimalFormatSymbols obj = (DecimalFormatSymbols) object;
+ return Arrays.equals(patternChars, obj.patternChars)
+ && infinity.equals(obj.infinity) && NaN.equals(obj.NaN)
+ && currencySymbol.equals(obj.currencySymbol)
+ && intlCurrencySymbol.equals(obj.intlCurrencySymbol);
+ }
+
+ /**
+ * Answers the currency.
+ * <p>
+ * <code>null<code> is returned
+ * if <code>setInternationalCurrencySymbol()</code> has been previously called
+ * with a value that is not a valid ISO 4217 currency code.
+ * <p>
+ *
+ * @return the currency that was set in the constructor, <code>setCurrency()</code>,
+ * or <code>setInternationalCurrencySymbol()</code>, or </code>null</code>
+ *
+ * @see #setCurrency(Currency)
+ * @see #setInternationalCurrencySymbol(String)
+ */
+ public Currency getCurrency() {
+ return currency;
+ }
+
+ /**
+ * Answers the international currency symbol.
+ *
+ * @return a String
+ */
+ public String getInternationalCurrencySymbol() {
+ return intlCurrencySymbol;
+ }
+
+ /**
+ * Answers the currency symbol.
+ *
+ * @return a String
+ */
+ public String getCurrencySymbol() {
+ return currencySymbol;
+ }
+
+ /**
+ * Answers the character which represents the decimal point in a number.
+ *
+ * @return a char
+ */
+ public char getDecimalSeparator() {
+ return patternChars[DecimalSeparator];
+ }
+
+ /**
+ * Answers the character which represents a single digit in a format
+ * pattern.
+ *
+ * @return a char
+ */
+ public char getDigit() {
+ return patternChars[Digit];
+ }
+
+ /**
+ * Answers the character used as the thousands separator in a number.
+ *
+ * @return a char
+ */
+ public char getGroupingSeparator() {
+ return patternChars[GroupingSeparator];
+ }
+
+ /**
+ * Answers the String which represents infinity.
+ *
+ * @return a String
+ */
+ public String getInfinity() {
+ return infinity;
+ }
+
+ String getLocalPatternChars() {
+ // Don't include the MonetaryDecimalSeparator or the MinusSign
+ return new String(patternChars, 0, patternChars.length - 2);
+ }
+
+ /**
+ * Answers the minus sign character.
+ *
+ * @return a char
+ */
+ public char getMinusSign() {
+ return patternChars[MinusSign];
+ }
+
+ /**
+ * Answers the character which represents the decimal point in a monetary
+ * value.
+ *
+ * @return a char
+ */
+ public char getMonetaryDecimalSeparator() {
+ return patternChars[MonetaryDecimalSeparator];
+ }
+
+ /**
+ * Answers the String which represents NaN.
+ *
+ * @return a String
+ */
+ public String getNaN() {
+ return NaN;
+ }
+
+ /**
+ * Answers the character which separates the positive and negative patterns
+ * in a format pattern.
+ *
+ * @return a char
+ */
+ public char getPatternSeparator() {
+ return patternChars[PatternSeparator];
+ }
+
+ /**
+ * Answers the percent character.
+ *
+ * @return a char
+ */
+ public char getPercent() {
+ return patternChars[Percent];
+ }
+
+ /**
+ * Answers the mille percent sign character.
+ *
+ * @return a char
+ */
+ public char getPerMill() {
+ return patternChars[PerMill];
+ }
+
+ /**
+ * Answers the character which represents zero.
+ *
+ * @return a char
+ */
+ public char getZeroDigit() {
+ return patternChars[ZeroDigit];
+ }
+
+ char getExponential() {
+ return patternChars[Exponent];
+ }
+
+ /**
+ * Answers an integer hash code for the receiver. Objects which are equal
+ * answer the same value for this method.
+ *
+ * @return the receiver's hash
+ *
+ * @see #equals
+ */
+ @Override
+ public int hashCode() {
+ return new String(patternChars).hashCode() + infinity.hashCode()
+ + NaN.hashCode() + currencySymbol.hashCode()
+ + intlCurrencySymbol.hashCode();
+ }
+
+ /**
+ * Sets the currency.
+ * <p>
+ * The international currency symbol and currency symbol are updated, but
+ * the min and max number of fraction digits stay the same.
+ * <p>
+ *
+ * @param currency
+ * the new currency
+ *
+ * @throws java.lang.NullPointerException
+ * if currency is null
+ */
+ public void setCurrency(Currency currency) {
+ if (currency == null) {
+ throw new NullPointerException();
+ }
+ if (currency == this.currency) {
+ return;
+ }
+ this.currency = currency;
+ intlCurrencySymbol = currency.getCurrencyCode();
+ currencySymbol = currency.getSymbol(locale);
+ }
+
+ /**
+ * Sets the international currency symbol.
+ * <p>
+ * currency and currency symbol also are updated, if <code>value</code> is
+ * a valid ISO4217 currency code.
+ * <p>
+ * The min and max number of fraction digits stay the same.
+ *
+ * @param value
+ * currency code
+ */
+ public void setInternationalCurrencySymbol(String value) {
+ if (value == null) {
+ currency = null;
+ intlCurrencySymbol = null;
+ return;
+ }
+
+ if (value.equals(intlCurrencySymbol)) {
+ return;
+ }
+
+ try {
+ currency = Currency.getInstance(value);
+ currencySymbol = currency.getSymbol(locale);
+ } catch (IllegalArgumentException e) {
+ currency = null;
+ }
+ intlCurrencySymbol = value;
+ }
+
+ /**
+ * Sets the currency symbol.
+ *
+ * @param value
+ * a String
+ */
+ public void setCurrencySymbol(String value) {
+ currencySymbol = value;
+ }
+
+ /**
+ * Sets the character which represents the decimal point in a number.
+ *
+ * @param value
+ * the decimal separator character
+ */
+ public void setDecimalSeparator(char value) {
+ patternChars[DecimalSeparator] = value;
+ }
+
+ /**
+ * Sets the character which represents a single digit in a format pattern.
+ *
+ * @param value
+ * the digit character
+ */
+ public void setDigit(char value) {
+ patternChars[Digit] = value;
+ }
+
+ /**
+ * Sets the character used as the thousands separator in a number.
+ *
+ * @param value
+ * the grouping separator character
+ */
+ public void setGroupingSeparator(char value) {
+ patternChars[GroupingSeparator] = value;
+ }
+
+ /**
+ * Sets the String which represents infinity.
+ *
+ * @param value
+ * the String
+ */
+ public void setInfinity(String value) {
+ infinity = value;
+ }
+
+ /**
+ * Sets the minus sign character.
+ *
+ * @param value
+ * the minus sign character
+ */
+ public void setMinusSign(char value) {
+ patternChars[MinusSign] = value;
+ }
+
+ /**
+ * Sets the character which represents the decimal point in a monetary
+ * value.
+ *
+ * @param value
+ * the monetary decimal separator character
+ */
+ public void setMonetaryDecimalSeparator(char value) {
+ patternChars[MonetaryDecimalSeparator] = value;
+ }
+
+ /**
+ * Sets the String which represents NaN.
+ *
+ * @param value
+ * the String
+ */
+ public void setNaN(String value) {
+ NaN = value;
+ }
+
+ /**
+ * Sets the character which separates the positive and negative patterns in
+ * a format pattern.
+ *
+ * @param value
+ * the pattern separator character
+ */
+ public void setPatternSeparator(char value) {
+ patternChars[PatternSeparator] = value;
+ }
+
+ /**
+ * Sets the percent character.
+ *
+ * @param value
+ * the percent character
+ */
+ public void setPercent(char value) {
+ patternChars[Percent] = value;
+ }
+
+ /**
+ * Sets the mille percent sign character.
+ *
+ * @param value
+ * the mille percent character
+ */
+ public void setPerMill(char value) {
+ patternChars[PerMill] = value;
+ }
+
+ /**
+ * Sets the character which represents zero.
+ *
+ * @param value
+ * the zero digit character
+ */
+ public void setZeroDigit(char value) {
+ patternChars[ZeroDigit] = value;
+ }
+
+ void setExponential(char value) {
+ patternChars[Exponent] = value;
+ }
+
+ private static final ObjectStreamField[] serialPersistentFields = {
+ new ObjectStreamField("currencySymbol", String.class), //$NON-NLS-1$
+ new ObjectStreamField("decimalSeparator", Character.TYPE), //$NON-NLS-1$
+ new ObjectStreamField("digit", Character.TYPE), //$NON-NLS-1$
+ new ObjectStreamField("exponential", Character.TYPE), //$NON-NLS-1$
+ new ObjectStreamField("groupingSeparator", Character.TYPE), //$NON-NLS-1$
+ new ObjectStreamField("infinity", String.class), //$NON-NLS-1$
+ new ObjectStreamField("intlCurrencySymbol", String.class), //$NON-NLS-1$
+ new ObjectStreamField("minusSign", Character.TYPE), //$NON-NLS-1$
+ new ObjectStreamField("monetarySeparator", Character.TYPE), //$NON-NLS-1$
+ new ObjectStreamField("NaN", String.class), //$NON-NLS-1$
+ new ObjectStreamField("patternSeparator", Character.TYPE), //$NON-NLS-1$
+ new ObjectStreamField("percent", Character.TYPE), //$NON-NLS-1$
+ new ObjectStreamField("perMill", Character.TYPE), //$NON-NLS-1$
+ new ObjectStreamField("serialVersionOnStream", Integer.TYPE), //$NON-NLS-1$
+ new ObjectStreamField("zeroDigit", Character.TYPE), //$NON-NLS-1$
+ new ObjectStreamField("locale", Locale.class), }; //$NON-NLS-1$
+
+ private void writeObject(ObjectOutputStream stream) throws IOException {
+ ObjectOutputStream.PutField fields = stream.putFields();
+ fields.put("currencySymbol", currencySymbol); //$NON-NLS-1$
+ fields.put("decimalSeparator", getDecimalSeparator()); //$NON-NLS-1$
+ fields.put("digit", getDigit()); //$NON-NLS-1$
+ fields.put("exponential", getExponential()); //$NON-NLS-1$
+ fields.put("groupingSeparator", getGroupingSeparator()); //$NON-NLS-1$
+ fields.put("infinity", infinity); //$NON-NLS-1$
+ fields.put("intlCurrencySymbol", intlCurrencySymbol); //$NON-NLS-1$
+ fields.put("minusSign", getMinusSign()); //$NON-NLS-1$
+ fields.put("monetarySeparator", getMonetaryDecimalSeparator()); //$NON-NLS-1$
+ fields.put("NaN", NaN); //$NON-NLS-1$
+ fields.put("patternSeparator", getPatternSeparator()); //$NON-NLS-1$
+ fields.put("percent", getPercent()); //$NON-NLS-1$
+ fields.put("perMill", getPerMill()); //$NON-NLS-1$
+ fields.put("serialVersionOnStream", 1); //$NON-NLS-1$
+ fields.put("zeroDigit", getZeroDigit()); //$NON-NLS-1$
+ fields.put("locale", locale); //$NON-NLS-1$
+ stream.writeFields();
+ }
+
+ private void readObject(ObjectInputStream stream) throws IOException,
+ ClassNotFoundException {
+ ObjectInputStream.GetField fields = stream.readFields();
+ patternChars = new char[10];
+ currencySymbol = (String) fields.get("currencySymbol", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ setDecimalSeparator(fields.get("decimalSeparator", '.')); //$NON-NLS-1$
+ setDigit(fields.get("digit", '#')); //$NON-NLS-1$
+ setGroupingSeparator(fields.get("groupingSeparator", ',')); //$NON-NLS-1$
+ infinity = (String) fields.get("infinity", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ intlCurrencySymbol = (String) fields.get("intlCurrencySymbol", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ setMinusSign(fields.get("minusSign", '-')); //$NON-NLS-1$
+ NaN = (String) fields.get("NaN", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ setPatternSeparator(fields.get("patternSeparator", ';')); //$NON-NLS-1$
+ setPercent(fields.get("percent", '%')); //$NON-NLS-1$
+ setPerMill(fields.get("perMill", '\u2030')); //$NON-NLS-1$
+ setZeroDigit(fields.get("zeroDigit", '0')); //$NON-NLS-1$
+ locale = (Locale) fields.get("locale", null); //$NON-NLS-1$
+ if (fields.get("serialVersionOnStream", 0) == 0) { //$NON-NLS-1$
+ setMonetaryDecimalSeparator(getDecimalSeparator());
+ setExponential('E');
+ } else {
+ setMonetaryDecimalSeparator(fields.get("monetarySeparator", '.')); //$NON-NLS-1$
+ setExponential(fields.get("exponential", 'E')); //$NON-NLS-1$
+
+ }
+ try {
+ currency = Currency.getInstance(intlCurrencySymbol);
+ } catch (IllegalArgumentException e) {
+ currency = null;
+ }
+ }
}
Modified: incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/FieldPosition.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/FieldPosition.java?view=diff&rev=462605&r1=462604&r2=462605
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/FieldPosition.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/FieldPosition.java Tue Oct 10 15:18:35 2006
@@ -17,152 +17,155 @@
package java.text;
-
/**
* FieldPosition is used to identify fields in formatted Strings.
*/
public class FieldPosition {
- private int myField, beginIndex, endIndex;
+ private int myField, beginIndex, endIndex;
- private Format.Field myAttribute;
+ private Format.Field myAttribute;
- /**
- * Constructs a new FieldPosition on the specified field.
- *
- * @param field
- * the field to identify
- */
- public FieldPosition(int field) {
- myField = field;
- }
-
- /**
- * Constructs a new FieldPosition on the specified Field attribute.
- *
- * @param attribute
- * the field attribute to identify
- */
- public FieldPosition(Format.Field attribute) {
- myAttribute = attribute;
- myField = -1;
- }
-
- /**
- * Constructs a new FieldPosition on the specified Field attribute and field
- * id.
- *
- * @param attribute
- * the field attribute to identify
- * @param field
- * the field to identify
- */
- public FieldPosition(Format.Field attribute, int field) {
- myAttribute = attribute;
- myField = field;
- }
-
- void clear() {
- beginIndex = endIndex = 0;
- }
-
- /**
- * Compares the specified object to this FieldPosition and answer if they
- * are equal. The object must be an instance of FieldPosition with the same
- * field, begin index and end index.
- *
- * @param object
- * the object to compare with this object
- * @return true if the specified object is equal to this fieldPosition,
- * false otherwise
- *
- * @see #hashCode
- */
- public boolean equals(Object object) {
- if (!(object instanceof FieldPosition))
- return false;
- FieldPosition pos = (FieldPosition) object;
- return myField == pos.myField && myAttribute == pos.myAttribute
- && beginIndex == pos.beginIndex && endIndex == pos.endIndex;
- }
-
- /**
- * Answers the index of the beginning of the field.
- *
- * @return the first index of the field
- */
- public int getBeginIndex() {
- return beginIndex;
- }
-
- /**
- * Answers the index one past the end of the field.
- *
- * @return one past the index of the last character in the field
- */
- public int getEndIndex() {
- return endIndex;
- }
-
- /**
- * Answers the field which is being identified.
- *
- * @return the field
- */
- public int getField() {
- return myField;
- }
-
- /**
- * Answers the attribute which is being identified.
- *
- * @return the field
- */
- public Format.Field getFieldAttribute() {
- return myAttribute;
- }
-
- /**
- * Answers an integer hash code for the receiver. Objects which are equal
- * answer the same value for this method.
- *
- * @return the receiver's hash
- *
- * @see #equals
- */
- public int hashCode() {
- int attributeHash = (myAttribute == null) ? 0 : myAttribute.hashCode();
- return attributeHash + myField * 10 + beginIndex * 100 + endIndex;
- }
-
- /**
- * Sets the index of the beginning of the field.
- *
- * @param index
- * the index of the first character in the field
- */
- public void setBeginIndex(int index) {
- beginIndex = index;
- }
-
- /**
- * Sets the index of the end of the field.
- *
- * @param index
- * one past the index of the last character in the field
- */
- public void setEndIndex(int index) {
- endIndex = index;
- }
-
- /**
- * Answers the string representation of this FieldPosition.
- *
- * @return the string representation of this FieldPosition
- */
- public String toString() {
- return getClass().getName() + "[attribute=" + myAttribute + ", field=" //$NON-NLS-1$ //$NON-NLS-2$
- + myField + ", beginIndex=" + beginIndex + ", endIndex=" //$NON-NLS-1$ //$NON-NLS-2$
- + endIndex + "]"; //$NON-NLS-1$
- }
+ /**
+ * Constructs a new FieldPosition on the specified field.
+ *
+ * @param field
+ * the field to identify
+ */
+ public FieldPosition(int field) {
+ myField = field;
+ }
+
+ /**
+ * Constructs a new FieldPosition on the specified Field attribute.
+ *
+ * @param attribute
+ * the field attribute to identify
+ */
+ public FieldPosition(Format.Field attribute) {
+ myAttribute = attribute;
+ myField = -1;
+ }
+
+ /**
+ * Constructs a new FieldPosition on the specified Field attribute and field
+ * id.
+ *
+ * @param attribute
+ * the field attribute to identify
+ * @param field
+ * the field to identify
+ */
+ public FieldPosition(Format.Field attribute, int field) {
+ myAttribute = attribute;
+ myField = field;
+ }
+
+ void clear() {
+ beginIndex = endIndex = 0;
+ }
+
+ /**
+ * Compares the specified object to this FieldPosition and answer if they
+ * are equal. The object must be an instance of FieldPosition with the same
+ * field, begin index and end index.
+ *
+ * @param object
+ * the object to compare with this object
+ * @return true if the specified object is equal to this fieldPosition,
+ * false otherwise
+ *
+ * @see #hashCode
+ */
+ @Override
+ public boolean equals(Object object) {
+ if (!(object instanceof FieldPosition)) {
+ return false;
+ }
+ FieldPosition pos = (FieldPosition) object;
+ return myField == pos.myField && myAttribute == pos.myAttribute
+ && beginIndex == pos.beginIndex && endIndex == pos.endIndex;
+ }
+
+ /**
+ * Answers the index of the beginning of the field.
+ *
+ * @return the first index of the field
+ */
+ public int getBeginIndex() {
+ return beginIndex;
+ }
+
+ /**
+ * Answers the index one past the end of the field.
+ *
+ * @return one past the index of the last character in the field
+ */
+ public int getEndIndex() {
+ return endIndex;
+ }
+
+ /**
+ * Answers the field which is being identified.
+ *
+ * @return the field
+ */
+ public int getField() {
+ return myField;
+ }
+
+ /**
+ * Answers the attribute which is being identified.
+ *
+ * @return the field
+ */
+ public Format.Field getFieldAttribute() {
+ return myAttribute;
+ }
+
+ /**
+ * Answers an integer hash code for the receiver. Objects which are equal
+ * answer the same value for this method.
+ *
+ * @return the receiver's hash
+ *
+ * @see #equals
+ */
+ @Override
+ public int hashCode() {
+ int attributeHash = (myAttribute == null) ? 0 : myAttribute.hashCode();
+ return attributeHash + myField * 10 + beginIndex * 100 + endIndex;
+ }
+
+ /**
+ * Sets the index of the beginning of the field.
+ *
+ * @param index
+ * the index of the first character in the field
+ */
+ public void setBeginIndex(int index) {
+ beginIndex = index;
+ }
+
+ /**
+ * Sets the index of the end of the field.
+ *
+ * @param index
+ * one past the index of the last character in the field
+ */
+ public void setEndIndex(int index) {
+ endIndex = index;
+ }
+
+ /**
+ * Answers the string representation of this FieldPosition.
+ *
+ * @return the string representation of this FieldPosition
+ */
+ @Override
+ public String toString() {
+ return getClass().getName() + "[attribute=" + myAttribute + ", field=" //$NON-NLS-1$ //$NON-NLS-2$
+ + myField + ", beginIndex=" + beginIndex + ", endIndex=" //$NON-NLS-1$ //$NON-NLS-2$
+ + endIndex + "]"; //$NON-NLS-1$
+ }
}
Modified: incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Format.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Format.java?view=diff&rev=462605&r1=462604&r2=462605
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Format.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Format.java Tue Oct 10 15:18:35 2006
@@ -17,7 +17,6 @@
package java.text;
-
import java.io.Serializable;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -32,218 +31,230 @@
*/
public abstract class Format implements Serializable, Cloneable {
- private static final long serialVersionUID = -299282585814624189L;
+ private static final long serialVersionUID = -299282585814624189L;
- /**
- * Constructs a new instance of Format.
- *
- */
- public Format() {
- }
-
- /**
- * Answers a copy of this Format.
- *
- * @return a shallow copy of this Format
- *
- * @see java.lang.Cloneable
- */
- public Object clone() {
- try {
- return super.clone();
- } catch (CloneNotSupportedException e) {
- return null;
- }
- }
-
- static ResourceBundle getBundle(final Locale locale) {
- return AccessController.doPrivileged(new PrivilegedAction<ResourceBundle>() {
- public ResourceBundle run() {
- return ResourceBundle.getBundle(
- "org.apache.harmony.luni.internal.locale.Locale", locale); //$NON-NLS-1$
- }
- });
+ /**
+ * Constructs a new instance of Format.
+ *
+ */
+ public Format() {
+ }
+
+ /**
+ * Answers a copy of this Format.
+ *
+ * @return a shallow copy of this Format
+ *
+ * @see java.lang.Cloneable
+ */
+ @Override
+ public Object clone() {
+ try {
+ return super.clone();
+ } catch (CloneNotSupportedException e) {
+ return null;
+ }
}
- String convertPattern(String template, String fromChars, String toChars,
- boolean check) {
- if (!check && fromChars.equals(toChars))
- return template;
- boolean quote = false;
- StringBuilder output = new StringBuilder();
- int length = template.length();
- for (int i = 0; i < length; i++) {
- int index;
- char next = template.charAt(i);
- if (next == '\'')
- quote = !quote;
- if (!quote && (index = fromChars.indexOf(next)) != -1)
- output.append(toChars.charAt(index));
- else if (check
- && !quote
- && ((next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z')))
+ static ResourceBundle getBundle(final Locale locale) {
+ return AccessController
+ .doPrivileged(new PrivilegedAction<ResourceBundle>() {
+ public ResourceBundle run() {
+ return ResourceBundle
+ .getBundle(
+ "org.apache.harmony.luni.internal.locale.Locale", locale); //$NON-NLS-1$
+ }
+ });
+ }
+
+ String convertPattern(String template, String fromChars, String toChars,
+ boolean check) {
+ if (!check && fromChars.equals(toChars)) {
+ return template;
+ }
+ boolean quote = false;
+ StringBuilder output = new StringBuilder();
+ int length = template.length();
+ for (int i = 0; i < length; i++) {
+ int index;
+ char next = template.charAt(i);
+ if (next == '\'') {
+ quote = !quote;
+ }
+ if (!quote && (index = fromChars.indexOf(next)) != -1) {
+ output.append(toChars.charAt(index));
+ } else if (check
+ && !quote
+ && ((next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z'))) {
// text.05=Invalid pattern char {0} in {1}
throw new IllegalArgumentException(Messages.getString(
"text.05", String.valueOf(next), template)); //$NON-NLS-1$
- else
- output.append(next);
- }
- if (quote)
+ } else {
+ output.append(next);
+ }
+ }
+ if (quote) {
// text.04=Unterminated quote
- throw new IllegalArgumentException(Messages.getString("text.04")); //$NON-NLS-1$
- return output.toString();
- }
-
- /**
- * Formats the specified object using the rules of this Format.
- *
- *
- * @param object
- * the object to format
- * @return the formatted String
- *
- * @exception IllegalArgumentException
- * when the object cannot be formatted by this Format
- */
- public final String format(Object object) {
- return format(object, new StringBuffer(), new FieldPosition(0))
- .toString();
- }
-
- /**
- * Formats the specified object into the specified StringBuffer using the
- * rules of this Format. If the field specified by the FieldPosition is
- * formatted, set the begin and end index of the formatted field in the
- * FieldPosition.
- *
- * @param object
- * the object to format
- * @param buffer
- * the StringBuffer
- * @param field
- * the FieldPosition
- * @return the StringBuffer parameter <code>buffer</code>
- *
- * @exception IllegalArgumentException
- * when the object cannot be formatted by this Format
- */
- public abstract StringBuffer format(Object object, StringBuffer buffer,
- FieldPosition field);
-
- /**
- * Formats the specified object using the rules of this format and returns
- * an AttributedCharacterIterator with the formatted String and no
- * attributes.
- * <p>
- * Subclasses should return an AttributedCharacterIterator with the
- * appropriate attributes.
- *
- * @param object
- * the object to format
- * @return an AttributedCharacterIterator with the formatted object and
- * attributes
- *
- * @exception IllegalArgumentException
- * when the object cannot be formatted by this Format
- */
- public AttributedCharacterIterator formatToCharacterIterator(Object object) {
- return new AttributedString(format(object)).getIterator();
- }
-
- /**
- * Parse the specified String using the rules of this Format.
- *
- * @param string
- * the String to parse
- * @return the object resulting from the parse
- *
- * @exception ParseException
- * when an error occurs during parsing
- */
- public Object parseObject(String string) throws ParseException {
- ParsePosition position = new ParsePosition(0);
- Object result = parseObject(string, position);
- if (position.getErrorIndex() != -1 || position.getIndex() == 0)
- throw new ParseException(null, position.getErrorIndex());
- return result;
- }
-
- /**
- * Parse the specified String starting at the index specified by the
- * ParsePosition. If the string is successfully parsed, the index of the
- * ParsePosition is updated to the index following the parsed text.
- *
- * @param string
- * the String to parse
- * @param position
- * the ParsePosition, updated on return with the index following
- * the parsed text, or on error the index is unchanged and the
- * error index is set to the index where the error occurred
- * @return the object resulting from the parse, or null if there is an error
- */
- public abstract Object parseObject(String string, ParsePosition position);
-
- static boolean upTo(String string, ParsePosition position,
- StringBuffer buffer, char stop) {
- int index = position.getIndex(), length = string.length();
- boolean lastQuote = false, quote = false;
- while (index < length) {
- char ch = string.charAt(index++);
- if (ch == '\'') {
- if (lastQuote)
- buffer.append('\'');
- quote = !quote;
- lastQuote = true;
- } else if (ch == stop && !quote) {
- position.setIndex(index);
- return true;
- } else {
- lastQuote = false;
- buffer.append(ch);
- }
- }
- position.setIndex(index);
- return false;
- }
-
- static boolean upToWithQuotes(String string, ParsePosition position,
- StringBuffer buffer, char stop, char start) {
- int index = position.getIndex(), length = string.length(), count = 1;
- boolean quote = false;
- while (index < length) {
- char ch = string.charAt(index++);
- if (ch == '\'')
- quote = !quote;
- if (!quote) {
- if (ch == stop)
- count--;
- if (count == 0) {
- position.setIndex(index);
- return true;
- }
- if (ch == start)
- count++;
- }
- buffer.append(ch);
- }
- // text.07=Unmatched braces in the pattern
- throw new IllegalArgumentException(Messages.getString("text.07")); //$NON-NLS-1$
- }
-
- /**
- * This inner class is used to represent Format attributes in the
- * AttributedCharacterIterator that formatToCharacterIterator() method
- * returns in the Format subclasses.
- */
- public static class Field extends AttributedCharacterIterator.Attribute {
+ throw new IllegalArgumentException(Messages.getString("text.04")); //$NON-NLS-1$
+ }
+ return output.toString();
+ }
+
+ /**
+ * Formats the specified object using the rules of this Format.
+ *
+ *
+ * @param object
+ * the object to format
+ * @return the formatted String
+ *
+ * @exception IllegalArgumentException
+ * when the object cannot be formatted by this Format
+ */
+ public final String format(Object object) {
+ return format(object, new StringBuffer(), new FieldPosition(0))
+ .toString();
+ }
+
+ /**
+ * Formats the specified object into the specified StringBuffer using the
+ * rules of this Format. If the field specified by the FieldPosition is
+ * formatted, set the begin and end index of the formatted field in the
+ * FieldPosition.
+ *
+ * @param object
+ * the object to format
+ * @param buffer
+ * the StringBuffer
+ * @param field
+ * the FieldPosition
+ * @return the StringBuffer parameter <code>buffer</code>
+ *
+ * @exception IllegalArgumentException
+ * when the object cannot be formatted by this Format
+ */
+ public abstract StringBuffer format(Object object, StringBuffer buffer,
+ FieldPosition field);
+
+ /**
+ * Formats the specified object using the rules of this format and returns
+ * an AttributedCharacterIterator with the formatted String and no
+ * attributes.
+ * <p>
+ * Subclasses should return an AttributedCharacterIterator with the
+ * appropriate attributes.
+ *
+ * @param object
+ * the object to format
+ * @return an AttributedCharacterIterator with the formatted object and
+ * attributes
+ *
+ * @exception IllegalArgumentException
+ * when the object cannot be formatted by this Format
+ */
+ public AttributedCharacterIterator formatToCharacterIterator(Object object) {
+ return new AttributedString(format(object)).getIterator();
+ }
+
+ /**
+ * Parse the specified String using the rules of this Format.
+ *
+ * @param string
+ * the String to parse
+ * @return the object resulting from the parse
+ *
+ * @exception ParseException
+ * when an error occurs during parsing
+ */
+ public Object parseObject(String string) throws ParseException {
+ ParsePosition position = new ParsePosition(0);
+ Object result = parseObject(string, position);
+ if (position.getErrorIndex() != -1 || position.getIndex() == 0) {
+ throw new ParseException(null, position.getErrorIndex());
+ }
+ return result;
+ }
+
+ /**
+ * Parse the specified String starting at the index specified by the
+ * ParsePosition. If the string is successfully parsed, the index of the
+ * ParsePosition is updated to the index following the parsed text.
+ *
+ * @param string
+ * the String to parse
+ * @param position
+ * the ParsePosition, updated on return with the index following
+ * the parsed text, or on error the index is unchanged and the
+ * error index is set to the index where the error occurred
+ * @return the object resulting from the parse, or null if there is an error
+ */
+ public abstract Object parseObject(String string, ParsePosition position);
+
+ static boolean upTo(String string, ParsePosition position,
+ StringBuffer buffer, char stop) {
+ int index = position.getIndex(), length = string.length();
+ boolean lastQuote = false, quote = false;
+ while (index < length) {
+ char ch = string.charAt(index++);
+ if (ch == '\'') {
+ if (lastQuote) {
+ buffer.append('\'');
+ }
+ quote = !quote;
+ lastQuote = true;
+ } else if (ch == stop && !quote) {
+ position.setIndex(index);
+ return true;
+ } else {
+ lastQuote = false;
+ buffer.append(ch);
+ }
+ }
+ position.setIndex(index);
+ return false;
+ }
+
+ static boolean upToWithQuotes(String string, ParsePosition position,
+ StringBuffer buffer, char stop, char start) {
+ int index = position.getIndex(), length = string.length(), count = 1;
+ boolean quote = false;
+ while (index < length) {
+ char ch = string.charAt(index++);
+ if (ch == '\'') {
+ quote = !quote;
+ }
+ if (!quote) {
+ if (ch == stop) {
+ count--;
+ }
+ if (count == 0) {
+ position.setIndex(index);
+ return true;
+ }
+ if (ch == start) {
+ count++;
+ }
+ }
+ buffer.append(ch);
+ }
+ // text.07=Unmatched braces in the pattern
+ throw new IllegalArgumentException(Messages.getString("text.07")); //$NON-NLS-1$
+ }
+
+ /**
+ * This inner class is used to represent Format attributes in the
+ * AttributedCharacterIterator that formatToCharacterIterator() method
+ * returns in the Format subclasses.
+ */
+ public static class Field extends AttributedCharacterIterator.Attribute {
private static final long serialVersionUID = 276966692217360283L;
-
- /**
- * Constructs a new instance of Field with the given fieldName.
- */
- protected Field(String fieldName) {
- super(fieldName);
- }
- }
+
+ /**
+ * Constructs a new instance of Field with the given fieldName.
+ */
+ protected Field(String fieldName) {
+ super(fieldName);
+ }
+ }
}