DecimalFormat.java revision 3e6f49bbb915b880afe104ec784c66bda55da450
1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.text;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughesimport com.ibm.icu4jni.text.NativeDecimalFormat;
21757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughesimport com.ibm.icu4jni.util.LocaleData;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectInputStream;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectStreamField;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigDecimal;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigInteger;
2842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughesimport java.math.RoundingMode;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Currency;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Locale;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A concrete subclass of {@link NumberFormat} that formats decimal numbers. It
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * has a variety of features designed to make it possible to parse and format
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * numbers in any locale, including support for Western, Arabic, or Indic
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * digits. It also supports different flavors of numbers, including integers
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ("123"), fixed-point numbers ("123.4"), scientific notation ("1.23E4"),
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * percentages ("12%"), and currency amounts ("$123"). All of these flavors can
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be easily localized.
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>This is an enhanced version of {@code DecimalFormat} that is based on
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the standard version in the RI. New or changed functionality is labeled
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong><font color="red">NEW</font></strong>.</strong>
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * To obtain a {@link NumberFormat} for a specific locale (including the default
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * locale), call one of {@code NumberFormat}'s factory methods such as
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code NumberFormat.getInstance}. Do not call the {@code DecimalFormat}
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * constructors directly, unless you know what you are doing, since the
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link NumberFormat} factory methods may return subclasses other than
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat}. If you need to customize the format object, do
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * something like this: <blockquote>
529b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * NumberFormat f = NumberFormat.getInstance(loc);
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if (f instanceof DecimalFormat) {
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     ((DecimalFormat)f).setDecimalSeparatorAlwaysShown(true);
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * }
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
599b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
619b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Patterns</h4>
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A {@code DecimalFormat} consists of a <em>pattern</em> and a set of
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>symbols</em>. The pattern may be set directly using
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link #applyPattern(String)}, or indirectly using other API methods which
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * manipulate aspects of the pattern, such as the minimum number of integer
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * digits. The symbols are stored in a {@link DecimalFormatSymbols} object. When
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * using the {@link NumberFormat} factory methods, the pattern and symbols are
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read from ICU's locale data.
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Special Pattern Characters</h4>
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Many characters in a pattern are taken literally; they are matched during
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parsing and are written out unchanged during formatting. On the other hand,
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * special characters stand for other characters, strings, or classes of
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * characters. For example, the '#' character is replaced by a localized digit.
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Often the replacement character is the same as the pattern character; in the
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * U.S. locale, the ',' grouping character is replaced by ','. However, the
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * replacement is still happening, and if the symbols are modified, the grouping
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * character changes. Some special characters affect the behavior of the
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * formatter by their presence; for example, if the percent character is seen,
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then the value is multiplied by 100 before being displayed.
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * To insert a special character in a pattern as a literal, that is, without any
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * special meaning, the character must be quoted. There are some exceptions to
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this which are noted below.
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The characters listed here are used in non-localized patterns. Localized
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * patterns use the corresponding characters taken from this formatter's
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link DecimalFormatSymbols} object instead, and these characters lose their
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * special status. Two exceptions are the currency sign and quote, which are not
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * localized.
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> <table border="0" cellspacing="3" cellpadding="0" summary="Chart
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * showing symbol, location, localized, and meaning.">
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr bgcolor="#ccccff">
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Symbol</th>
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Location</th>
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Localized?</th>
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Meaning</th>
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code 0}</td>
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Number</td>
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Digit.</td>
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code @}</td>
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Number</td>
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>No</td>
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td><strong><font color="red">NEW</font>&nbsp;</strong> Significant
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * digit.</td>
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code #}</td>
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Number</td>
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Digit, leading zeroes are not shown.</td>
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code .}</td>
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Number</td>
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Decimal separator or monetary decimal separator.</td>
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code -}</td>
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Number</td>
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Minus sign.</td>
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code ,}</td>
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Number</td>
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Grouping separator.</td>
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code E}</td>
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Number</td>
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Separates mantissa and exponent in scientific notation.
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>Does not need to be quoted in prefix or suffix.</em></td>
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code +}</td>
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Exponent</td>
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td><strong><font color="red">NEW</font>&nbsp;</strong> Prefix
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * positive exponents with localized plus sign.
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>Does not need to be quoted in prefix or suffix.</em></td>
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code ;}</td>
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Subpattern boundary</td>
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Separates positive and negative subpatterns.</td>
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code %}</td>
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Prefix or suffix</td>
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Multiply by 100 and show as percentage.</td>
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code \u2030} ({@code &#92;u2030})</td>
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Prefix or suffix</td>
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Multiply by 1000 and show as per mille.</td>
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code &#164;} ({@code &#92;u00A4})</td>
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Prefix or suffix</td>
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>No</td>
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Currency sign, replaced by currency symbol. If doubled, replaced by
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * international currency symbol. If present in a pattern, the monetary decimal
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * separator is used instead of the decimal separator.</td>
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code '}</td>
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Prefix or suffix</td>
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>No</td>
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Used to quote special characters in a prefix or suffix, for example,
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "'#'#"} formats 123 to {@code "#123"}. To create a single quote
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * itself, use two in a row: {@code "# o''clock"}.</td>
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code *}</td>
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Prefix or suffix boundary</td>
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>Yes</td>
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td><strong><font color="red">NEW</font>&nbsp;</strong> Pad escape,
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * precedes pad character. </td>
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </table> </blockquote>
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
196757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes * A {@code DecimalFormat} pattern contains a positive and negative subpattern,
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for example, "#,##0.00;(#,##0.00)". Each subpattern has a prefix, a numeric
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * part and a suffix. If there is no explicit negative subpattern, the negative
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * subpattern is the localized minus sign prefixed to the positive subpattern.
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * That is, "0.00" alone is equivalent to "0.00;-0.00". If there is an explicit
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * negative subpattern, it serves only to specify the negative prefix and
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * suffix; the number of digits, minimal digits, and other characteristics are
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ignored in the negative subpattern. This means that "#,##0.0#;(#)" produces
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * precisely the same result as "#,##0.0#;(#,##0.0#)".
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The prefixes, suffixes, and various symbols used for infinity, digits,
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thousands separators, decimal separators, etc. may be set to arbitrary
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * values, and they will appear properly during formatting. However, care must
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be taken that the symbols and strings do not conflict, or parsing will be
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * unreliable. For example, either the positive and negative prefixes or the
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * suffixes must be distinct for {@link #parse} to be able to distinguish
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * positive from negative values. Another example is that the decimal separator
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and thousands separator should be distinct characters, or parsing will be
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * impossible.
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The <em>grouping separator</em> is a character that separates clusters of
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * integer digits to make large numbers more legible. It is commonly used for
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thousands, but in some locales it separates ten-thousands. The <em>grouping
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * size</em>
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is the number of digits between the grouping separators, such as 3 for
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "100,000,000" or 4 for "1 0000 0000". There are actually two different
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * grouping sizes: One used for the least significant integer digits, the
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>primary grouping size</em>, and one used for all others, the
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>secondary grouping size</em>. In most locales these are the same, but
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sometimes they are different. For example, if the primary grouping interval
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is 3, and the secondary is 2, then this corresponds to the pattern
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "#,##,##0", and the number 123456789 is formatted as "12,34,56,789". If a
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * pattern contains multiple grouping separators, the interval between the last
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * one and the end of the integer defines the primary grouping size, and the
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * interval between the last two defines the secondary grouping size. All others
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * are ignored, so "#,##,###,####", "###,###,####" and "##,#,###,####" produce
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the same result.
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Illegal patterns, such as "#.#.#" or "#.###,###", will cause
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat} to throw an {@link IllegalArgumentException} with a
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * message that describes the problem.
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Pattern BNF</h4>
2389b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * pattern    := subpattern (';' subpattern)?
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * subpattern := prefix? number exponent? suffix?
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * number     := (integer ('.' fraction)?) | sigDigits
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * prefix     := '\\u0000'..'\\uFFFD' - specialCharacters
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * suffix     := '\\u0000'..'\\uFFFD' - specialCharacters
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * integer    := '#'* '0'* '0'
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fraction   := '0'* '#'*
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sigDigits  := '#'* '@' '@'* '#'*
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * exponent   := 'E' '+'? '0'* '0'
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * padSpec    := '*' padChar
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * padChar    := '\\u0000'..'\\uFFFD' - quote
2519b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Notation:
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   X*       0 or more instances of X
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   X?       0 or 1 instances of X
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   X|Y      either X or Y
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   C..D     any character from C up to D, inclusive
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *   S-T      characters in S, except those in T
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
2599b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The first subpattern is for positive numbers. The second (optional)
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * subpattern is for negative numbers.
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Not indicated in the BNF syntax above:
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The grouping separator ',' can occur inside the integer and sigDigits
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * elements, between any two pattern characters of that element, as long as the
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * integer or sigDigits element is not followed by the exponent element.
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li><font color="red"><strong>NEW</strong>&nbsp;</font> Two
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * grouping intervals are recognized: The one between the decimal point and the
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * first grouping symbol and the one between the first and second grouping
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * symbols. These intervals are identical in most locales, but in some locales
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * they differ. For example, the pattern &quot;#,##,###&quot; formats the number
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 123456789 as &quot;12,34,56,789&quot;.</li>
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> <strong><font color="red">NEW</font>&nbsp;</strong> The pad
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specifier {@code padSpec} may appear before the prefix, after the prefix,
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * before the suffix, after the suffix or not at all.
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Parsing</h4>
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat} parses all Unicode characters that represent decimal
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * digits, as defined by {@link Character#digit(int, int)}. In addition,
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat} also recognizes as digits the ten consecutive
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * characters starting with the localized zero digit defined in the
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link DecimalFormatSymbols} object. During formatting, the
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link DecimalFormatSymbols}-based digits are written out.
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * During parsing, grouping separators are ignored.
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If {@link #parse(String, ParsePosition)} fails to parse a string, it returns
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code null} and leaves the parse position unchanged.
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Formatting</h4>
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Formatting is guided by several parameters, all of which can be specified
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * either using a pattern or using the API. The following description applies to
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * formats that do not use <a href="#sci">scientific notation</a> or <a
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * href="#sigdig">significant digits</a>.
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If the number of actual integer digits exceeds the
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>maximum integer digits</em>, then only the least significant digits
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * are shown. For example, 1997 is formatted as "97" if maximum integer digits
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is set to 2.
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If the number of actual integer digits is less than the
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>minimum integer digits</em>, then leading zeros are added. For
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example, 1997 is formatted as "01997" if minimum integer digits is set to 5.
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If the number of actual fraction digits exceeds the <em>maximum
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fraction digits</em>,
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then half-even rounding is performed to the maximum fraction digits. For
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example, 0.125 is formatted as "0.12" if the maximum fraction digits is 2.
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If the number of actual fraction digits is less than the
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>minimum fraction digits</em>, then trailing zeros are added. For
311757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes * example, 0.125 is formatted as "0.1250" if the minimum fraction digits is set
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to 4.
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Trailing fractional zeros are not displayed if they occur <em>j</em>
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * positions after the decimal, where <em>j</em> is less than the maximum
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fraction digits. For example, 0.10004 is formatted as "0.1" if the maximum
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fraction digits is four or less.
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <strong>Special Values</strong>
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code NaN} is represented as a single character, typically
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code &#92;uFFFD}. This character is determined by the
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link DecimalFormatSymbols} object. This is the only value for which the
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * prefixes and suffixes are not used.
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Infinity is represented as a single character, typically {@code &#92;u221E},
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with the positive or negative prefixes and suffixes applied. The infinity
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * character is determined by the {@link DecimalFormatSymbols} object. <a
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * name="sci">
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Scientific Notation</h4>
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </a>
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Numbers in scientific notation are expressed as the product of a mantissa and
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a power of ten, for example, 1234 can be expressed as 1.234 x 10<sup>3</sup>.
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The mantissa is typically in the half-open interval [1.0, 10.0) or sometimes
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * [0.0, 1.0), but it does not need to be. {@code DecimalFormat} supports
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * arbitrary mantissas. {@code DecimalFormat} can be instructed to use
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * scientific notation through the API or through the pattern. In a pattern, the
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * exponent character immediately followed by one or more digit characters
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * indicates scientific notation. Example: "0.###E0" formats the number 1234 as
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "1.234E3".
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The number of digit characters after the exponent character gives the
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * minimum exponent digit count. There is no maximum. Negative exponents are
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * formatted using the localized minus sign, <em>not</em> the prefix and
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * suffix from the pattern. This allows patterns such as "0.###E0 m/s". To
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * prefix positive exponents with a localized plus sign, specify '+' between the
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * exponent and the digits: "0.###E+0" will produce formats "1E+1", "1E+0",
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "1E-1", etc. (In localized patterns, use the localized plus sign rather than
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * '+'.)
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The minimum number of integer digits is achieved by adjusting the
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * exponent. Example: 0.00123 formatted with "00.###E0" yields "12.3E-4". This
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * only happens if there is no maximum number of integer digits. If there is a
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * maximum, then the minimum number of integer digits is fixed at one.
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The maximum number of integer digits, if present, specifies the exponent
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * grouping. The most common use of this is to generate <em>engineering
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * notation</em>,
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in which the exponent is a multiple of three, e.g., "##0.###E0". The number
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 12345 is formatted using "##0.###E0" as "12.345E3".
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>When using scientific notation, the formatter controls the digit counts
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * using significant digits logic. The maximum number of significant digits
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limits the total number of integer and fraction digits that will be shown in
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the mantissa; it does not affect parsing. For example, 12345 formatted with
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "##0.##E0" is "12.3E3". See the section on significant digits for more
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * details.
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The number of significant digits shown is determined as follows: If no
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * significant digits are used in the pattern then the minimum number of
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * significant digits shown is one, the maximum number of significant digits
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * shown is the sum of the <em>minimum integer</em> and
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>maximum fraction</em> digits, and it is unaffected by the maximum
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * integer digits. If this sum is zero, then all significant digits are shown.
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If significant digits are used in the pattern then the number of integer
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * digits is fixed at one and there is no exponent grouping.
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Exponential patterns may not contain grouping separators.
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <a name="sigdig">
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4> <strong><font color="red">NEW</font>&nbsp;</strong> Significant
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Digits</h4>
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </a> {@code DecimalFormat} has two ways of controlling how many digits are
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * shown: (a) significant digit counts or (b) integer and fraction digit counts.
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Integer and fraction digit counts are described above. When a formatter uses
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * significant digits counts, the number of integer and fraction digits is not
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified directly, and the formatter settings for these counts are ignored.
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Instead, the formatter uses as many integer and fraction digits as required
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to display the specified number of significant digits.
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h5>Examples:</h5>
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> <table border=0 cellspacing=3 cellpadding=0>
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr bgcolor="#ccccff">
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Pattern</th>
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Minimum significant digits</th>
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Maximum significant digits</th>
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Number</th>
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <th align="left">Output of format()</th>
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code @@@}
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>3</td>
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>3</td>
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>12345</td>
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code 12300}</td>
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code @@@}</td>
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>3</td>
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>3</td>
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>0.12345</td>
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code 0.123}</td>
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top">
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code @@##}</td>
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>2</td>
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>4</td>
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>3.14159</td>
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code 3.142}</td>
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <tr valign="top" bgcolor="#eeeeff">
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code @@##}</td>
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>2</td>
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>4</td>
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>1.23004</td>
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <td>{@code 1.23}</td>
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </tr>
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </table> </blockquote>
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Significant digit counts may be expressed using patterns that specify a
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * minimum and maximum number of significant digits. These are indicated by the
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code '@'} and {@code '#'} characters. The minimum number of significant
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * digits is the number of {@code '@'} characters. The maximum number of
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * significant digits is the number of {@code '@'} characters plus the number of
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code '#'} characters following on the right. For example, the pattern
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "@@@"} indicates exactly 3 significant digits. The pattern
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "@##"} indicates from 1 to 3 significant digits. Trailing zero digits
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to the right of the decimal separator are suppressed after the minimum number
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of significant digits have been shown. For example, the pattern {@code "@##"}
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * formats the number 0.1203 as {@code "0.12"}.
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If a pattern uses significant digits, it may not contain a decimal
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * separator, nor the {@code '0'} pattern character. Patterns such as
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "@00"} or {@code "@.###"} are disallowed.
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Any number of {@code '#'} characters may be prepended to the left of the
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * leftmost {@code '@'} character. These have no effect on the minimum and
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * maximum significant digit counts, but may be used to position grouping
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * separators. For example, {@code "#,#@#"} indicates a minimum of one
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * significant digit, a maximum of two significant digits, and a grouping size
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of three.
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>In order to enable significant digits formatting, use a pattern
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * containing the {@code '@'} pattern character.
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>In order to disable significant digits formatting, use a pattern that
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * does not contain the {@code '@'} pattern character.
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The number of significant digits has no effect on parsing.
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Significant digits may be used together with exponential notation. Such
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * patterns are equivalent to a normal exponential pattern with a minimum and
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * maximum integer digit count of one, a minimum fraction digit count of the
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * number of '@' characters in the pattern - 1, and a maximum fraction digit
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * count of the number of '@' and '#' characters in the pattern - 1. For
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example, the pattern {@code "@@###E0"} is equivalent to {@code "0.0###E0"}.
457757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes * <li>If significant digits are in use then the integer and fraction digit
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * counts, as set via the API, are ignored.
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4> <strong><font color="red">NEW</font>&nbsp;</strong> Padding</h4>
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat} supports padding the result of {@code format} to a
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specific width. Padding may be specified either through the API or through
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the pattern syntax. In a pattern, the pad escape character followed by a
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * single pad character causes padding to be parsed and formatted. The pad
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * escape character is '*' in unlocalized patterns. For example,
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "$*x#,##0.00"} formats 123 to {@code "$xx123.00"}, and 1234 to
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "$1,234.00"}.
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>When padding is in effect, the width of the positive subpattern,
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * including prefix and suffix, determines the format width. For example, in the
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * pattern {@code "* #0 o''clock"}, the format width is 10.</li>
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The width is counted in 16-bit code units (Java {@code char}s).</li>
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Some parameters which usually do not matter have meaning when padding is
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used, because the pattern width is significant with padding. In the pattern "*
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ##,##,#,##0.##", the format width is 14. The initial characters "##,##," do
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not affect the grouping size or maximum integer digits, but they do affect
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the format width.</li>
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Padding may be inserted at one of four locations: before the prefix,
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * after the prefix, before the suffix or after the suffix. If padding is
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified in any other location, {@link #applyPattern} throws an {@link
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * IllegalArgumentException}. If there is no prefix, before the prefix and after
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the prefix are equivalent, likewise for the suffix.</li>
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>When specified in a pattern, the 16-bit {@code char} immediately
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * following the pad escape is the pad character. This may be any character,
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * including a special pattern character. That is, the pad escape
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>escapes</em> the following character. If there is no character after
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the pad escape, then the pattern is illegal.</li>
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Synchronization</h4>
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code DecimalFormat} objects are not synchronized. Multiple threads should
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not access one formatter concurrently.
4949b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson *
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Format
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see NumberFormat
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class DecimalFormat extends NumberFormat {
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = 864413376551465018L;
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private transient DecimalFormatSymbols symbols;
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
504820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes    private transient NativeDecimalFormat dform;
5053e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes    private final Object finalizerGuardian = new Object() {
5063e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        @Override protected void finalize() throws Throwable {
5073e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes            dform.close();
5083e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        }
5093e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes    };
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
51142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    private transient RoundingMode roundingMode = RoundingMode.HALF_EVEN;
51242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DecimalFormat} for formatting and parsing numbers
5153106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * for the user's default locale.
5163106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DecimalFormat() {
5199b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        Locale locale = Locale.getDefault();
520f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        this.symbols = new DecimalFormatSymbols(locale);
521757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        initNative(LocaleData.get(locale).numberPattern);
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DecimalFormat} using the specified non-localized
5263106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * pattern and the {@code DecimalFormatSymbols} for the user's default Locale.
5273106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pattern
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the non-localized pattern.
5309b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
5319b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the pattern cannot be parsed.
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DecimalFormat(String pattern) {
534f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        this(pattern, Locale.getDefault());
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DecimalFormat} using the specified non-localized
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * pattern and {@code DecimalFormatSymbols}.
540f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pattern
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the non-localized pattern.
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the DecimalFormatSymbols.
5459b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
5469b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the pattern cannot be parsed.
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DecimalFormat(String pattern, DecimalFormatSymbols value) {
549f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        this.symbols = (DecimalFormatSymbols) value.clone();
5505d593ea1361bd7c5ef3353b66d63ac64e95d9d41Elliott Hughes        initNative(pattern);
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
553757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes    // Used by NumberFormat.getInstance because cloning DecimalFormatSymbols is slow.
554a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes    DecimalFormat(String pattern, Locale locale) {
555a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        this.symbols = new DecimalFormatSymbols(locale);
5565d593ea1361bd7c5ef3353b66d63ac64e95d9d41Elliott Hughes        initNative(pattern);
557f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    }
558a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes
5595d593ea1361bd7c5ef3353b66d63ac64e95d9d41Elliott Hughes    private void initNative(String pattern) {
560f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        try {
5615d593ea1361bd7c5ef3353b66d63ac64e95d9d41Elliott Hughes            this.dform = new NativeDecimalFormat(pattern, symbols);
562f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        } catch (IllegalArgumentException ex) {
563f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            throw new IllegalArgumentException(pattern);
564f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        }
565a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        super.setMaximumFractionDigits(dform.getMaximumFractionDigits());
566a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        super.setMaximumIntegerDigits(dform.getMaximumIntegerDigits());
567a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        super.setMinimumFractionDigits(dform.getMinimumFractionDigits());
568a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        super.setMinimumIntegerDigits(dform.getMinimumIntegerDigits());
569a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes    }
570a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Changes the pattern of this decimal format to the specified pattern which
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * uses localized pattern characters.
574f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pattern
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the localized pattern.
5779b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
5789b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the pattern cannot be parsed.
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void applyLocalizedPattern(String pattern) {
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.applyLocalizedPattern(pattern);
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Changes the pattern of this decimal format to the specified pattern which
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * uses non-localized pattern characters.
587f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pattern
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the non-localized pattern.
5909b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
5919b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the pattern cannot be parsed.
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void applyPattern(String pattern) {
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.applyPattern(pattern);
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code DecimalFormat} with the same pattern and
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * properties as this decimal format.
600f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a shallow copy of this decimal format.
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.Cloneable
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DecimalFormat clone = (DecimalFormat) super.clone();
607820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes        clone.dform = (NativeDecimalFormat) dform.clone();
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        clone.symbols = (DecimalFormatSymbols) symbols.clone();
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return clone;
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the specified object to this decimal format and indicates if
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * they are equal. In order to be equal, {@code object} must be an instance
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of {@code DecimalFormat} with the same pattern and properties.
616f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare with this object.
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this decimal
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         format; {@code false} otherwise.
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #hashCode
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object object) {
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this == object) {
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(object instanceof DecimalFormat)) {
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
631f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        DecimalFormat other = (DecimalFormat) object;
632f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        return (this.dform == null ? other.dform == null : this.dform.equals(other.dform)) &&
633f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                getDecimalFormatSymbols().equals(other.getDecimalFormatSymbols());
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified object using the rules of this decimal format and
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returns an {@code AttributedCharacterIterator} with the formatted number
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and attributes.
640f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to format.
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an AttributedCharacterIterator with the formatted number and
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         attributes.
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code object} cannot be formatted by this format.
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code object} is {@code null}.
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public AttributedCharacterIterator formatToCharacterIterator(Object object) {
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (object == null) {
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.formatToCharacterIterator(object);
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
6583e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes    private void checkBufferAndFieldPosition(StringBuffer buffer, FieldPosition position) {
6593e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        if (buffer == null) {
6603e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes            throw new NullPointerException("buffer == null");
6613e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        }
6623e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        if (position == null) {
6633e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes            throw new NullPointerException("position == null");
6643e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        }
6653e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes    }
6663e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
668d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes    public StringBuffer format(double value, StringBuffer buffer, FieldPosition position) {
6693e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        checkBufferAndFieldPosition(buffer, position);
67042db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        // All float/double/Float/Double formatting ends up here...
67142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        if (roundingMode == RoundingMode.UNNECESSARY) {
67242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes            // ICU4C doesn't support this rounding mode, so we have to fake it.
67342db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes            try {
67442db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                setRoundingMode(RoundingMode.UP);
67542db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                String upResult = format(value, new StringBuffer(), new FieldPosition(0)).toString();
67642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                setRoundingMode(RoundingMode.DOWN);
67742db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                String downResult = format(value, new StringBuffer(), new FieldPosition(0)).toString();
67842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                if (!upResult.equals(downResult)) {
67942db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                    throw new ArithmeticException("rounding mode UNNECESSARY but rounding required");
68042db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                }
68142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes            } finally {
68242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                setRoundingMode(RoundingMode.UNNECESSARY);
68342db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes            }
68442db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        }
6853e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        buffer.append(dform.formatDouble(value, position));
6863e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        return buffer;
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
690d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes    public StringBuffer format(long value, StringBuffer buffer, FieldPosition position) {
6913e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        checkBufferAndFieldPosition(buffer, position);
6923e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        buffer.append(dform.formatLong(value, position));
6933e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        return buffer;
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
6973e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes    public final StringBuffer format(Object number, StringBuffer buffer, FieldPosition position) {
6983e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        checkBufferAndFieldPosition(buffer, position);
699d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        if (number instanceof BigInteger) {
700d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes            BigInteger bigInteger = (BigInteger) number;
7013e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes            String s = (bigInteger.bitLength() < 64)
7023e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes                    ? dform.formatLong(bigInteger.longValue(), position)
7033e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes                    : dform.formatBigInteger(bigInteger, position);
7043e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes            buffer.append(s);
7053e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes            return buffer;
706d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        } else if (number instanceof BigDecimal) {
7073e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes            buffer.append(dform.formatBigDecimal((BigDecimal) number, position));
7083e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes            return buffer;
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
7103e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        return super.format(number, buffer, position);
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code DecimalFormatSymbols} used by this decimal format.
715f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a copy of the {@code DecimalFormatSymbols} used by this decimal
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         format.
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DecimalFormatSymbols getDecimalFormatSymbols() {
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (DecimalFormatSymbols) symbols.clone();
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the currency used by this decimal format.
725f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the currency used by this decimal format.
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see DecimalFormatSymbols#getCurrency()
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Currency getCurrency() {
7315d593ea1361bd7c5ef3353b66d63ac64e95d9d41Elliott Hughes        return symbols.getCurrency();
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the number of digits grouped together by the grouping separator.
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This only allows to get the primary grouping size. There is no API to get
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the secondary grouping size.
7389b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of digits grouped together.
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getGroupingSize() {
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getGroupingSize();
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the multiplier which is applied to the number before formatting
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or after parsing.
748f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the multiplier.
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMultiplier() {
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getMultiplier();
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the prefix which is formatted or parsed before a negative number.
757f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the negative prefix.
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getNegativePrefix() {
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getNegativePrefix();
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the suffix which is formatted or parsed after a negative number.
766f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the negative suffix.
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getNegativeSuffix() {
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getNegativeSuffix();
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the prefix which is formatted or parsed before a positive number.
775f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the positive prefix.
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getPositivePrefix() {
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getPositivePrefix();
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the suffix which is formatted or parsed after a positive number.
784f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the positive suffix.
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getPositiveSuffix() {
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getPositiveSuffix();
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.hashCode();
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the decimal separator is shown when there are no
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * fractional digits.
799f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the decimal separator should always be formatted;
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} otherwise.
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isDecimalSeparatorAlwaysShown() {
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.isDecimalSeparatorAlwaysShown();
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This value indicates whether the return object of the parse operation is
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of type {@code BigDecimal}. This value defaults to {@code false}.
810f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if parse always returns {@code BigDecimals},
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} if the type of the result is {@code Long} or
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Double}.
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isParseBigDecimal() {
816947eeb80f985827209c9500851e288504d58ec2eclaireho        return dform.isParseBigDecimal();
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the flag that indicates whether numbers will be parsed as integers.
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * When this decimal format is used for parsing and this value is set to
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code true}, then the resulting numbers will be of type
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code java.lang.Integer}. Special cases are NaN, positive and negative
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * infinity, which are still returned as {@code java.lang.Double}.
825f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
8269b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} that the resulting numbers of parse operations
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            will be of type {@code java.lang.Integer} except for the
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            special cases described above.
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setParseIntegerOnly(boolean value) {
834820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes        // In this implementation, NativeDecimalFormat is wrapped to
8359b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        // fulfill most of the format and parse feature. And this method is
836820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes        // delegated to the wrapped instance of NativeDecimalFormat.
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setParseIntegerOnly(value);
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether parsing with this decimal format will only
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * return numbers of type {@code java.lang.Integer}.
843f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this {@code DecimalFormat}'s parse method only
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         returns {@code java.lang.Integer}; {@code false} otherwise.
846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isParseIntegerOnly() {
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.isParseIntegerOnly();
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final Double NEGATIVE_ZERO_DOUBLE = new Double(-0.0);
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses a {@code Long} or {@code Double} from the specified string
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * starting at the index specified by {@code position}. If the string is
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * successfully parsed then the index of the {@code ParsePosition} is
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * updated to the index following the parsed text. On error, the index is
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * unchanged and the error index of {@code ParsePosition} is set to the
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * index where the error occurred.
861f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string to parse.
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param position
865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            input/output parameter, specifies the start index in
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code string} from where to start parsing. If parsing is
867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            successful, it is updated with the index following the parsed
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            text; on error, the index is unchanged and the error index is
869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            set to the index where the error occurred.
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Long} or {@code Double} resulting from the parse or
871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code null} if there is an error. The result will be a
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Long} if the parsed number is an integer in the range of a
873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         long, otherwise the result is a {@code Double}. If
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code isParseBigDecimal} is {@code true} then it returns the
875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         result as a {@code BigDecimal}.
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Number parse(String string, ParsePosition position) {
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Number number = dform.parse(string, position);
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (null == number) {
881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-removed
884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // if (this.isParseBigDecimal()) {
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     if (number instanceof Long) {
886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //         return new BigDecimal(number.longValue());
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     }
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     if ((number instanceof Double) && !((Double) number).isInfinite()
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //             && !((Double) number).isNaN()) {
890f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        //
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //         return new BigDecimal(number.doubleValue());
892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     }
893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     if (number instanceof BigInteger) {
894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //         return new BigDecimal(number.doubleValue());
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     }
896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     if (number instanceof com.ibm.icu.math.BigDecimal) {
897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //         return new BigDecimal(number.toString());
898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     }
899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     return number;
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // }
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // if ((number instanceof com.ibm.icu.math.BigDecimal)
902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //         || (number instanceof BigInteger)) {
903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     return new Double(number.doubleValue());
904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // }
905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-removed
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-added
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this.isParseBigDecimal()) {
908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (number instanceof Long) {
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return new BigDecimal(number.longValue());
910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((number instanceof Double) && !((Double) number).isInfinite()
912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    && !((Double) number).isNaN()) {
913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return new BigDecimal(number.toString());
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (number instanceof BigInteger) {
917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return new BigDecimal(number.toString());
918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return number;
920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((number instanceof BigDecimal) || (number instanceof BigInteger)) {
922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new Double(number.doubleValue());
923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-added
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this.isParseIntegerOnly() && number.equals(NEGATIVE_ZERO_DOUBLE)) {
927186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes            return Long.valueOf(0); // android-changed
928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return number;
930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the {@code DecimalFormatSymbols} used by this decimal format.
935f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code DecimalFormatSymbols} to set.
938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDecimalFormatSymbols(DecimalFormatSymbols value) {
940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (value != null) {
941f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            // BEGIN android-changed: the Java object is canonical, and we copy down to native code.
942f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            this.symbols = (DecimalFormatSymbols) value.clone();
943f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            dform.setDecimalFormatSymbols(this.symbols);
944f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            // END android-changed
945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the currency used by this decimal format. The min and max fraction
950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * digits remain the same.
951f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param currency
953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the currency this {@code DecimalFormat} should use.
954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see DecimalFormatSymbols#setCurrency(Currency)
955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setCurrency(Currency currency) {
958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-changed
959f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setCurrency(Currency.getInstance(currency.getCurrencyCode()));
960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-changed
961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        symbols.setCurrency(currency);
962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets whether the decimal separator is shown when there are no fractional
966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * digits.
967f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
969adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} if the decimal separator should always be
970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            formatted; {@code false} otherwise.
971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDecimalSeparatorAlwaysShown(boolean value) {
973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setDecimalSeparatorAlwaysShown(value);
974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
977adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the number of digits grouped together by the grouping separator.
978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This only allows to set the primary grouping size; the secondary grouping
979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * size can only be set with a pattern.
9809b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of digits grouped together.
983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setGroupingSize(int value) {
985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setGroupingSize(value);
986adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
989adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets whether or not grouping will be used in this format. Grouping
990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * affects both parsing and formatting.
991f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} if grouping is used; {@code false} otherwise.
994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setGroupingUsed(boolean value) {
997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setGroupingUsed(value);
998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether grouping will be used in this format.
1002f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if grouping is used; {@code false} otherwise.
1004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isGroupingUsed() {
1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.isGroupingUsed();
1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1011f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Sets the maximum number of digits after the decimal point.
1012f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * If the value passed is negative then it is replaced by 0.
1013f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Regardless of this setting, no more than 340 digits will be used.
1014f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1015f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * @param value the maximum number of fraction digits.
1016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1018adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMaximumFractionDigits(int value) {
1019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.setMaximumFractionDigits(value);
1020f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setMaximumFractionDigits(getMaximumFractionDigits());
102142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        // Changing the maximum fraction digits needs to update ICU4C's rounding configuration.
102242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        setRoundingMode(roundingMode);
1023adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1026f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Sets the maximum number of digits before the decimal point.
1027f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * If the value passed is negative then it is replaced by 0.
1028f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Regardless of this setting, no more than 309 digits will be used.
1029f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1030f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * @param value the maximum number of integer digits.
1031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMaximumIntegerDigits(int value) {
1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.setMaximumIntegerDigits(value);
1035f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setMaximumIntegerDigits(getMaximumIntegerDigits());
1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1039f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Sets the minimum number of digits after the decimal point.
1040f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * If the value passed is negative then it is replaced by 0.
1041f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Regardless of this setting, no more than 340 digits will be used.
1042f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1043f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * @param value the minimum number of fraction digits.
1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMinimumFractionDigits(int value) {
1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.setMinimumFractionDigits(value);
1048f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setMinimumFractionDigits(getMinimumFractionDigits());
1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1052f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Sets the minimum number of digits before the decimal point.
1053f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * If the value passed is negative then it is replaced by 0.
1054f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Regardless of this setting, no more than 309 digits will be used.
1055f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1056f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * @param value the minimum number of integer digits.
1057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMinimumIntegerDigits(int value) {
1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.setMinimumIntegerDigits(value);
1061f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setMinimumIntegerDigits(getMinimumIntegerDigits());
1062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the multiplier which is applied to the number before formatting or
1066adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * after parsing.
1067f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the multiplier.
1070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMultiplier(int value) {
1072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setMultiplier(value);
1073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1075adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the prefix which is formatted or parsed before a negative number.
1077f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the negative prefix.
1080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setNegativePrefix(String value) {
1082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setNegativePrefix(value);
1083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1085adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1086adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the suffix which is formatted or parsed after a negative number.
1087f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1089adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the negative suffix.
1090adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setNegativeSuffix(String value) {
1092adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setNegativeSuffix(value);
1093adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the prefix which is formatted or parsed before a positive number.
1097f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1098adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1099adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the positive prefix.
1100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setPositivePrefix(String value) {
1102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setPositivePrefix(value);
1103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the suffix which is formatted or parsed after a positive number.
1107f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the positive suffix.
1110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setPositiveSuffix(String value) {
1112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setPositiveSuffix(value);
1113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the behaviour of the parse method. If set to {@code true} then all
1117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the returned objects will be of type {@code BigDecimal}.
1118f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
1120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} if all the returned objects should be of type
1121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code BigDecimal}; {@code false} otherwise.
1122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setParseBigDecimal(boolean newValue) {
1124947eeb80f985827209c9500851e288504d58ec2eclaireho        dform.setParseBigDecimal(newValue);
1125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the pattern of this decimal format using localized pattern
1129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * characters.
1130f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the localized pattern.
1132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toLocalizedPattern() {
1134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.toLocalizedPattern();
1135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the pattern of this decimal format using non-localized pattern
1139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * characters.
1140f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the non-localized pattern.
1142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toPattern() {
1144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.toPattern();
1145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // the fields list to be serialized
1148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final ObjectStreamField[] serialPersistentFields = {
1149f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("positivePrefix", String.class),
1150f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("positiveSuffix", String.class),
1151f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("negativePrefix", String.class),
1152f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("negativeSuffix", String.class),
1153f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("posPrefixPattern", String.class),
1154f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("posSuffixPattern", String.class),
1155f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("negPrefixPattern", String.class),
1156f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("negSuffixPattern", String.class),
1157f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("multiplier", int.class),
1158f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("groupingSize", byte.class),
1159f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("groupingUsed", boolean.class),
1160f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("decimalSeparatorAlwaysShown", boolean.class),
1161f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("parseBigDecimal", boolean.class),
1162f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("roundingMode", RoundingMode.class),
1163f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("symbols", DecimalFormatSymbols.class),
1164f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("useExponentialNotation", boolean.class),
1165f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("minExponentDigits", byte.class),
1166f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("maximumIntegerDigits", int.class),
1167f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("minimumIntegerDigits", int.class),
1168f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("maximumFractionDigits", int.class),
1169f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("minimumFractionDigits", int.class),
1170f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            new ObjectStreamField("serialVersionOnStream", int.class), };
1171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Writes serialized fields following serialized forms specified by Java
1174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specification.
1175f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param stream
1177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the output stream to write serialized bytes
1178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
1179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if some I/O error occurs
1180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassNotFoundException
1181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
11829b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson    @SuppressWarnings("nls")
1183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void writeObject(ObjectOutputStream stream) throws IOException,
1184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ClassNotFoundException {
1185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectOutputStream.PutField fields = stream.putFields();
11869b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("positivePrefix", dform.getPositivePrefix());
11879b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("positiveSuffix", dform.getPositiveSuffix());
11889b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("negativePrefix", dform.getNegativePrefix());
11899b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("negativeSuffix", dform.getNegativeSuffix());
1190186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        fields.put("posPrefixPattern", (String) null);
1191186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        fields.put("posSuffixPattern", (String) null);
1192186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        fields.put("negPrefixPattern", (String) null);
1193186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        fields.put("negSuffixPattern", (String) null);
11949b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("multiplier", dform.getMultiplier());
11959b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("groupingSize", (byte) dform.getGroupingSize());
1196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-added
11979b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("groupingUsed", dform.isGroupingUsed());
1198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-added
11999b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("decimalSeparatorAlwaysShown", dform
1200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .isDecimalSeparatorAlwaysShown());
1201947eeb80f985827209c9500851e288504d58ec2eclaireho        fields.put("parseBigDecimal", dform.isParseBigDecimal());
120242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        fields.put("roundingMode", roundingMode);
12039b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("symbols", symbols);
1204f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        fields.put("useExponentialNotation", false);
1205f8ba29b25f7fc2ef93ab39a8ac436c94d55b3984Elliott Hughes        fields.put("minExponentDigits", (byte) 0);
12069b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("maximumIntegerDigits", dform.getMaximumIntegerDigits());
12079b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("minimumIntegerDigits", dform.getMinimumIntegerDigits());
12089b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("maximumFractionDigits", dform.getMaximumFractionDigits());
12099b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("minimumFractionDigits", dform.getMinimumFractionDigits());
121042db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        fields.put("serialVersionOnStream", 4);
1211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        stream.writeFields();
1212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads serialized fields following serialized forms specified by Java
1216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specification.
1217f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param stream
1219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the input stream to read serialized bytes
1220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
1221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if some I/O error occurs
1222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassNotFoundException
1223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if some class of serialized objects or fields cannot be found
1224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
12259b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson    @SuppressWarnings("nls")
122642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
122764e410fa8b4771a8749f899134b4e08c2fd49e3cElliott Hughes        // BEGIN android-changed
1228186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        ObjectInputStream.GetField fields = stream.readFields();
1229186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        this.symbols = (DecimalFormatSymbols) fields.get("symbols", null);
1230186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes
12315d593ea1361bd7c5ef3353b66d63ac64e95d9d41Elliott Hughes        initNative("");
1232186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setPositivePrefix((String) fields.get("positivePrefix", ""));
1233186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setPositiveSuffix((String) fields.get("positiveSuffix", ""));
1234186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setNegativePrefix((String) fields.get("negativePrefix", "-"));
1235186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setNegativeSuffix((String) fields.get("negativeSuffix", ""));
1236186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setMultiplier(fields.get("multiplier", 1));
1237186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setGroupingSize(fields.get("groupingSize", (byte) 3));
1238186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setGroupingUsed(fields.get("groupingUsed", true));
1239186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setDecimalSeparatorAlwaysShown(fields.get("decimalSeparatorAlwaysShown", false));
1240186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes
124142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        setRoundingMode((RoundingMode) fields.get("roundingMode", RoundingMode.HALF_EVEN));
124242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes
1243186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        final int maximumIntegerDigits = fields.get("maximumIntegerDigits", 309);
1244186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        final int minimumIntegerDigits = fields.get("minimumIntegerDigits", 309);
1245186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        final int maximumFractionDigits = fields.get("maximumFractionDigits", 340);
1246186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        final int minimumFractionDigits = fields.get("minimumFractionDigits", 340);
1247f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // BEGIN android-changed: tell ICU what we want, then ask it what we can have, and then
1248f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // set that in our Java object. This isn't RI-compatible, but then very little of our
1249f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // behavior in this area is, and it's not obvious how we can second-guess ICU (or tell
1250f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // it to just do exactly what we ask). We only need to do this with maximumIntegerDigits
1251f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // because ICU doesn't seem to have its own ideas about the other options.
1252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setMaximumIntegerDigits(maximumIntegerDigits);
1253f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        super.setMaximumIntegerDigits(dform.getMaximumIntegerDigits());
1254186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes
1255186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        setMinimumIntegerDigits(minimumIntegerDigits);
1256f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        setMinimumFractionDigits(minimumFractionDigits);
1257f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        setMaximumFractionDigits(maximumFractionDigits);
1258186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        setParseBigDecimal(fields.get("parseBigDecimal", false));
1259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1260186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        if (fields.get("serialVersionOnStream", 0) < 3) {
12619b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson            setMaximumIntegerDigits(super.getMaximumIntegerDigits());
1262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setMinimumIntegerDigits(super.getMinimumIntegerDigits());
1263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setMaximumFractionDigits(super.getMaximumFractionDigits());
1264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setMinimumFractionDigits(super.getMinimumFractionDigits());
1265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1266186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        // END android-changed
1267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
126842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes
126942db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    /**
127042db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * Returns the {@code RoundingMode} used by this {@code NumberFormat}.
127142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * @since 1.6
127242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     */
127342db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    public RoundingMode getRoundingMode() {
127442db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        return roundingMode;
127542db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    }
127642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes
127742db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    /**
127842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * Sets the {@code RoundingMode} used by this {@code NumberFormat}.
127942db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * @since 1.6
128042db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     */
128142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    public void setRoundingMode(RoundingMode roundingMode) {
128242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        if (roundingMode == null) {
128342db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes            throw new NullPointerException();
128442db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        }
128542db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        this.roundingMode = roundingMode;
128642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        if (roundingMode != RoundingMode.UNNECESSARY) { // ICU4C doesn't support UNNECESSARY.
128742db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes            double roundingIncrement = 1.0 / Math.pow(10, Math.max(0, getMaximumFractionDigits()));
128842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes            dform.setRoundingMode(roundingMode, roundingIncrement);
128942db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        }
129042db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    }
1291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
1292