DecimalFormat.java revision f2d5062b67e57ef00ee81fec67480f0d58d66b50
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
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
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
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 Project// BEGIN android-note
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// The icu implementation used was changed from icu4j to icu4jni.
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// END android-note
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.text;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectInputStream;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectStreamField;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigDecimal;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigInteger;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.AccessController;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.PrivilegedAction;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Currency;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Locale;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
3533aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughesimport com.ibm.icu4jni.util.LocaleData;
3633aa6eb602478e7f51ac16f30c88db3566022886Elliott Hughes
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A concrete subclass of {@link NumberFormat} that formats decimal numbers. It
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * has a variety of features designed to make it possible to parse and format
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * numbers in any locale, including support for Western, Arabic, or Indic
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * digits. It also supports different flavors of numbers, including integers
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ("123"), fixed-point numbers ("123.4"), scientific notation ("1.23E4"),
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * percentages ("12%"), and currency amounts ("$123"). All of these flavors can
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be easily localized.
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>This is an enhanced version of {@code DecimalFormat} that is based on
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the standard version in the RI. New or changed functionality is labeled
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong><font color="red">NEW</font></strong>.</strong>
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * To obtain a {@link NumberFormat} for a specific locale (including the default
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * locale), call one of {@code NumberFormat}'s factory methods such as
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code NumberFormat.getInstance}. Do not call the {@code DecimalFormat}
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * constructors directly, unless you know what you are doing, since the
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link NumberFormat} factory methods may return subclasses other than
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat}. If you need to customize the format object, do
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * something like this: <blockquote>
579b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * NumberFormat f = NumberFormat.getInstance(loc);
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if (f instanceof DecimalFormat) {
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     ((DecimalFormat)f).setDecimalSeparatorAlwaysShown(true);
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * }
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
649b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h5>Example:</h5>
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
689b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // Print out a number using the localized number, currency,
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // and percent format for each locale
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Locale[] locales = NumberFormat.getAvailableLocales();
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * double myNumber = -1234.56;
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * NumberFormat format;
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for (int j = 0; j &lt; 3; ++j) {
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     System.out.println(&quot;FORMAT&quot;);
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     for (int i = 0; i &lt; locales.length; ++i) {
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         if (locales[i].getCountry().length() == 0) {
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *             // Skip language-only locales
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *             continue;
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         }
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         System.out.print(locales[i].getDisplayName());
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         switch (j) {
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *             case 0:
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *                 format = NumberFormat.getInstance(locales[i]);
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *                 break;
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *             case 1:
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *                 format = NumberFormat.getCurrencyInstance(locales[i]);
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *                 break;
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *             default:
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *                 format = NumberFormat.getPercentInstance(locales[i]);
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *                 break;
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         }
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         try {
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *             // Assume format is a DecimalFormat
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *             System.out.print(&quot;: &quot;; + ((DecimalFormat)format).toPattern() + &quot; -&gt; &quot;
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *                     + form.format(myNumber));
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         } catch (Exception e) {
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         }
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         try {
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *             System.out.println(&quot; -&gt; &quot; + format.parse(form.format(myNumber)));
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         } catch (ParseException e) {
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         }
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     }
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * }
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
1079b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Patterns</h4>
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A {@code DecimalFormat} consists of a <em>pattern</em> and a set of
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>symbols</em>. The pattern may be set directly using
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link #applyPattern(String)}, or indirectly using other API methods which
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * manipulate aspects of the pattern, such as the minimum number of integer
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * digits. The symbols are stored in a {@link DecimalFormatSymbols} object. When
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * using the {@link NumberFormat} factory methods, the pattern and symbols are
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read from ICU's locale data.
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Special Pattern Characters</h4>
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Many characters in a pattern are taken literally; they are matched during
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parsing and are written out unchanged during formatting. On the other hand,
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * special characters stand for other characters, strings, or classes of
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * characters. For example, the '#' character is replaced by a localized digit.
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Often the replacement character is the same as the pattern character; in the
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * U.S. locale, the ',' grouping character is replaced by ','. However, the
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * replacement is still happening, and if the symbols are modified, the grouping
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * character changes. Some special characters affect the behavior of the
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * formatter by their presence; for example, if the percent character is seen,
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then the value is multiplied by 100 before being displayed.
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * To insert a special character in a pattern as a literal, that is, without any
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * special meaning, the character must be quoted. There are some exceptions to
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this which are noted below.
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The characters listed here are used in non-localized patterns. Localized
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * patterns use the corresponding characters taken from this formatter's
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link DecimalFormatSymbols} object instead, and these characters lose their
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * special status. Two exceptions are the currency sign and quote, which are not
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * localized.
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> <table border="0" cellspacing="3" cellpadding="0" summary="Chart
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * showing symbol, location, localized, and meaning.">
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr bgcolor="#ccccff">
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Symbol</th>
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Location</th>
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Localized?</th>
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Meaning</th>
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code 0}</td>
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Number</td>
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Digit.</td>
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code @}</td>
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Number</td>
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>No</td>
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td><strong><font color="red">NEW</font>&nbsp;</strong> Significant
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * digit.</td>
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code #}</td>
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Number</td>
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Digit, leading zeroes are not shown.</td>
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code .}</td>
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Number</td>
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Decimal separator or monetary decimal separator.</td>
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code -}</td>
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Number</td>
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Minus sign.</td>
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code ,}</td>
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Number</td>
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Grouping separator.</td>
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code E}</td>
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Number</td>
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Separates mantissa and exponent in scientific notation.
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>Does not need to be quoted in prefix or suffix.</em></td>
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code +}</td>
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Exponent</td>
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td><strong><font color="red">NEW</font>&nbsp;</strong> Prefix
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * positive exponents with localized plus sign.
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>Does not need to be quoted in prefix or suffix.</em></td>
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code ;}</td>
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Subpattern boundary</td>
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Separates positive and negative subpatterns.</td>
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code %}</td>
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Prefix or suffix</td>
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Multiply by 100 and show as percentage.</td>
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code \u2030} ({@code &#92;u2030})</td>
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Prefix or suffix</td>
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Multiply by 1000 and show as per mille.</td>
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code &#164;} ({@code &#92;u00A4})</td>
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Prefix or suffix</td>
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>No</td>
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Currency sign, replaced by currency symbol. If doubled, replaced by
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * international currency symbol. If present in a pattern, the monetary decimal
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * separator is used instead of the decimal separator.</td>
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code '}</td>
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Prefix or suffix</td>
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>No</td>
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Used to quote special characters in a prefix or suffix, for example,
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "'#'#"} formats 123 to {@code "#123"}. To create a single quote
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * itself, use two in a row: {@code "# o''clock"}.</td>
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code *}</td>
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Prefix or suffix boundary</td>
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td><strong><font color="red">NEW</font>&nbsp;</strong> Pad escape,
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * precedes pad character. </td>
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </table> </blockquote>
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A {@code DecimalFormat} pattern contains a postive and negative subpattern,
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for example, "#,##0.00;(#,##0.00)". Each subpattern has a prefix, a numeric
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * part and a suffix. If there is no explicit negative subpattern, the negative
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * subpattern is the localized minus sign prefixed to the positive subpattern.
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * That is, "0.00" alone is equivalent to "0.00;-0.00". If there is an explicit
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * negative subpattern, it serves only to specify the negative prefix and
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * suffix; the number of digits, minimal digits, and other characteristics are
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ignored in the negative subpattern. This means that "#,##0.0#;(#)" produces
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * precisely the same result as "#,##0.0#;(#,##0.0#)".
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The prefixes, suffixes, and various symbols used for infinity, digits,
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thousands separators, decimal separators, etc. may be set to arbitrary
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * values, and they will appear properly during formatting. However, care must
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be taken that the symbols and strings do not conflict, or parsing will be
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * unreliable. For example, either the positive and negative prefixes or the
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * suffixes must be distinct for {@link #parse} to be able to distinguish
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * positive from negative values. Another example is that the decimal separator
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and thousands separator should be distinct characters, or parsing will be
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * impossible.
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The <em>grouping separator</em> is a character that separates clusters of
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * integer digits to make large numbers more legible. It is commonly used for
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thousands, but in some locales it separates ten-thousands. The <em>grouping
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * size</em>
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is the number of digits between the grouping separators, such as 3 for
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "100,000,000" or 4 for "1 0000 0000". There are actually two different
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * grouping sizes: One used for the least significant integer digits, the
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>primary grouping size</em>, and one used for all others, the
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>secondary grouping size</em>. In most locales these are the same, but
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sometimes they are different. For example, if the primary grouping interval
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is 3, and the secondary is 2, then this corresponds to the pattern
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "#,##,##0", and the number 123456789 is formatted as "12,34,56,789". If a
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * pattern contains multiple grouping separators, the interval between the last
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * one and the end of the integer defines the primary grouping size, and the
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * interval between the last two defines the secondary grouping size. All others
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * are ignored, so "#,##,###,####", "###,###,####" and "##,#,###,####" produce
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the same result.
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Illegal patterns, such as "#.#.#" or "#.###,###", will cause
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat} to throw an {@link IllegalArgumentException} with a
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * message that describes the problem.
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Pattern BNF</h4>
2859b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * pattern    := subpattern (';' subpattern)?
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * subpattern := prefix? number exponent? suffix?
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * number     := (integer ('.' fraction)?) | sigDigits
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * prefix     := '\\u0000'..'\\uFFFD' - specialCharacters
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * suffix     := '\\u0000'..'\\uFFFD' - specialCharacters
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * integer    := '#'* '0'* '0'
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fraction   := '0'* '#'*
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sigDigits  := '#'* '@' '@'* '#'*
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * exponent   := 'E' '+'? '0'* '0'
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * padSpec    := '*' padChar
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * padChar    := '\\u0000'..'\\uFFFD' - quote
2989b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Notation:
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   X*       0 or more instances of X
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   X?       0 or 1 instances of X
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   X|Y      either X or Y
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   C..D     any character from C up to D, inclusive
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   S-T      characters in S, except those in T
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
3069b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The first subpattern is for positive numbers. The second (optional)
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * subpattern is for negative numbers.
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Not indicated in the BNF syntax above:
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The grouping separator ',' can occur inside the integer and sigDigits
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * elements, between any two pattern characters of that element, as long as the
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * integer or sigDigits element is not followed by the exponent element.
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li><font color="red"><strong>NEW</strong>&nbsp;</font> Two
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * grouping intervals are recognized: The one between the decimal point and the
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * first grouping symbol and the one between the first and second grouping
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * symbols. These intervals are identical in most locales, but in some locales
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * they differ. For example, the pattern &quot;#,##,###&quot; formats the number
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 123456789 as &quot;12,34,56,789&quot;.</li>
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> <strong><font color="red">NEW</font>&nbsp;</strong> The pad
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specifier {@code padSpec} may appear before the prefix, after the prefix,
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * before the suffix, after the suffix or not at all.
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Parsing</h4>
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat} parses all Unicode characters that represent decimal
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * digits, as defined by {@link Character#digit(int, int)}. In addition,
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat} also recognizes as digits the ten consecutive
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * characters starting with the localized zero digit defined in the
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link DecimalFormatSymbols} object. During formatting, the
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link DecimalFormatSymbols}-based digits are written out.
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * During parsing, grouping separators are ignored.
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If {@link #parse(String, ParsePosition)} fails to parse a string, it returns
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code null} and leaves the parse position unchanged.
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Formatting</h4>
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Formatting is guided by several parameters, all of which can be specified
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * either using a pattern or using the API. The following description applies to
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * formats that do not use <a href="#sci">scientific notation</a> or <a
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * href="#sigdig">significant digits</a>.
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If the number of actual integer digits exceeds the
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>maximum integer digits</em>, then only the least significant digits
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * are shown. For example, 1997 is formatted as "97" if maximum integer digits
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is set to 2.
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If the number of actual integer digits is less than the
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>minimum integer digits</em>, then leading zeros are added. For
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example, 1997 is formatted as "01997" if minimum integer digits is set to 5.
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If the number of actual fraction digits exceeds the <em>maximum
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fraction digits</em>,
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then half-even rounding is performed to the maximum fraction digits. For
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example, 0.125 is formatted as "0.12" if the maximum fraction digits is 2.
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If the number of actual fraction digits is less than the
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>minimum fraction digits</em>, then trailing zeros are added. For
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example, 0.125 is formatted as "0.1250" if the mimimum fraction digits is set
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to 4.
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Trailing fractional zeros are not displayed if they occur <em>j</em>
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * positions after the decimal, where <em>j</em> is less than the maximum
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fraction digits. For example, 0.10004 is formatted as "0.1" if the maximum
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fraction digits is four or less.
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>Special Values</strong>
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code NaN} is represented as a single character, typically
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code &#92;uFFFD}. This character is determined by the
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link DecimalFormatSymbols} object. This is the only value for which the
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * prefixes and suffixes are not used.
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Infinity is represented as a single character, typically {@code &#92;u221E},
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with the positive or negative prefixes and suffixes applied. The infinity
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * character is determined by the {@link DecimalFormatSymbols} object. <a
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * name="sci">
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Scientific Notation</h4>
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </a>
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Numbers in scientific notation are expressed as the product of a mantissa and
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a power of ten, for example, 1234 can be expressed as 1.234 x 10<sup>3</sup>.
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The mantissa is typically in the half-open interval [1.0, 10.0) or sometimes
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * [0.0, 1.0), but it does not need to be. {@code DecimalFormat} supports
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * arbitrary mantissas. {@code DecimalFormat} can be instructed to use
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * scientific notation through the API or through the pattern. In a pattern, the
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * exponent character immediately followed by one or more digit characters
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * indicates scientific notation. Example: "0.###E0" formats the number 1234 as
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "1.234E3".
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The number of digit characters after the exponent character gives the
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * minimum exponent digit count. There is no maximum. Negative exponents are
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * formatted using the localized minus sign, <em>not</em> the prefix and
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * suffix from the pattern. This allows patterns such as "0.###E0 m/s". To
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * prefix positive exponents with a localized plus sign, specify '+' between the
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * exponent and the digits: "0.###E+0" will produce formats "1E+1", "1E+0",
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "1E-1", etc. (In localized patterns, use the localized plus sign rather than
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * '+'.)
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The minimum number of integer digits is achieved by adjusting the
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * exponent. Example: 0.00123 formatted with "00.###E0" yields "12.3E-4". This
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * only happens if there is no maximum number of integer digits. If there is a
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * maximum, then the minimum number of integer digits is fixed at one.
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The maximum number of integer digits, if present, specifies the exponent
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * grouping. The most common use of this is to generate <em>engineering
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * notation</em>,
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in which the exponent is a multiple of three, e.g., "##0.###E0". The number
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 12345 is formatted using "##0.###E0" as "12.345E3".
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>When using scientific notation, the formatter controls the digit counts
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * using significant digits logic. The maximum number of significant digits
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limits the total number of integer and fraction digits that will be shown in
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the mantissa; it does not affect parsing. For example, 12345 formatted with
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "##0.##E0" is "12.3E3". See the section on significant digits for more
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * details.
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The number of significant digits shown is determined as follows: If no
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * significant digits are used in the pattern then the minimum number of
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * significant digits shown is one, the maximum number of significant digits
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * shown is the sum of the <em>minimum integer</em> and
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>maximum fraction</em> digits, and it is unaffected by the maximum
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * integer digits. If this sum is zero, then all significant digits are shown.
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If significant digits are used in the pattern then the number of integer
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * digits is fixed at one and there is no exponent grouping.
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Exponential patterns may not contain grouping separators.
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <a name="sigdig">
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4> <strong><font color="red">NEW</font>&nbsp;</strong> Significant
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Digits</h4>
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </a> {@code DecimalFormat} has two ways of controlling how many digits are
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * shown: (a) significant digit counts or (b) integer and fraction digit counts.
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Integer and fraction digit counts are described above. When a formatter uses
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * significant digits counts, the number of integer and fraction digits is not
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified directly, and the formatter settings for these counts are ignored.
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Instead, the formatter uses as many integer and fraction digits as required
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to display the specified number of significant digits.
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h5>Examples:</h5>
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> <table border=0 cellspacing=3 cellpadding=0>
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr bgcolor="#ccccff">
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Pattern</th>
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Minimum significant digits</th>
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Maximum significant digits</th>
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Number</th>
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Output of format()</th>
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code @@@}
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>3</td>
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>3</td>
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>12345</td>
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code 12300}</td>
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code @@@}</td>
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>3</td>
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>3</td>
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>0.12345</td>
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code 0.123}</td>
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code @@##}</td>
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>2</td>
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>4</td>
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>3.14159</td>
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code 3.142}</td>
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code @@##}</td>
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>2</td>
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>4</td>
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>1.23004</td>
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code 1.23}</td>
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </table> </blockquote>
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Significant digit counts may be expressed using patterns that specify a
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * minimum and maximum number of significant digits. These are indicated by the
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code '@'} and {@code '#'} characters. The minimum number of significant
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * digits is the number of {@code '@'} characters. The maximum number of
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * significant digits is the number of {@code '@'} characters plus the number of
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code '#'} characters following on the right. For example, the pattern
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "@@@"} indicates exactly 3 significant digits. The pattern
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "@##"} indicates from 1 to 3 significant digits. Trailing zero digits
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to the right of the decimal separator are suppressed after the minimum number
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of significant digits have been shown. For example, the pattern {@code "@##"}
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * formats the number 0.1203 as {@code "0.12"}.
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If a pattern uses significant digits, it may not contain a decimal
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * separator, nor the {@code '0'} pattern character. Patterns such as
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "@00"} or {@code "@.###"} are disallowed.
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Any number of {@code '#'} characters may be prepended to the left of the
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * leftmost {@code '@'} character. These have no effect on the minimum and
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * maximum significant digit counts, but may be used to position grouping
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * separators. For example, {@code "#,#@#"} indicates a minimum of one
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * significant digit, a maximum of two significant digits, and a grouping size
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of three.
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>In order to enable significant digits formatting, use a pattern
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * containing the {@code '@'} pattern character.
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>In order to disable significant digits formatting, use a pattern that
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * does not contain the {@code '@'} pattern character.
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The number of significant digits has no effect on parsing.
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Significant digits may be used together with exponential notation. Such
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * patterns are equivalent to a normal exponential pattern with a minimum and
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * maximum integer digit count of one, a minimum fraction digit count of the
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * number of '@' characters in the pattern - 1, and a maximum fraction digit
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * count of the number of '@' and '#' characters in the pattern - 1. For
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example, the pattern {@code "@@###E0"} is equivalent to {@code "0.0###E0"}.
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If signficant digits are in use then the integer and fraction digit
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * counts, as set via the API, are ignored.
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4> <strong><font color="red">NEW</font>&nbsp;</strong> Padding</h4>
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat} supports padding the result of {@code format} to a
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specific width. Padding may be specified either through the API or through
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the pattern syntax. In a pattern, the pad escape character followed by a
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * single pad character causes padding to be parsed and formatted. The pad
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * escape character is '*' in unlocalized patterns. For example,
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "$*x#,##0.00"} formats 123 to {@code "$xx123.00"}, and 1234 to
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "$1,234.00"}.
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>When padding is in effect, the width of the positive subpattern,
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * including prefix and suffix, determines the format width. For example, in the
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * pattern {@code "* #0 o''clock"}, the format width is 10.</li>
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The width is counted in 16-bit code units (Java {@code char}s).</li>
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Some parameters which usually do not matter have meaning when padding is
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used, because the pattern width is significant with padding. In the pattern "*
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ##,##,#,##0.##", the format width is 14. The initial characters "##,##," do
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not affect the grouping size or maximum integer digits, but they do affect
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the format width.</li>
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Padding may be inserted at one of four locations: before the prefix,
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * after the prefix, before the suffix or after the suffix. If padding is
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified in any other location, {@link #applyPattern} throws an {@link
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * IllegalArgumentException}. If there is no prefix, before the prefix and after
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the prefix are equivalent, likewise for the suffix.</li>
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>When specified in a pattern, the 16-bit {@code char} immediately
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * following the pad escape is the pad character. This may be any character,
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * including a special pattern character. That is, the pad escape
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>escapes</em> the following character. If there is no character after
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the pad escape, then the pattern is illegal.</li>
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Synchronization</h4>
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat} objects are not synchronized. Multiple threads should
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not access one formatter concurrently.
5419b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Format
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see NumberFormat
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class DecimalFormat extends NumberFormat {
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = 864413376551465018L;
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private transient boolean parseBigDecimal = false;
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private transient DecimalFormatSymbols symbols;
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private transient com.ibm.icu4jni.text.DecimalFormat dform;
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DecimalFormat} for formatting and parsing numbers
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * for the default locale.
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DecimalFormat() {
560f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // BEGIN android-changed: reduce duplication.
5619b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        Locale locale = Locale.getDefault();
562f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        this.symbols = new DecimalFormatSymbols(locale);
563f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        LocaleData localeData = com.ibm.icu4jni.util.Resources.getLocaleData(locale);
564f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        initNative(localeData.numberPattern, locale);
5659b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        // END android-changed
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DecimalFormat} using the specified non-localized
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * pattern and the {@code DecimalFormatSymbols} for the default Locale.
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pattern
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the non-localized pattern.
5749b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
5759b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the pattern cannot be parsed.
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DecimalFormat(String pattern) {
578f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // BEGIN android-changed: reduce duplication.
579f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        this(pattern, Locale.getDefault());
58064e410fa8b4771a8749f899134b4e08c2fd49e3cElliott Hughes        // END android-changed
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DecimalFormat} using the specified non-localized
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * pattern and {@code DecimalFormatSymbols}.
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pattern
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the non-localized pattern.
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the DecimalFormatSymbols.
5919b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
5929b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the pattern cannot be parsed.
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DecimalFormat(String pattern, DecimalFormatSymbols value) {
595f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // BEGIN android-changed: reduce duplication.
596f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        this.symbols = (DecimalFormatSymbols) value.clone();
597f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        initNative(pattern, symbols.getLocale());
59864e410fa8b4771a8749f899134b4e08c2fd49e3cElliott Hughes        // END android-changed
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
601a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes    // BEGIN android-added: used by NumberFormat.getInstance because cloning DecimalFormatSymbols is slow.
602a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes    DecimalFormat(String pattern, Locale locale) {
603a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        this.symbols = new DecimalFormatSymbols(locale);
604f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        initNative(pattern, locale);
605f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    }
606f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    // END android-added
607a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes
608f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    // BEGIN android-changed: reduce duplication.
609f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private void initNative(String pattern, Locale locale) {
610f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        try {
611f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            this.dform = new com.ibm.icu4jni.text.DecimalFormat(pattern, locale, symbols);
612f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        } catch (IllegalArgumentException ex) {
613f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            throw new IllegalArgumentException(pattern);
614f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        }
615a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        super.setMaximumFractionDigits(dform.getMaximumFractionDigits());
616a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        super.setMaximumIntegerDigits(dform.getMaximumIntegerDigits());
617a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        super.setMinimumFractionDigits(dform.getMinimumFractionDigits());
618a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        super.setMinimumIntegerDigits(dform.getMinimumIntegerDigits());
619a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes    }
620a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes    // END android-added
621a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Changes the pattern of this decimal format to the specified pattern which
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * uses localized pattern characters.
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pattern
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the localized pattern.
6289b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
6299b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the pattern cannot be parsed.
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void applyLocalizedPattern(String pattern) {
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.applyLocalizedPattern(pattern);
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Changes the pattern of this decimal format to the specified pattern which
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * uses non-localized pattern characters.
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pattern
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the non-localized pattern.
6419b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
6429b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the pattern cannot be parsed.
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void applyPattern(String pattern) {
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.applyPattern(pattern);
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code DecimalFormat} with the same pattern and
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * properties as this decimal format.
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a shallow copy of this decimal format.
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.Cloneable
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DecimalFormat clone = (DecimalFormat) super.clone();
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        clone.dform = (com.ibm.icu4jni.text.DecimalFormat) dform.clone();
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        clone.symbols = (DecimalFormatSymbols) symbols.clone();
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return clone;
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the specified object to this decimal format and indicates if
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * they are equal. In order to be equal, {@code object} must be an instance
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of {@code DecimalFormat} with the same pattern and properties.
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare with this object.
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this decimal
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         format; {@code false} otherwise.
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #hashCode
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object object) {
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this == object) {
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(object instanceof DecimalFormat)) {
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
682f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        DecimalFormat other = (DecimalFormat) object;
683f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        return (this.dform == null ? other.dform == null : this.dform.equals(other.dform)) &&
684f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                getDecimalFormatSymbols().equals(other.getDecimalFormatSymbols());
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified object using the rules of this decimal format and
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returns an {@code AttributedCharacterIterator} with the formatted number
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and attributes.
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to format.
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an AttributedCharacterIterator with the formatted number and
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         attributes.
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code object} cannot be formatted by this format.
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code object} is {@code null}.
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public AttributedCharacterIterator formatToCharacterIterator(Object object) {
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (object == null) {
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.formatToCharacterIterator(object);
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified double value as a string using the pattern of this
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * decimal format and appends the string to the specified string buffer.
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the {@code field} member of {@code position} contains a value
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specifying a format field, then its {@code beginIndex} and
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code endIndex} members will be updated with the position of the first
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * occurrence of this field in the formatted text.
7179b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the double to format.
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target string buffer to append the formatted double value
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            to.
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param position
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            on input: an optional alignment field; on output: the offsets
725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            of the alignment field in the formatted text.
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string buffer.
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public StringBuffer format(double value, StringBuffer buffer,
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            FieldPosition position) {
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.format(value, buffer, position);
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified long value as a string using the pattern of this
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * decimal format and appends the string to the specified string buffer.
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the {@code field} member of {@code position} contains a value
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specifying a format field, then its {@code beginIndex} and
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code endIndex} members will be updated with the position of the first
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * occurrence of this field in the formatted text.
7429b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to format.
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target string buffer to append the formatted long value
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            to.
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param position
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            on input: an optional alignment field; on output: the offsets
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            of the alignment field in the formatted text.
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string buffer.
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public StringBuffer format(long value, StringBuffer buffer,
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            FieldPosition position) {
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.format(value, buffer, position);
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified object as a string using the pattern of this
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * decimal format and appends the string to the specified string buffer.
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the {@code field} member of {@code position} contains a value
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specifying a format field, then its {@code beginIndex} and
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code endIndex} members will be updated with the position of the first
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * occurrence of this field in the formatted text.
7679b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param number
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to format.
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param toAppendTo
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target string buffer to append the formatted number to.
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pos
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            on input: an optional alignment field; on output: the offsets
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            of the alignment field in the formatted text.
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string buffer.
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code number} is not an instance of {@code Number}.
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code toAppendTo} or {@code pos} is {@code null}.
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final StringBuffer format(Object number, StringBuffer toAppendTo,
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            FieldPosition pos) {
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(number instanceof Number)) {
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (toAppendTo == null || pos == null) {
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (number instanceof BigInteger || number instanceof BigDecimal) {
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return dform.format(number, toAppendTo, pos);
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return super.format(number, toAppendTo, pos);
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code DecimalFormatSymbols} used by this decimal format.
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a copy of the {@code DecimalFormatSymbols} used by this decimal
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         format.
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DecimalFormatSymbols getDecimalFormatSymbols() {
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (DecimalFormatSymbols) symbols.clone();
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the currency used by this decimal format.
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the currency used by this decimal format.
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see DecimalFormatSymbols#getCurrency()
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Currency getCurrency() {
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final Currency cur = dform.getCurrency();
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final String code = (cur == null) ? "XXX" : cur.getCurrencyCode(); //$NON-NLS-1$
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Currency.getInstance(code);
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the number of digits grouped together by the grouping separator.
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This only allows to get the primary grouping size. There is no API to get
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the secondary grouping size.
8249b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of digits grouped together.
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getGroupingSize() {
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getGroupingSize();
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the multiplier which is applied to the number before formatting
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or after parsing.
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the multiplier.
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMultiplier() {
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getMultiplier();
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the prefix which is formatted or parsed before a negative number.
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the negative prefix.
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getNegativePrefix() {
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getNegativePrefix();
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the suffix which is formatted or parsed after a negative number.
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the negative suffix.
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getNegativeSuffix() {
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getNegativeSuffix();
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the prefix which is formatted or parsed before a positive number.
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the positive prefix.
863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getPositivePrefix() {
865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getPositivePrefix();
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the suffix which is formatted or parsed after a positive number.
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the positive suffix.
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getPositiveSuffix() {
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getPositiveSuffix();
875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.hashCode();
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the decimal separator is shown when there are no
884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * fractional digits.
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the decimal separator should always be formatted;
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} otherwise.
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isDecimalSeparatorAlwaysShown() {
890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.isDecimalSeparatorAlwaysShown();
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This value indicates whether the return object of the parse operation is
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of type {@code BigDecimal}. This value defaults to {@code false}.
896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if parse always returns {@code BigDecimals},
898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} if the type of the result is {@code Long} or
899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Double}.
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isParseBigDecimal() {
902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this.parseBigDecimal;
903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the flag that indicates whether numbers will be parsed as integers.
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * When this decimal format is used for parsing and this value is set to
908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code true}, then the resulting numbers will be of type
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code java.lang.Integer}. Special cases are NaN, positive and negative
910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * infinity, which are still returned as {@code java.lang.Double}.
911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
9129b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} that the resulting numbers of parse operations
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            will be of type {@code java.lang.Integer} except for the
916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            special cases described above.
917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setParseIntegerOnly(boolean value) {
9209b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        // In this implementation, com.ibm.icu.text.DecimalFormat is wrapped to
9219b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        // fulfill most of the format and parse feature. And this method is
9229b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        // delegated to the wrapped instance of com.ibm.icu.text.DecimalFormat.
9239b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson
924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setParseIntegerOnly(value);
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether parsing with this decimal format will only
929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * return numbers of type {@code java.lang.Integer}.
930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this {@code DecimalFormat}'s parse method only
932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         returns {@code java.lang.Integer}; {@code false} otherwise.
933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isParseIntegerOnly() {
936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.isParseIntegerOnly();
937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final Double NEGATIVE_ZERO_DOUBLE = new Double(-0.0);
940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses a {@code Long} or {@code Double} from the specified string
943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * starting at the index specified by {@code position}. If the string is
944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * successfully parsed then the index of the {@code ParsePosition} is
945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * updated to the index following the parsed text. On error, the index is
946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * unchanged and the error index of {@code ParsePosition} is set to the
947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * index where the error occurred.
948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string to parse.
951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param position
952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            input/output parameter, specifies the start index in
953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code string} from where to start parsing. If parsing is
954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            successful, it is updated with the index following the parsed
955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            text; on error, the index is unchanged and the error index is
956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            set to the index where the error occurred.
957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Long} or {@code Double} resulting from the parse or
958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code null} if there is an error. The result will be a
959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Long} if the parsed number is an integer in the range of a
960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         long, otherwise the result is a {@code Double}. If
961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code isParseBigDecimal} is {@code true} then it returns the
962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         result as a {@code BigDecimal}.
963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Number parse(String string, ParsePosition position) {
966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Number number = dform.parse(string, position);
967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (null == number) {
968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
969adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-removed
971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // if (this.isParseBigDecimal()) {
972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     if (number instanceof Long) {
973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //         return new BigDecimal(number.longValue());
974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     }
975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     if ((number instanceof Double) && !((Double) number).isInfinite()
976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //             && !((Double) number).isNaN()) {
977adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //
978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //         return new BigDecimal(number.doubleValue());
979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     }
980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     if (number instanceof BigInteger) {
981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //         return new BigDecimal(number.doubleValue());
982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     }
983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     if (number instanceof com.ibm.icu.math.BigDecimal) {
984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //         return new BigDecimal(number.toString());
985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     }
986adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     return number;
987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // }
988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // if ((number instanceof com.ibm.icu.math.BigDecimal)
989adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //         || (number instanceof BigInteger)) {
990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     return new Double(number.doubleValue());
991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // }
992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-removed
993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-added
994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this.isParseBigDecimal()) {
995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (number instanceof Long) {
996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return new BigDecimal(number.longValue());
997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((number instanceof Double) && !((Double) number).isInfinite()
999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    && !((Double) number).isNaN()) {
1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return new BigDecimal(number.toString());
1002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (number instanceof BigInteger) {
1004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return new BigDecimal(number.toString());
1005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return number;
1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((number instanceof BigDecimal) || (number instanceof BigInteger)) {
1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new Double(number.doubleValue());
1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-added
1012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this.isParseIntegerOnly() && number.equals(NEGATIVE_ZERO_DOUBLE)) {
1014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new Long(0);
1015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return number;
1017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1018adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the {@code DecimalFormatSymbols} used by this decimal format.
1022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1023adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code DecimalFormatSymbols} to set.
1025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDecimalFormatSymbols(DecimalFormatSymbols value) {
1027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (value != null) {
1028f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            // BEGIN android-changed: the Java object is canonical, and we copy down to native code.
1029f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            this.symbols = (DecimalFormatSymbols) value.clone();
1030f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            dform.setDecimalFormatSymbols(this.symbols);
1031f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            // END android-changed
1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the currency used by this decimal format. The min and max fraction
1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * digits remain the same.
1038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param currency
1040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the currency this {@code DecimalFormat} should use.
1041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see DecimalFormatSymbols#setCurrency(Currency)
1042adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setCurrency(Currency currency) {
1045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-changed
1046f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setCurrency(Currency.getInstance(currency.getCurrencyCode()));
1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-changed
1048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        symbols.setCurrency(currency);
1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets whether the decimal separator is shown when there are no fractional
1053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * digits.
1054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} if the decimal separator should always be
1057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            formatted; {@code false} otherwise.
1058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDecimalSeparatorAlwaysShown(boolean value) {
1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setDecimalSeparatorAlwaysShown(value);
1061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the number of digits grouped together by the grouping separator.
1065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This only allows to set the primary grouping size; the secondary grouping
1066adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * size can only be set with a pattern.
10679b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
1068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of digits grouped together.
1070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setGroupingSize(int value) {
1072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setGroupingSize(value);
1073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1075adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets whether or not grouping will be used in this format. Grouping
1077adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * affects both parsing and formatting.
1078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} if grouping is used; {@code false} otherwise.
1081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setGroupingUsed(boolean value) {
1084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setGroupingUsed(value);
1085adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1086adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1087adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether grouping will be used in this format.
1089adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1090adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if grouping is used; {@code false} otherwise.
1091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1092adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1093adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isGroupingUsed() {
1094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.isGroupingUsed();
1095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1097adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1098f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Sets the maximum number of digits after the decimal point.
1099f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * If the value passed is negative then it is replaced by 0.
1100f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Regardless of this setting, no more than 340 digits will be used.
1101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1102f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * @param value the maximum number of fraction digits.
1103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMaximumFractionDigits(int value) {
1106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.setMaximumFractionDigits(value);
1107f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setMaximumFractionDigits(getMaximumFractionDigits());
1108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1111f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Sets the maximum number of digits before the decimal point.
1112f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * If the value passed is negative then it is replaced by 0.
1113f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Regardless of this setting, no more than 309 digits will be used.
1114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1115f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * @param value the maximum number of integer digits.
1116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMaximumIntegerDigits(int value) {
1119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.setMaximumIntegerDigits(value);
1120f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setMaximumIntegerDigits(getMaximumIntegerDigits());
1121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1124f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Sets the minimum number of digits after the decimal point.
1125f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * If the value passed is negative then it is replaced by 0.
1126f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Regardless of this setting, no more than 340 digits will be used.
1127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1128f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * @param value the minimum number of fraction digits.
1129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMinimumFractionDigits(int value) {
1132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.setMinimumFractionDigits(value);
1133f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setMinimumFractionDigits(getMinimumFractionDigits());
1134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1137f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Sets the minimum number of digits before the decimal point.
1138f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * If the value passed is negative then it is replaced by 0.
1139f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Regardless of this setting, no more than 309 digits will be used.
1140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1141f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * @param value the minimum number of integer digits.
1142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMinimumIntegerDigits(int value) {
1145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.setMinimumIntegerDigits(value);
1146f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setMinimumIntegerDigits(getMinimumIntegerDigits());
1147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the multiplier which is applied to the number before formatting or
1151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * after parsing.
1152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the multiplier.
1155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMultiplier(int value) {
1157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setMultiplier(value);
1158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the prefix which is formatted or parsed before a negative number.
1162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the negative prefix.
1165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setNegativePrefix(String value) {
1167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setNegativePrefix(value);
1168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the suffix which is formatted or parsed after a negative number.
1172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the negative suffix.
1175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setNegativeSuffix(String value) {
1177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setNegativeSuffix(value);
1178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the prefix which is formatted or parsed before a positive number.
1182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the positive prefix.
1185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setPositivePrefix(String value) {
1187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setPositivePrefix(value);
1188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the suffix which is formatted or parsed after a positive number.
1192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the positive suffix.
1195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setPositiveSuffix(String value) {
1197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setPositiveSuffix(value);
1198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the behaviour of the parse method. If set to {@code true} then all
1202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the returned objects will be of type {@code BigDecimal}.
1203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
1205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} if all the returned objects should be of type
1206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code BigDecimal}; {@code false} otherwise.
1207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setParseBigDecimal(boolean newValue) {
1209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.parseBigDecimal = newValue;
1210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the pattern of this decimal format using localized pattern
1214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * characters.
1215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the localized pattern.
1217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toLocalizedPattern() {
1219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.toLocalizedPattern();
1220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the pattern of this decimal format using non-localized pattern
1224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * characters.
1225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the non-localized pattern.
1227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toPattern() {
1229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.toPattern();
1230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // the fields list to be serialized
1233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final ObjectStreamField[] serialPersistentFields = {
1234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("positivePrefix", String.class), //$NON-NLS-1$
1235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("positiveSuffix", String.class), //$NON-NLS-1$
1236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("negativePrefix", String.class), //$NON-NLS-1$
1237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("negativeSuffix", String.class), //$NON-NLS-1$
1238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("posPrefixPattern", String.class), //$NON-NLS-1$
1239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("posSuffixPattern", String.class), //$NON-NLS-1$
1240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("negPrefixPattern", String.class), //$NON-NLS-1$
1241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("negSuffixPattern", String.class), //$NON-NLS-1$
1242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("multiplier", int.class), //$NON-NLS-1$
1243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("groupingSize", byte.class), //$NON-NLS-1$
1244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-added
1245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("groupingUsed", boolean.class), //$NON-NLS-1$
1246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-added
1247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("decimalSeparatorAlwaysShown", boolean.class), //$NON-NLS-1$
1248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("parseBigDecimal", boolean.class), //$NON-NLS-1$
1249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("symbols", DecimalFormatSymbols.class), //$NON-NLS-1$
1250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("useExponentialNotation", boolean.class), //$NON-NLS-1$
1251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("minExponentDigits", byte.class), //$NON-NLS-1$
1252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("maximumIntegerDigits", int.class), //$NON-NLS-1$
1253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("minimumIntegerDigits", int.class), //$NON-NLS-1$
1254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("maximumFractionDigits", int.class), //$NON-NLS-1$
1255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("minimumFractionDigits", int.class), //$NON-NLS-1$
1256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new ObjectStreamField("serialVersionOnStream", int.class), }; //$NON-NLS-1$
1257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Writes serialized fields following serialized forms specified by Java
1260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specification.
1261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param stream
1263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the output stream to write serialized bytes
1264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
1265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if some I/O error occurs
1266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassNotFoundException
1267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
12689b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson    @SuppressWarnings("nls")
1269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void writeObject(ObjectOutputStream stream) throws IOException,
1270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ClassNotFoundException {
1271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectOutputStream.PutField fields = stream.putFields();
12729b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("positivePrefix", dform.getPositivePrefix());
12739b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("positiveSuffix", dform.getPositiveSuffix());
12749b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("negativePrefix", dform.getNegativePrefix());
12759b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("negativeSuffix", dform.getNegativeSuffix());
12769b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        String posPrefixPattern = (String) Format.getInternalField(
12779b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson                "posPrefixPattern", dform);
12789b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("posPrefixPattern", posPrefixPattern);
12799b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        String posSuffixPattern = (String) Format.getInternalField(
12809b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson                "posSuffixPattern", dform);
12819b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("posSuffixPattern", posSuffixPattern);
12829b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        String negPrefixPattern = (String) Format.getInternalField(
12839b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson                "negPrefixPattern", dform);
12849b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("negPrefixPattern", negPrefixPattern);
12859b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        String negSuffixPattern = (String) Format.getInternalField(
12869b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson                "negSuffixPattern", dform);
12879b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("negSuffixPattern", negSuffixPattern);
12889b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("multiplier", dform.getMultiplier());
12899b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("groupingSize", (byte) dform.getGroupingSize());
1290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-added
12919b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("groupingUsed", dform.isGroupingUsed());
1292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-added
12939b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("decimalSeparatorAlwaysShown", dform
1294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .isDecimalSeparatorAlwaysShown());
12959b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("parseBigDecimal", parseBigDecimal);
12969b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("symbols", symbols);
1297f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        fields.put("useExponentialNotation", false);
1298f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        fields.put("minExponentDigits", 0);
12999b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("maximumIntegerDigits", dform.getMaximumIntegerDigits());
13009b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("minimumIntegerDigits", dform.getMinimumIntegerDigits());
13019b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("maximumFractionDigits", dform.getMaximumFractionDigits());
13029b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("minimumFractionDigits", dform.getMinimumFractionDigits());
1303f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        fields.put("serialVersionOnStream", 3);
1304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        stream.writeFields();
1305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads serialized fields following serialized forms specified by Java
1309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specification.
1310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param stream
1312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the input stream to read serialized bytes
1313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
1314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if some I/O error occurs
1315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassNotFoundException
1316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if some class of serialized objects or fields cannot be found
1317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
13189b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson    @SuppressWarnings("nls")
1319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void readObject(ObjectInputStream stream) throws IOException,
1320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ClassNotFoundException {
1321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectInputStream.GetField fields = stream.readFields();
13239b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        String positivePrefix = (String) fields.get("positivePrefix", "");
13249b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        String positiveSuffix = (String) fields.get("positiveSuffix", "");
13259b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        String negativePrefix = (String) fields.get("negativePrefix", "-");
13269b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        String negativeSuffix = (String) fields.get("negativeSuffix", "");
13279b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson
13289b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        String posPrefixPattern = (String) fields.get("posPrefixPattern", "");
13299b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        String posSuffixPattern = (String) fields.get("posSuffixPattern", "");
13309b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        String negPrefixPattern = (String) fields.get("negPrefixPattern", "-");
13319b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        String negSuffixPattern = (String) fields.get("negSuffixPattern", "");
13329b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson
13339b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        int multiplier = fields.get("multiplier", 1);
13349b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        byte groupingSize = fields.get("groupingSize", (byte) 3);
1335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-added
13369b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        boolean groupingUsed = fields.get("groupingUsed", true);
1337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-added
1338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean decimalSeparatorAlwaysShown = fields.get(
13399b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson                "decimalSeparatorAlwaysShown", false);
13409b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        boolean parseBigDecimal = fields.get("parseBigDecimal", false);
13419b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        symbols = (DecimalFormatSymbols) fields.get("symbols", null);
1342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
13439b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        int maximumIntegerDigits = fields.get("maximumIntegerDigits", 309);
13449b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        int minimumIntegerDigits = fields.get("minimumIntegerDigits", 309);
13459b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        int maximumFractionDigits = fields.get("maximumFractionDigits", 340);
13469b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        int minimumFractionDigits = fields.get("minimumFractionDigits", 340);
1347f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        int serialVersionOnStream = fields.get("serialVersionOnStream", 0);
1348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
13499b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        Locale locale = (Locale) Format.getInternalField("locale", symbols);
135064e410fa8b4771a8749f899134b4e08c2fd49e3cElliott Hughes        // BEGIN android-changed
1351f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        //this.dform = new com.ibm.icu4jni.text.DecimalFormat("", locale, symbols);
1352f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        initNative("", locale);
135364e410fa8b4771a8749f899134b4e08c2fd49e3cElliott Hughes        // END android-changed
1354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setPositivePrefix(positivePrefix);
1355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setPositiveSuffix(positiveSuffix);
1356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setNegativePrefix(negativePrefix);
1357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setNegativeSuffix(negativeSuffix);
13589b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        setInternalField("posPrefixPattern", dform, posPrefixPattern);
13599b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        setInternalField("posSuffixPattern", dform, posSuffixPattern);
13609b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        setInternalField("negPrefixPattern", dform, negPrefixPattern);
13619b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        setInternalField("negSuffixPattern", dform, negSuffixPattern);
1362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setMultiplier(multiplier);
1363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setGroupingSize(groupingSize);
1364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-added
1365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setGroupingUsed(groupingUsed);
1366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-added
1367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setDecimalSeparatorAlwaysShown(decimalSeparatorAlwaysShown);
1368f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        setMinimumIntegerDigits(minimumIntegerDigits);
1369f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // BEGIN android-changed: tell ICU what we want, then ask it what we can have, and then
1370f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // set that in our Java object. This isn't RI-compatible, but then very little of our
1371f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // behavior in this area is, and it's not obvious how we can second-guess ICU (or tell
1372f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // it to just do exactly what we ask). We only need to do this with maximumIntegerDigits
1373f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // because ICU doesn't seem to have its own ideas about the other options.
1374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setMaximumIntegerDigits(maximumIntegerDigits);
1375f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        super.setMaximumIntegerDigits(dform.getMaximumIntegerDigits());
1376f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // END android-changed
1377f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        setMinimumFractionDigits(minimumFractionDigits);
1378f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        setMaximumFractionDigits(maximumFractionDigits);
1379f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        setParseBigDecimal(parseBigDecimal);
1380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (serialVersionOnStream < 3) {
13829b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson            setMaximumIntegerDigits(super.getMaximumIntegerDigits());
1383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setMinimumIntegerDigits(super.getMinimumIntegerDigits());
1384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setMaximumFractionDigits(super.getMaximumFractionDigits());
1385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setMinimumFractionDigits(super.getMinimumFractionDigits());
1386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
1390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets private field value by reflection.
1391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
1392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param fieldName the field name to be set @param target the object which
1393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * field to be set @param value the value to be set
1394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void setInternalField(final String fieldName, final Object target,
1396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            final Object value) {
1397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        AccessController
1398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .doPrivileged(new PrivilegedAction<java.lang.reflect.Field>() {
1399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    public java.lang.reflect.Field run() {
1400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        java.lang.reflect.Field field = null;
1401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        try {
1402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            field = target.getClass().getDeclaredField(
1403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    fieldName);
1404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            field.setAccessible(true);
1405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            field.set(target, value);
1406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        } catch (Exception e) {
1407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            return null;
1408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
1409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return field;
1410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
1411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                });
1412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
1414