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
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InvalidObjectException;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectInputStream;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectStreamField;
25d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughesimport java.math.BigInteger;
2642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughesimport java.math.RoundingMode;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Currency;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Locale;
29162b0775772fa66b7eb634760a8159a60c1ddceaElliott Hughesimport libcore.icu.ICU;
30162b0775772fa66b7eb634760a8159a60c1ddceaElliott Hughesimport libcore.icu.LocaleData;
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
15874473971cc9d960376295fbcc430320c9ed62991Elliott Hughes    int maximumIntegerDigits = 40;
15974473971cc9d960376295fbcc430320c9ed62991Elliott Hughes    int minimumIntegerDigits = 1;
16074473971cc9d960376295fbcc430320c9ed62991Elliott Hughes    int maximumFractionDigits = 3;
16174473971cc9d960376295fbcc430320c9ed62991Elliott Hughes    int minimumFractionDigits = 0;
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
16442db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * Used by subclasses. This was public in Java 5.
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
16642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    protected NumberFormat() {
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
17034a3a0501220dd62b88ddb4a355bad46b15c25a2Elliott Hughes     * Returns a new {@code NumberFormat} with the same properties.
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return super.clone();
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the specified object to this number format and indicates if
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * they are equal. In order to be equal, {@code object} must be an instance
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of {@code NumberFormat} with the same pattern and properties.
181f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare with this object.
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this number
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         format; {@code false} otherwise.
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #hashCode
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object object) {
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (object == this) {
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(object instanceof NumberFormat)) {
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        NumberFormat obj = (NumberFormat) object;
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return groupingUsed == obj.groupingUsed
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && parseIntegerOnly == obj.parseIntegerOnly
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && maximumFractionDigits == obj.maximumFractionDigits
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && maximumIntegerDigits == obj.maximumIntegerDigits
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && minimumFractionDigits == obj.minimumFractionDigits
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && minimumIntegerDigits == obj.minimumIntegerDigits;
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified double using the rules of this number format.
207f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the double to format.
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the formatted string.
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final String format(double value) {
21374473971cc9d960376295fbcc430320c9ed62991Elliott Hughes        return format(value, new StringBuffer(), new FieldPosition(0)).toString();
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified double value as a string using the pattern of this
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number format and appends the string to the specified string buffer.
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the {@code field} member of {@code position} contains a value
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specifying a format field, then its {@code beginIndex} and
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code endIndex} members will be updated with the position of the first
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * occurrence of this field in the formatted text.
2249b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the double to format.
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target string buffer to append the formatted double value
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            to.
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            on input: an optional alignment field; on output: the offsets
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            of the alignment field in the formatted text.
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string buffer.
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
235d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes    public abstract StringBuffer format(double value, StringBuffer buffer, FieldPosition field);
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified long using the rules of this number format.
239f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to format.
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the formatted string.
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final String format(long value) {
24574473971cc9d960376295fbcc430320c9ed62991Elliott Hughes        return format(value, new StringBuffer(), new FieldPosition(0)).toString();
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified long value as a string using the pattern of this
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number format and appends the string to the specified string buffer.
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the {@code field} member of {@code position} contains a value
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specifying a format field, then its {@code beginIndex} and
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code endIndex} members will be updated with the position of the first
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * occurrence of this field in the formatted text.
2569b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to format.
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target string buffer to append the formatted long value
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            to.
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            on input: an optional alignment field; on output: the offsets
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            of the alignment field in the formatted text.
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string buffer.
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
267d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes    public abstract StringBuffer format(long value, StringBuffer buffer, FieldPosition field);
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
270d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes     * Formats a number into a supplied buffer.
271d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes     * <p>
272d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes     * The number must be a subclass of {@code Number}. Instances of {@code Byte}, {@code Short},
273d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes     * {@code Integer}, and {@code Long} have {@code Number.longValue} invoked, as do instances of
274d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes     * {@code BigInteger} where {@code BigInteger.bitLength} returns <i>less than</i> 64. All other
275d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes     * values have {@code Number.doubleValue} invoked instead.
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the {@code field} member of {@code field} contains a value specifying
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * a format field, then its {@code beginIndex} and {@code endIndex} members
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will be updated with the position of the first occurrence of this field
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in the formatted text.
2819b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to format, must be a {@code Number}.
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target string buffer to append the formatted number to.
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            on input: an optional alignment field; on output: the offsets
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            of the alignment field in the formatted text.
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string buffer.
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code object} is not an instance of {@code Number}.
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
294d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes    public StringBuffer format(Object object, StringBuffer buffer, FieldPosition field) {
295d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        if (object instanceof Byte || object instanceof Short || object instanceof Integer ||
296d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes                object instanceof Long ||
297d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes                (object instanceof BigInteger && ((BigInteger) object).bitLength() < 64)) {
298a1e5d8a2c1594f7a6ed8aca6e82b106ec8ce79d6Elliott Hughes            long lv = ((Number) object).longValue();
299a1e5d8a2c1594f7a6ed8aca6e82b106ec8ce79d6Elliott Hughes            return format(lv, buffer, field);
300d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        } else if (object instanceof Number) {
301d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes            double dv = ((Number) object).doubleValue();
302d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes            return format(dv, buffer, field);
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
30474473971cc9d960376295fbcc430320c9ed62991Elliott Hughes        if (object == null) {
30574473971cc9d960376295fbcc430320c9ed62991Elliott Hughes            throw new IllegalArgumentException("Can't format null object");
30674473971cc9d960376295fbcc430320c9ed62991Elliott Hughes        } else {
30774473971cc9d960376295fbcc430320c9ed62991Elliott Hughes            throw new IllegalArgumentException("Bad class: " + object.getClass());
30874473971cc9d960376295fbcc430320c9ed62991Elliott Hughes        }
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.
314d2d7abef3e9b73a57cdf1f2afd678d7f48945679Elliott Hughes     * <p>Note that Android does not support user-supplied locale service providers.
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Locale[] getAvailableLocales() {
317757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        return ICU.getAvailableNumberFormatLocales();
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the currency used by this number format.
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This implementation throws {@code UnsupportedOperationException},
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * concrete subclasses should override this method if they support currency
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting.
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
327f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the currency that was set in getInstance() or in setCurrency(),
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         or {@code null}.
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnsupportedOperationException
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Currency getCurrency() {
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new UnsupportedOperationException();
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing currency values
3383106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * for the user's default locale.
3393106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
340f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling currency values.
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3430d4ce4227fa818288b8db762b640dfa21e3162f5Elliott Hughes    public static final NumberFormat getCurrencyInstance() {
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getCurrencyInstance(Locale.getDefault());
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing currency values
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * for the specified locale.
350f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param locale
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the locale to use.
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling currency values.
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static NumberFormat getCurrencyInstance(Locale locale) {
356e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath        if (locale == null) {
357e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath            throw new NullPointerException("locale == null");
358e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath        }
359e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath
360757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        return getInstance(LocaleData.get(locale).currencyPattern, locale);
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing integers for the
3653106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * user's default locale.
3663106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
367f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling integers.
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3700d4ce4227fa818288b8db762b640dfa21e3162f5Elliott Hughes    public static final NumberFormat getIntegerInstance() {
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getIntegerInstance(Locale.getDefault());
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing integers for
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the specified locale.
377f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param locale
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the locale to use.
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling integers.
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static NumberFormat getIntegerInstance(Locale locale) {
383e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath        if (locale == null) {
384e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath            throw new NullPointerException("locale == null");
385e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath        }
386e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath
387757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        NumberFormat result = getInstance(LocaleData.get(locale).integerPattern, locale);
38833aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes        result.setParseIntegerOnly(true);
38933aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes        return result;
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing numbers for the
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * default locale.
395f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling {@code Number} objects.
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3980d4ce4227fa818288b8db762b640dfa21e3162f5Elliott Hughes    public static final NumberFormat getInstance() {
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getNumberInstance();
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing numbers for the
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified locale.
405f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param locale
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the locale to use.
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling {@code Number} objects.
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static NumberFormat getInstance(Locale locale) {
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getNumberInstance(locale);
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
414a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes    private static NumberFormat getInstance(String pattern, Locale locale) {
415a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        return new DecimalFormat(pattern, locale);
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the maximum number of fraction digits that are printed when
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting. If the maximum is less than the number of fraction digits,
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the least significant digits are truncated.
422f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the maximum number of fraction digits.
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMaximumFractionDigits() {
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return maximumFractionDigits;
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the maximum number of integer digits that are printed when
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting. If the maximum is less than the number of integer digits, the
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * most significant digits are truncated.
433f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the maximum number of integer digits.
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMaximumIntegerDigits() {
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return maximumIntegerDigits;
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the minimum number of fraction digits that are printed when
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting.
443f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the minimum number of fraction digits.
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMinimumFractionDigits() {
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return minimumFractionDigits;
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the minimum number of integer digits that are printed when
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting.
453f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the minimum number of integer digits.
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMinimumIntegerDigits() {
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return minimumIntegerDigits;
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing numbers for the
4623106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * user's default locale.
4633106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
464f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling {@code Number} objects.
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
4670d4ce4227fa818288b8db762b640dfa21e3162f5Elliott Hughes    public static final NumberFormat getNumberInstance() {
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getNumberInstance(Locale.getDefault());
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing numbers for the
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified locale.
474f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param locale
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the locale to use.
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code NumberFormat} for handling {@code Number} objects.
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static NumberFormat getNumberInstance(Locale locale) {
480e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath        if (locale == null) {
481e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath            throw new NullPointerException("locale == null");
482e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath        }
483757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        return getInstance(LocaleData.get(locale).numberPattern, locale);
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing percentage
4883106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * values for the user's default locale.
4893106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
490f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
491705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * <p>The {@code NumberFormat} returned by this method should only be used
492705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * to format floating-point numbers typically between 0 and 1 (with 1 being 100%).
493705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * A value such as 0.53 will be treated as 53%, but 53.0 (or the integer 53) will be
494705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * treated as 5,300%, which is rarely what you intended.
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
4960d4ce4227fa818288b8db762b640dfa21e3162f5Elliott Hughes    public static final NumberFormat getPercentInstance() {
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getPercentInstance(Locale.getDefault());
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code NumberFormat} for formatting and parsing percentage
502705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * values for the given {@code locale}.
503f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
504705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * <p>The {@code NumberFormat} returned by this method should only be used
505705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * to format floating-point numbers typically between 0 and 1 (with 1 being 100%).
506705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * A value such as 0.53 will be treated as 53%, but 53.0 (or the integer 53) will be
507705462a2b003b2eeed90bf3cebe0871e02554cbdElliott Hughes     * treated as 5,300%, which is rarely what you intended.
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static NumberFormat getPercentInstance(Locale locale) {
510e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath        if (locale == null) {
511e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath            throw new NullPointerException("locale == null");
512e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath        }
513e4f01dff49442840faa828dcff0d1583a2e68530Narayan Kamath
514757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        return getInstance(LocaleData.get(locale).percentPattern, locale);
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (groupingUsed ? 1231 : 1237) + (parseIntegerOnly ? 1231 : 1237)
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + maximumFractionDigits + maximumIntegerDigits
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + minimumFractionDigits + minimumIntegerDigits;
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this number format formats and parses numbers using a
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * grouping separator.
527f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if a grouping separator is used; {@code false}
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isGroupingUsed() {
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return groupingUsed;
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
53674473971cc9d960376295fbcc430320c9ed62991Elliott Hughes     * Returns true if this number format only parses integer numbers. Parsing
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * stops if a decimal separator is encountered.
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isParseIntegerOnly() {
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return parseIntegerOnly;
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses a {@code Number} from the specified string using the rules of this
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number format.
546f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string to parse.
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code Number} resulting from the parsing.
5509b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws ParseException
5519b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if an error occurs during parsing.
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Number parse(String string) throws ParseException {
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ParsePosition pos = new ParsePosition(0);
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Number number = parse(string, pos);
556fe1eba10c5d69e115dfab55d82cc22d42e9fbae5Elliott Hughes        if (pos.getIndex() == 0) {
557b272dc3a96c819d5709de9de11e800d87f7a42fcElliott Hughes            throw new ParseException("Unparseable number: \"" + string + "\"", pos.getErrorIndex());
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return number;
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses a {@code Number} from the specified string starting at the index
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified by {@code position}. If the string is successfully parsed then
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the index of the {@code ParsePosition} is updated to the index following
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the parsed text. On error, the index is unchanged and the error index of
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code ParsePosition} is set to the index where the error occurred.
568f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string to parse.
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param position
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            input/output parameter, specifies the start index in
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code string} from where to start parsing. If parsing is
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            successful, it is updated with the index following the parsed
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            text; on error, the index is unchanged and the error index is
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            set to the index where the error occurred.
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code Number} resulting from the parse or {@code null} if
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         there is an error.
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract Number parse(String string, ParsePosition position);
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Object parseObject(String string, ParsePosition position) {
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (position == null) {
585d43b9ef11a1095967a3396b246639b563e1a4128Kenny Root            throw new NullPointerException("position == null");
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return parse(string, position);
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the currency used by this number format when formatting currency
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * values. The min and max fraction digits remain the same.
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This implementation throws {@code UnsupportedOperationException},
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * concrete subclasses should override this method if they support currency
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting.
6019b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param currency
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new currency.
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnsupportedOperationException
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setCurrency(Currency currency) {
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new UnsupportedOperationException();
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets whether this number format formats and parses numbers using a
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * grouping separator.
613f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} if a grouping separator is used; {@code false}
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            otherwise.
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setGroupingUsed(boolean value) {
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        groupingUsed = value;
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the maximum number of fraction digits that are printed when
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting. If the maximum is less than the number of fraction digits,
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the least significant digits are truncated.
626f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the maximum number of fraction digits.
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMaximumFractionDigits(int value) {
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        maximumFractionDigits = value < 0 ? 0 : value;
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (maximumFractionDigits < minimumFractionDigits) {
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            minimumFractionDigits = maximumFractionDigits;
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the new maximum count of integer digits that are printed when
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting. If the maximum is less than the number of integer digits, the
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * most significant digits are truncated.
641f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new maximum number of integer numerals for display.
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMaximumIntegerDigits(int value) {
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        maximumIntegerDigits = value < 0 ? 0 : value;
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (maximumIntegerDigits < minimumIntegerDigits) {
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            minimumIntegerDigits = maximumIntegerDigits;
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the minimum number of fraction digits that are printed when
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting.
655f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the minimum number of fraction digits.
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMinimumFractionDigits(int value) {
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        minimumFractionDigits = value < 0 ? 0 : value;
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (maximumFractionDigits < minimumFractionDigits) {
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            maximumFractionDigits = minimumFractionDigits;
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the minimum number of integer digits that are printed when
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * formatting.
669f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the minimum number of integer digits.
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMinimumIntegerDigits(int value) {
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        minimumIntegerDigits = value < 0 ? 0 : value;
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (maximumIntegerDigits < minimumIntegerDigits) {
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            maximumIntegerDigits = minimumIntegerDigits;
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Specifies if this number format should parse numbers only as integers or
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * else as any kind of number. If this method is called with a {@code true}
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value then subsequent parsing attempts will stop if a decimal separator
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is encountered.
685f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} to only parse integers, {@code false} to parse
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            integers as well as fractions.
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setParseIntegerOnly(boolean value) {
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        parseIntegerOnly = value;
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final ObjectStreamField[] serialPersistentFields = {
695e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("groupingUsed", boolean.class),
696e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("maxFractionDigits", byte.class),
697e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("maximumFractionDigits", int.class),
698e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("maximumIntegerDigits", int.class),
699e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("maxIntegerDigits", byte.class),
700e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("minFractionDigits", byte.class),
701e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("minimumFractionDigits", int.class),
702e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("minimumIntegerDigits", int.class),
703e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("minIntegerDigits", byte.class),
704e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("parseIntegerOnly", boolean.class),
705e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        new ObjectStreamField("serialVersionOnStream", int.class),
70628eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes    };
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void writeObject(ObjectOutputStream stream) throws IOException {
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectOutputStream.PutField fields = stream.putFields();
71003c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("groupingUsed", groupingUsed);
71103c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("maxFractionDigits",
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        maximumFractionDigits < Byte.MAX_VALUE ? (byte) maximumFractionDigits
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                : Byte.MAX_VALUE);
71403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("maximumFractionDigits", maximumFractionDigits);
71503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("maximumIntegerDigits", maximumIntegerDigits);
71603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("maxIntegerDigits",
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        maximumIntegerDigits < Byte.MAX_VALUE ? (byte) maximumIntegerDigits
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                : Byte.MAX_VALUE);
71903c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("minFractionDigits",
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        minimumFractionDigits < Byte.MAX_VALUE ? (byte) minimumFractionDigits
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                : Byte.MAX_VALUE);
722f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        fields.put("minimumFractionDigits", minimumFractionDigits);
72303c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("minimumIntegerDigits", minimumIntegerDigits);
72403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("minIntegerDigits",
72503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes                minimumIntegerDigits < Byte.MAX_VALUE ? (byte) minimumIntegerDigits : Byte.MAX_VALUE);
72603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("parseIntegerOnly", parseIntegerOnly);
72703c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        fields.put("serialVersionOnStream", 1);
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        stream.writeFields();
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void readObject(ObjectInputStream stream) throws IOException,
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ClassNotFoundException {
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectInputStream.GetField fields = stream.readFields();
73403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        groupingUsed = fields.get("groupingUsed", true);
73503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        parseIntegerOnly = fields.get("parseIntegerOnly", false);
73603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        if (fields.get("serialVersionOnStream", 0) == 0) {
73703c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            maximumFractionDigits = fields.get("maxFractionDigits", (byte) 3);
73803c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            maximumIntegerDigits = fields.get("maxIntegerDigits", (byte) 40);
73903c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            minimumFractionDigits = fields.get("minFractionDigits", (byte) 0);
74003c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            minimumIntegerDigits = fields.get("minIntegerDigits", (byte) 1);
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
74203c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            maximumFractionDigits = fields.get("maximumFractionDigits", 3);
74303c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            maximumIntegerDigits = fields.get("maximumIntegerDigits", 40);
74403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            minimumFractionDigits = fields.get("minimumFractionDigits", 0);
74503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            minimumIntegerDigits = fields.get("minimumIntegerDigits", 1);
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (minimumIntegerDigits > maximumIntegerDigits
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                || minimumFractionDigits > maximumFractionDigits) {
74903c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            throw new InvalidObjectException("min digits greater than max digits");
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (minimumIntegerDigits < 0 || maximumIntegerDigits < 0
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                || minimumFractionDigits < 0 || maximumFractionDigits < 0) {
75303c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes            throw new InvalidObjectException("min or max digits negative");
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The instances of this inner class are used as attribute keys and values
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in {@code AttributedCharacterIterator} that the
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link NumberFormat#formatToCharacterIterator(Object)} method returns.
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class Field extends Format.Field {
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static final long serialVersionUID = 7494728892700160890L;
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the number sign.
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
76903c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field SIGN = new Field("sign");
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the integer part of the number.
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
77403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field INTEGER = new Field("integer");
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the fraction part of the number.
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
77903c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field FRACTION = new Field("fraction");
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the exponent part of the number.
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
78403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field EXPONENT = new Field("exponent");
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the exponent sign symbol.
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
78903c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field EXPONENT_SIGN = new Field("exponent sign");
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the exponent symbol.
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
79403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field EXPONENT_SYMBOL = new Field("exponent symbol");
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the decimal separator.
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
79903c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field DECIMAL_SEPARATOR = new Field("decimal separator");
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the grouping separator.
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
80403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field GROUPING_SEPARATOR = new Field("grouping separator");
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the percent symbol.
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
80903c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field PERCENT = new Field("percent");
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the permille symbol.
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
81403c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field PERMILLE = new Field("per mille");
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This constant stands for the currency symbol.
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
81903c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Field CURRENCY = new Field("currency");
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Constructs a new instance of {@code NumberFormat.Field} with the
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * given field name.
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected Field(String fieldName) {
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super(fieldName);
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
83042db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    /**
83142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * Returns the {@code RoundingMode} used by this {@code NumberFormat}. The default
83242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * implementation in {@code NumberFormat} throws {@code UnsupportedOperationException}.
83342db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * Subclasses for which a rounding mode is meaningful are expected to override this method.
83442db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * @since 1.6
83542db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     */
83642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    public RoundingMode getRoundingMode() {
83742db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        throw new UnsupportedOperationException();
83842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    }
83942db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes
84042db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    /**
84142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * Sets the {@code RoundingMode} used by this {@code NumberFormat}. The default
84242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * implementation in {@code NumberFormat} throws {@code UnsupportedOperationException}.
84342db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * Subclasses for which a rounding mode is meaningful are expected to override this method.
84442db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * @since 1.6
84542db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     */
84642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    public void setRoundingMode(RoundingMode roundingMode) {
84742db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        throw new UnsupportedOperationException();
84842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    }
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
850