NumberFormat.java revision 705462a2b003b2eeed90bf3cebe0871e02554cbd
1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.text;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughesimport com.ibm.icu4jni.util.ICU;
217365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilsonimport com.ibm.icu4jni.util.LocaleData;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InvalidObjectException;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectInputStream;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectStreamField;
27d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughesimport java.math.BigInteger;
2842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughesimport java.math.RoundingMode;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Currency;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Locale;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The abstract base class for all number formats. This class provides the
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * interface for formatting and parsing numbers. {@code NumberFormat} also
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * provides methods for determining which locales have number formats, and what
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * their names are.
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code NumberFormat} helps you to format and parse numbers for any locale.
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Your code can be completely independent of the locale conventions for decimal
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * points, thousands-separators, or even the particular decimal digits used, or
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * whether the number format is even decimal.
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * To format a number for the current locale, use one of the factory class
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * methods:
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
469b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * myString = NumberFormat.getInstance().format(myNumber);
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
509b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If you are formatting multiple numbers, it is more efficient to get the
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * format and use it multiple times so that the system doesn't have to fetch the
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * information about the local language and country conventions multiple times.
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
579b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * NumberFormat nf = NumberFormat.getInstance();
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for (int i = 0; i &lt; a.length; ++i) {
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     output.println(nf.format(myNumber[i]) + &quot;; &quot;);
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * }
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
649b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * To format a number for a different locale, specify it in the call to
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code getInstance}.
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
709b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
749b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You can also use a {@code NumberFormat} to parse numbers:
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
799b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * myNumber = nf.parse(myString);
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
839b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
85705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes *
86705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes * <p>Use {@code #getInstance} or {@code #getNumberInstance} to get the default number
87705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes * format. Use {@link #getIntegerInstance} to get an integer number format,
88705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes * {@link #getCurrencyInstance} to get the currency number format, and
89705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes * {@link #getPercentInstance} to get a format for displaying percentages.
90705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes *
91705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes * <p>You can also control the display of numbers with methods such as
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code setMinimumFractionDigits}. If you want even more control over the
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * format or parsing, or want to give your users more control, you can try
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * casting the {@code NumberFormat} you get from the factory methods to a
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat}. This will work for the vast majority of locales; just
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * remember to put it in a {@code try} block in case you encounter an unusual
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * one.
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code NumberFormat} is designed such that some controls work for formatting
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and others work for parsing. For example, {@code setParseIntegerOnly} only
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * affects parsing: If set to {@code true}, "3456.78" is parsed as 3456 (and
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * leaves the parse position just after '6'); if set to {@code false},
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "3456.78" is parsed as 3456.78 (and leaves the parse position just after
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * '8'). This is independent of formatting.
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You can also use forms of the {@code parse} and {@code format} methods with
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ParsePosition} and {@code FieldPosition} to allow you to:
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>progressively parse through pieces of a string;</li>
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>align the decimal point and other areas.</li>
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * For example, you can align numbers in two ways:
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ol>
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> If you are using a monospaced font with spacing for alignment, you can
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * pass the {@code FieldPosition} in your format call, with {@code field} =
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code INTEGER_FIELD}. On output, {@code getEndIndex} will be set to the
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * offset between the last character of the integer and the decimal. Add
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (desiredSpaceCount - getEndIndex) spaces to the front of the string.</li>
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> If you are using proportional fonts, instead of padding with spaces,
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * measure the width of the string in pixels from the start to
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code getEndIndex}. Then move the pen by (desiredPixelWidth -
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * widthToAlignmentPoint) before drawing the text. This also works where there
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is no decimal but possibly additional characters before or after the number,
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for example with parentheses in negative numbers: "(12)" for -12.</li>
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ol>
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Synchronization</h4>
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Number formats are generally not synchronized. It is recommended to create
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * separate format instances for each thread. If multiple threads access a
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * format concurrently, it must be synchronized externally.
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>DecimalFormat</h4>
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat} is the concrete implementation of {@code NumberFormat},
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and the {@code NumberFormat} API is essentially an abstraction of
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat's} API. Refer to {@code DecimalFormat} for more
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * information about this API.
1389b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see DecimalFormat
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.text.ChoiceFormat
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class NumberFormat extends Format {
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = -2308460125733713944L;
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field constant identifying the integer part of a number.
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int INTEGER_FIELD = 0;
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Field constant identifying the fractional part of a number.
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int FRACTION_FIELD = 1;
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean groupingUsed = true, parseIntegerOnly = false;
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int maximumIntegerDigits = 40, minimumIntegerDigits = 1,
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            maximumFractionDigits = 3, minimumFractionDigits = 0;
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
16242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * Used by subclasses. This was public in Java 5.
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
16442db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    protected NumberFormat() {
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new {@code NumberFormat} with the same properties as this
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code NumberFormat}.
170f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a shallow copy of this {@code NumberFormat}.
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.Cloneable
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return super.clone();
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the specified object to this number format and indicates if
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * they are equal. In order to be equal, {@code object} must be an instance
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of {@code NumberFormat} with the same pattern and properties.
183f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare with this object.
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this number
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         format; {@code false} otherwise.
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #hashCode
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object object) {
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (object == this) {
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(object instanceof NumberFormat)) {
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        NumberFormat obj = (NumberFormat) object;
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return groupingUsed == obj.groupingUsed
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && parseIntegerOnly == obj.parseIntegerOnly
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && maximumFractionDigits == obj.maximumFractionDigits
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && maximumIntegerDigits == obj.maximumIntegerDigits
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && minimumFractionDigits == obj.minimumFractionDigits
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && minimumIntegerDigits == obj.minimumIntegerDigits;
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified double using the rules of this number format.
209f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the double to format.
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the formatted string.
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final String format(double value) {
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return format(value, new StringBuffer(), new FieldPosition(0))
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .toString();
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified double value as a string using the pattern of this
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number format and appends the string to the specified string buffer.
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the {@code field} member of {@code position} contains a value
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specifying a format field, then its {@code beginIndex} and
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code endIndex} members will be updated with the position of the first
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * occurrence of this field in the formatted text.
2279b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the double to format.
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target string buffer to append the formatted double value
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            to.
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            on input: an optional alignment field; on output: the offsets
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            of the alignment field in the formatted text.
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string buffer.
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
238d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes    public abstract StringBuffer format(double value, StringBuffer buffer, FieldPosition field);
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified long using the rules of this number format.
242f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to format.
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the formatted string.
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final String format(long value) {
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return format(value, new StringBuffer(), new FieldPosition(0))
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .toString();
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified long value as a string using the pattern of this
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number format and appends the string to the specified string buffer.
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the {@code field} member of {@code position} contains a value
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specifying a format field, then its {@code beginIndex} and
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code endIndex} members will be updated with the position of the first
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * occurrence of this field in the formatted text.
2609b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to format.
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target string buffer to append the formatted long value
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            to.
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            on input: an optional alignment field; on output: the offsets
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            of the alignment field in the formatted text.
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string buffer.
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
271d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes    public abstract StringBuffer format(long value, StringBuffer buffer, FieldPosition field);
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
274d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes     * Formats a number into a supplied buffer.
275d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes     * <p>
276d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes     * The number must be a subclass of {@code Number}. Instances of {@code Byte}, {@code Short},
277d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes     * {@code Integer}, and {@code Long} have {@code Number.longValue} invoked, as do instances of
278d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes     * {@code BigInteger} where {@code BigInteger.bitLength} returns <i>less than</i> 64. All other
279d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes     * values have {@code Number.doubleValue} invoked instead.
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the {@code field} member of {@code field} contains a value specifying
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * a format field, then its {@code beginIndex} and {@code endIndex} members
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will be updated with the position of the first occurrence of this field
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in the formatted text.
2859b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to format, must be a {@code Number}.
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target string buffer to append the formatted number to.
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            on input: an optional alignment field; on output: the offsets
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            of the alignment field in the formatted text.
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string buffer.
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code object} is not an instance of {@code Number}.
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
298d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes    public StringBuffer format(Object object, StringBuffer buffer, FieldPosition field) {
299d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        if (object instanceof Byte || object instanceof Short || object instanceof Integer ||
300d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes                object instanceof Long ||
301d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes                (object instanceof BigInteger && ((BigInteger) object).bitLength() < 64)) {
302a1e5d8a2c1594f7a6ed8aca6e82b106ec8ce79d6Elliott Hughes            long lv = ((Number) object).longValue();
303a1e5d8a2c1594f7a6ed8aca6e82b106ec8ce79d6Elliott Hughes            return format(lv, buffer, field);
304d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        } else if (object instanceof Number) {
305d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes            double dv = ((Number) object).doubleValue();
306d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes            return format(dv, buffer, field);
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new IllegalArgumentException();
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
31293f0d794f264baeb7a90d02e58cae60305b3912aElliott Hughes     * Returns an array of locales for which custom {@code NumberFormat} instances
31393f0d794f264baeb7a90d02e58cae60305b3912aElliott Hughes     * are available.
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Locale[] getAvailableLocales() {
316757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        return ICU.getAvailableNumberFormatLocales();
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the currency used by this number format.
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This implementation throws {@code UnsupportedOperationException},
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * concrete subclasses should override this method if they support currency
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting.
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
326f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the currency that was set in getInstance() or in setCurrency(),
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         or {@code null}.
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnsupportedOperationException
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Currency getCurrency() {
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new UnsupportedOperationException();
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing currency values
3373106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * for the user's default locale.
3383106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
339f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling currency values.
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static NumberFormat getCurrencyInstance() {
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getCurrencyInstance(Locale.getDefault());
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing currency values
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * for the specified locale.
349f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param locale
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the locale to use.
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling currency values.
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static NumberFormat getCurrencyInstance(Locale locale) {
355757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        return getInstance(LocaleData.get(locale).currencyPattern, locale);
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing integers for the
3603106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * user's default locale.
3613106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
362f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling integers.
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static NumberFormat getIntegerInstance() {
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getIntegerInstance(Locale.getDefault());
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing integers for
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the specified locale.
372f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param locale
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the locale to use.
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling integers.
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static NumberFormat getIntegerInstance(Locale locale) {
378757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        NumberFormat result = getInstance(LocaleData.get(locale).integerPattern, locale);
37933aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes        result.setParseIntegerOnly(true);
38033aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes        return result;
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing numbers for the
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * default locale.
386f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling {@code Number} objects.
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static NumberFormat getInstance() {
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getNumberInstance();
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing numbers for the
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified locale.
396f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param locale
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the locale to use.
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling {@code Number} objects.
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static NumberFormat getInstance(Locale locale) {
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getNumberInstance(locale);
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
4059b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson    // BEGIN android-added
406a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes    private static NumberFormat getInstance(String pattern, Locale locale) {
407a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        return new DecimalFormat(pattern, locale);
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
4099b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson    // END android-added
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the maximum number of fraction digits that are printed when
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting. If the maximum is less than the number of fraction digits,
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the least significant digits are truncated.
415f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the maximum number of fraction digits.
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMaximumFractionDigits() {
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return maximumFractionDigits;
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the maximum number of integer digits that are printed when
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting. If the maximum is less than the number of integer digits, the
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * most significant digits are truncated.
426f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the maximum number of integer digits.
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMaximumIntegerDigits() {
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return maximumIntegerDigits;
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the minimum number of fraction digits that are printed when
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting.
436f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the minimum number of fraction digits.
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMinimumFractionDigits() {
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return minimumFractionDigits;
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the minimum number of integer digits that are printed when
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting.
446f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the minimum number of integer digits.
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMinimumIntegerDigits() {
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return minimumIntegerDigits;
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing numbers for the
4553106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * user's default locale.
4563106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
457f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling {@code Number} objects.
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static NumberFormat getNumberInstance() {
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getNumberInstance(Locale.getDefault());
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing numbers for the
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified locale.
467f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param locale
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the locale to use.
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling {@code Number} objects.
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static NumberFormat getNumberInstance(Locale locale) {
473757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        return getInstance(LocaleData.get(locale).numberPattern, locale);
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing percentage
4783106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * values for the user's default locale.
4793106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
480f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
481705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * <p>The {@code NumberFormat} returned by this method should only be used
482705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * to format floating-point numbers typically between 0 and 1 (with 1 being 100%).
483705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * A value such as 0.53 will be treated as 53%, but 53.0 (or the integer 53) will be
484705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * treated as 5,300%, which is rarely what you intended.
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final static NumberFormat getPercentInstance() {
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getPercentInstance(Locale.getDefault());
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing percentage
492705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * values for the given {@code locale}.
493f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
494705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * <p>The {@code NumberFormat} returned by this method should only be used
495705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * to format floating-point numbers typically between 0 and 1 (with 1 being 100%).
496705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * A value such as 0.53 will be treated as 53%, but 53.0 (or the integer 53) will be
497705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * treated as 5,300%, which is rarely what you intended.
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static NumberFormat getPercentInstance(Locale locale) {
500757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        return getInstance(LocaleData.get(locale).percentPattern, locale);
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (groupingUsed ? 1231 : 1237) + (parseIntegerOnly ? 1231 : 1237)
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + maximumFractionDigits + maximumIntegerDigits
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + minimumFractionDigits + minimumIntegerDigits;
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this number format formats and parses numbers using a
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * grouping separator.
513f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if a grouping separator is used; {@code false}
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isGroupingUsed() {
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return groupingUsed;
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this number format only parses integer numbers. Parsing
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * stops if a decimal separator is encountered.
524f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this number format only parses integers,
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} if if parsese integers as well as fractions.
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isParseIntegerOnly() {
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return parseIntegerOnly;
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses a {@code Number} from the specified string using the rules of this
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number format.
535f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string to parse.
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code Number} resulting from the parsing.
5399b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws ParseException
5409b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if an error occurs during parsing.
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Number parse(String string) throws ParseException {
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ParsePosition pos = new ParsePosition(0);
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Number number = parse(string, pos);
545fe1eba10c5d69e115dfab55d82cc22d42e9fbae5Elliott Hughes        if (pos.getIndex() == 0) {
54603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            throw new ParseException("Unparseable number" + string, pos.getErrorIndex());
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return number;
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses a {@code Number} from the specified string starting at the index
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified by {@code position}. If the string is successfully parsed then
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the index of the {@code ParsePosition} is updated to the index following
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the parsed text. On error, the index is unchanged and the error index of
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code ParsePosition} is set to the index where the error occurred.
557f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string to parse.
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param position
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            input/output parameter, specifies the start index in
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code string} from where to start parsing. If parsing is
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            successful, it is updated with the index following the parsed
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            text; on error, the index is unchanged and the error index is
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            set to the index where the error occurred.
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code Number} resulting from the parse or {@code null} if
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         there is an error.
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract Number parse(String string, ParsePosition position);
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Object parseObject(String string, ParsePosition position) {
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (position == null) {
57403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            throw new NullPointerException("position is null");
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return parse(string, position);
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the currency used by this number format when formatting currency
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * values. The min and max fraction digits remain the same.
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This implementation throws {@code UnsupportedOperationException},
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * concrete subclasses should override this method if they support currency
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting.
5909b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param currency
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new currency.
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnsupportedOperationException
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setCurrency(Currency currency) {
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new UnsupportedOperationException();
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets whether this number format formats and parses numbers using a
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * grouping separator.
602f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} if a grouping separator is used; {@code false}
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            otherwise.
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setGroupingUsed(boolean value) {
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        groupingUsed = value;
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the maximum number of fraction digits that are printed when
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting. If the maximum is less than the number of fraction digits,
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the least significant digits are truncated.
615f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the maximum number of fraction digits.
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMaximumFractionDigits(int value) {
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        maximumFractionDigits = value < 0 ? 0 : value;
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (maximumFractionDigits < minimumFractionDigits) {
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            minimumFractionDigits = maximumFractionDigits;
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the new maximum count of integer digits that are printed when
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting. If the maximum is less than the number of integer digits, the
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * most significant digits are truncated.
630f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new maximum number of integer numerals for display.
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMaximumIntegerDigits(int value) {
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        maximumIntegerDigits = value < 0 ? 0 : value;
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (maximumIntegerDigits < minimumIntegerDigits) {
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            minimumIntegerDigits = maximumIntegerDigits;
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the minimum number of fraction digits that are printed when
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting.
644f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the minimum number of fraction digits.
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMinimumFractionDigits(int value) {
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        minimumFractionDigits = value < 0 ? 0 : value;
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (maximumFractionDigits < minimumFractionDigits) {
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            maximumFractionDigits = minimumFractionDigits;
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the minimum number of integer digits that are printed when
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting.
658f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the minimum number of integer digits.
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMinimumIntegerDigits(int value) {
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        minimumIntegerDigits = value < 0 ? 0 : value;
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (maximumIntegerDigits < minimumIntegerDigits) {
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            maximumIntegerDigits = minimumIntegerDigits;
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Specifies if this number format should parse numbers only as integers or
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * else as any kind of number. If this method is called with a {@code true}
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value then subsequent parsing attempts will stop if a decimal separator
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is encountered.
674f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} to only parse integers, {@code false} to parse
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            integers as well as fractions.
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setParseIntegerOnly(boolean value) {
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        parseIntegerOnly = value;
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final ObjectStreamField[] serialPersistentFields = {
68403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            new ObjectStreamField("groupingUsed", Boolean.TYPE),
68503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            new ObjectStreamField("maxFractionDigits", Byte.TYPE),
68603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            new ObjectStreamField("maximumFractionDigits", Integer.TYPE),
68703c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            new ObjectStreamField("maximumIntegerDigits", Integer.TYPE),
68803c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            new ObjectStreamField("maxIntegerDigits", Byte.TYPE),
68903c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            new ObjectStreamField("minFractionDigits", Byte.TYPE),
69003c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            new ObjectStreamField("minimumFractionDigits", Integer.TYPE),
69103c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            new ObjectStreamField("minimumIntegerDigits", Integer.TYPE),
69203c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            new ObjectStreamField("minIntegerDigits", Byte.TYPE),
69303c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            new ObjectStreamField("parseIntegerOnly", Boolean.TYPE),
69403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            new ObjectStreamField("serialVersionOnStream", Integer.TYPE), };
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void writeObject(ObjectOutputStream stream) throws IOException {
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectOutputStream.PutField fields = stream.putFields();
69803c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("groupingUsed", groupingUsed);
69903c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("maxFractionDigits",
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        maximumFractionDigits < Byte.MAX_VALUE ? (byte) maximumFractionDigits
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                : Byte.MAX_VALUE);
70203c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("maximumFractionDigits", maximumFractionDigits);
70303c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("maximumIntegerDigits", maximumIntegerDigits);
70403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("maxIntegerDigits",
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        maximumIntegerDigits < Byte.MAX_VALUE ? (byte) maximumIntegerDigits
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                : Byte.MAX_VALUE);
70703c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("minFractionDigits",
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        minimumFractionDigits < Byte.MAX_VALUE ? (byte) minimumFractionDigits
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                : Byte.MAX_VALUE);
710f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        fields.put("minimumFractionDigits", minimumFractionDigits);
71103c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("minimumIntegerDigits", minimumIntegerDigits);
71203c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("minIntegerDigits",
71303c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes                minimumIntegerDigits < Byte.MAX_VALUE ? (byte) minimumIntegerDigits : Byte.MAX_VALUE);
71403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("parseIntegerOnly", parseIntegerOnly);
71503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("serialVersionOnStream", 1);
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        stream.writeFields();
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void readObject(ObjectInputStream stream) throws IOException,
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ClassNotFoundException {
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectInputStream.GetField fields = stream.readFields();
72203c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        groupingUsed = fields.get("groupingUsed", true);
72303c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        parseIntegerOnly = fields.get("parseIntegerOnly", false);
72403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        if (fields.get("serialVersionOnStream", 0) == 0) {
72503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            maximumFractionDigits = fields.get("maxFractionDigits", (byte) 3);
72603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            maximumIntegerDigits = fields.get("maxIntegerDigits", (byte) 40);
72703c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            minimumFractionDigits = fields.get("minFractionDigits", (byte) 0);
72803c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            minimumIntegerDigits = fields.get("minIntegerDigits", (byte) 1);
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
73003c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            maximumFractionDigits = fields.get("maximumFractionDigits", 3);
73103c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            maximumIntegerDigits = fields.get("maximumIntegerDigits", 40);
73203c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            minimumFractionDigits = fields.get("minimumFractionDigits", 0);
73303c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            minimumIntegerDigits = fields.get("minimumIntegerDigits", 1);
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (minimumIntegerDigits > maximumIntegerDigits
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                || minimumFractionDigits > maximumFractionDigits) {
73703c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            throw new InvalidObjectException("min digits greater than max digits");
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (minimumIntegerDigits < 0 || maximumIntegerDigits < 0
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                || minimumFractionDigits < 0 || maximumFractionDigits < 0) {
74103c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            throw new InvalidObjectException("min or max digits negative");
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The instances of this inner class are used as attribute keys and values
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in {@code AttributedCharacterIterator} that the
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link NumberFormat#formatToCharacterIterator(Object)} method returns.
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * There is no public constructor in this class, the only instances are the
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * constants defined here.
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class Field extends Format.Field {
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static final long serialVersionUID = 7494728892700160890L;
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the number sign.
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
76103c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field SIGN = new Field("sign");
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the integer part of the number.
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
76603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field INTEGER = new Field("integer");
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the fraction part of the number.
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
77103c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field FRACTION = new Field("fraction");
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the exponent part of the number.
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
77603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field EXPONENT = new Field("exponent");
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the exponent sign symbol.
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
78103c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field EXPONENT_SIGN = new Field("exponent sign");
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the exponent symbol.
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
78603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field EXPONENT_SYMBOL = new Field("exponent symbol");
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the decimal separator.
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
79103c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field DECIMAL_SEPARATOR = new Field("decimal separator");
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the grouping separator.
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
79603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field GROUPING_SEPARATOR = new Field("grouping separator");
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the percent symbol.
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
80103c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field PERCENT = new Field("percent");
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the permille symbol.
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
80603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field PERMILLE = new Field("per mille");
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the currency symbol.
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
81103c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field CURRENCY = new Field("currency");
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Constructs a new instance of {@code NumberFormat.Field} with the
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * given field name.
8169b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson         *
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param fieldName
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the field name.
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected Field(String fieldName) {
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super(fieldName);
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Resolves instances that are deserialized to the constant
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * {@code NumberFormat.Field} values.
8279b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson         *
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the resolved field object.
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws InvalidObjectException
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if an error occurs while resolving the field object.
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected Object readResolve() throws InvalidObjectException {
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (this.equals(INTEGER)) {
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return INTEGER;
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (this.equals(FRACTION)) {
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return FRACTION;
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (this.equals(EXPONENT)) {
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return EXPONENT;
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (this.equals(EXPONENT_SIGN)) {
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return EXPONENT_SIGN;
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (this.equals(EXPONENT_SYMBOL)) {
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return EXPONENT_SYMBOL;
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (this.equals(CURRENCY)) {
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return CURRENCY;
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (this.equals(DECIMAL_SEPARATOR)) {
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return DECIMAL_SEPARATOR;
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (this.equals(GROUPING_SEPARATOR)) {
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return GROUPING_SEPARATOR;
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (this.equals(PERCENT)) {
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return PERCENT;
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (this.equals(PERMILLE)) {
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return PERMILLE;
863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (this.equals(SIGN)) {
865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return SIGN;
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
86703c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            throw new InvalidObjectException("Unknown attribute");
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
87142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    /**
87242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * Returns the {@code RoundingMode} used by this {@code NumberFormat}. The default
87342db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * implementation in {@code NumberFormat} throws {@code UnsupportedOperationException}.
87442db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * Subclasses for which a rounding mode is meaningful are expected to override this method.
87542db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * @since 1.6
87642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     */
87742db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    public RoundingMode getRoundingMode() {
87842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        throw new UnsupportedOperationException();
87942db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    }
88042db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes
88142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    /**
88242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * Sets the {@code RoundingMode} used by this {@code NumberFormat}. The default
88342db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * implementation in {@code NumberFormat} throws {@code UnsupportedOperationException}.
88442db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * Subclasses for which a rounding mode is meaningful are expected to override this method.
88542db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * @since 1.6
88642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     */
88742db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    public void setRoundingMode(RoundingMode roundingMode) {
88842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        throw new UnsupportedOperationException();
88942db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    }
890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
891