DecimalFormat.java revision d43b9ef11a1095967a3396b246639b563e1a4128
1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.text;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectInputStream;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectStreamField;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigDecimal;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigInteger;
2642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughesimport java.math.RoundingMode;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Currency;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Locale;
29162b0775772fa66b7eb634760a8159a60c1ddceaElliott Hughesimport libcore.icu.LocaleData;
30c27a366a89e470690e99374b15270e7b9169ade1Elliott Hughesimport libcore.icu.NativeDecimalFormat;
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">
1661d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson * <td>{@code \u2030} ({@code \u005Cu2030})</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">
1721d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson * <td>{@code \u00A4} ({@code \u005Cu00A4})</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
3221d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson * {@code \u005cuFFFD}. 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>
3261d58625189328f29c10fa98d52512ee6cf8cc641Ben Dodson * Infinity is represented as a single character, typically {@code \u005cu221E},
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 {
507e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom            try {
508e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom                dform.close();
509e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom            } finally {
510e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom                super.finalize();
511e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom            }
5123e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        }
5133e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes    };
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
51542db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    private transient RoundingMode roundingMode = RoundingMode.HALF_EVEN;
51642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DecimalFormat} for formatting and parsing numbers
5193106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * for the user's default locale.
5203106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DecimalFormat() {
5239b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        Locale locale = Locale.getDefault();
524f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        this.symbols = new DecimalFormatSymbols(locale);
525757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes        initNative(LocaleData.get(locale).numberPattern);
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DecimalFormat} using the specified non-localized
5303106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * pattern and the {@code DecimalFormatSymbols} for the user's default Locale.
5313106a99ccbe2e2a25bb66266d0ee42d98dd18099Elliott Hughes     * See "<a href="../util/Locale.html#default_locale">Be wary of the default locale</a>".
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pattern
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the non-localized pattern.
5349b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
5359b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the pattern cannot be parsed.
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DecimalFormat(String pattern) {
538f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        this(pattern, Locale.getDefault());
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DecimalFormat} using the specified non-localized
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * pattern and {@code DecimalFormatSymbols}.
544f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pattern
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the non-localized pattern.
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the DecimalFormatSymbols.
5499b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
5509b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the pattern cannot be parsed.
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DecimalFormat(String pattern, DecimalFormatSymbols value) {
553f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        this.symbols = (DecimalFormatSymbols) value.clone();
5545d593ea1361bd7c5ef3353b66d63ac64e95d9d41Elliott Hughes        initNative(pattern);
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
557757a7942eed2b0aa457f8517a0259d2ac82c5b18Elliott Hughes    // Used by NumberFormat.getInstance because cloning DecimalFormatSymbols is slow.
558a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes    DecimalFormat(String pattern, Locale locale) {
559a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        this.symbols = new DecimalFormatSymbols(locale);
5605d593ea1361bd7c5ef3353b66d63ac64e95d9d41Elliott Hughes        initNative(pattern);
561f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    }
562a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes
5635d593ea1361bd7c5ef3353b66d63ac64e95d9d41Elliott Hughes    private void initNative(String pattern) {
564f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        try {
5655d593ea1361bd7c5ef3353b66d63ac64e95d9d41Elliott Hughes            this.dform = new NativeDecimalFormat(pattern, symbols);
566f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        } catch (IllegalArgumentException ex) {
567f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            throw new IllegalArgumentException(pattern);
568f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        }
569a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        super.setMaximumFractionDigits(dform.getMaximumFractionDigits());
570a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        super.setMaximumIntegerDigits(dform.getMaximumIntegerDigits());
571a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        super.setMinimumFractionDigits(dform.getMinimumFractionDigits());
572a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes        super.setMinimumIntegerDigits(dform.getMinimumIntegerDigits());
573a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes    }
574a05602fd81ff398fd6381390a0886608fec5f95cElliott Hughes
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Changes the pattern of this decimal format to the specified pattern which
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * uses localized pattern characters.
578f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pattern
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the localized pattern.
5819b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
5829b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the pattern cannot be parsed.
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void applyLocalizedPattern(String pattern) {
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.applyLocalizedPattern(pattern);
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Changes the pattern of this decimal format to the specified pattern which
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * uses non-localized pattern characters.
591f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pattern
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the non-localized pattern.
5949b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     * @throws IllegalArgumentException
5959b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *            if the pattern cannot be parsed.
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void applyPattern(String pattern) {
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.applyPattern(pattern);
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code DecimalFormat} with the same pattern and
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * properties as this decimal format.
604f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a shallow copy of this decimal format.
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.Cloneable
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DecimalFormat clone = (DecimalFormat) super.clone();
611820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes        clone.dform = (NativeDecimalFormat) dform.clone();
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        clone.symbols = (DecimalFormatSymbols) symbols.clone();
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return clone;
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the specified object to this decimal format and indicates if
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * they are equal. In order to be equal, {@code object} must be an instance
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of {@code DecimalFormat} with the same pattern and properties.
620f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare with this object.
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this decimal
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         format; {@code false} otherwise.
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #hashCode
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object object) {
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this == object) {
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(object instanceof DecimalFormat)) {
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
635f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        DecimalFormat other = (DecimalFormat) object;
636f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        return (this.dform == null ? other.dform == null : this.dform.equals(other.dform)) &&
637f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                getDecimalFormatSymbols().equals(other.getDecimalFormatSymbols());
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Formats the specified object using the rules of this decimal format and
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returns an {@code AttributedCharacterIterator} with the formatted number
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and attributes.
644f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to format.
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an AttributedCharacterIterator with the formatted number and
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         attributes.
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code object} cannot be formatted by this format.
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code object} is {@code null}.
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public AttributedCharacterIterator formatToCharacterIterator(Object object) {
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (object == null) {
657d43b9ef11a1095967a3396b246639b563e1a4128Kenny Root            throw new NullPointerException("object == null");
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.formatToCharacterIterator(object);
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
6623e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes    private void checkBufferAndFieldPosition(StringBuffer buffer, FieldPosition position) {
6633e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        if (buffer == null) {
6643e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes            throw new NullPointerException("buffer == null");
6653e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        }
6663e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        if (position == null) {
6673e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes            throw new NullPointerException("position == null");
6683e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        }
6693e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes    }
6703e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
672d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes    public StringBuffer format(double value, StringBuffer buffer, FieldPosition position) {
6733e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        checkBufferAndFieldPosition(buffer, position);
67442db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        // All float/double/Float/Double formatting ends up here...
67542db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        if (roundingMode == RoundingMode.UNNECESSARY) {
67642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes            // ICU4C doesn't support this rounding mode, so we have to fake it.
67742db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes            try {
67842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                setRoundingMode(RoundingMode.UP);
67942db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                String upResult = format(value, new StringBuffer(), new FieldPosition(0)).toString();
68042db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                setRoundingMode(RoundingMode.DOWN);
68142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                String downResult = format(value, new StringBuffer(), new FieldPosition(0)).toString();
68242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                if (!upResult.equals(downResult)) {
68342db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                    throw new ArithmeticException("rounding mode UNNECESSARY but rounding required");
68442db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                }
68542db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes            } finally {
68642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes                setRoundingMode(RoundingMode.UNNECESSARY);
68742db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes            }
68842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        }
6893e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        buffer.append(dform.formatDouble(value, position));
6903e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        return buffer;
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
694d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes    public StringBuffer format(long value, StringBuffer buffer, FieldPosition position) {
6953e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        checkBufferAndFieldPosition(buffer, position);
6963e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        buffer.append(dform.formatLong(value, position));
6973e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        return buffer;
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
7013e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes    public final StringBuffer format(Object number, StringBuffer buffer, FieldPosition position) {
7023e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        checkBufferAndFieldPosition(buffer, position);
703d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        if (number instanceof BigInteger) {
704d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes            BigInteger bigInteger = (BigInteger) number;
70546cb23aaaba1b0553d02d32713abad97bd4b0428Elliott Hughes            char[] chars = (bigInteger.bitLength() < 64)
7063e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes                    ? dform.formatLong(bigInteger.longValue(), position)
7073e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes                    : dform.formatBigInteger(bigInteger, position);
70846cb23aaaba1b0553d02d32713abad97bd4b0428Elliott Hughes            buffer.append(chars);
7093e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes            return buffer;
710d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        } else if (number instanceof BigDecimal) {
7113e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes            buffer.append(dform.formatBigDecimal((BigDecimal) number, position));
7123e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes            return buffer;
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
7143e6f49bbb915b880afe104ec784c66bda55da450Elliott Hughes        return super.format(number, buffer, position);
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code DecimalFormatSymbols} used by this decimal format.
719f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a copy of the {@code DecimalFormatSymbols} used by this decimal
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         format.
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DecimalFormatSymbols getDecimalFormatSymbols() {
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (DecimalFormatSymbols) symbols.clone();
725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the currency used by this decimal format.
729f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the currency used by this decimal format.
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see DecimalFormatSymbols#getCurrency()
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Currency getCurrency() {
7355d593ea1361bd7c5ef3353b66d63ac64e95d9d41Elliott Hughes        return symbols.getCurrency();
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the number of digits grouped together by the grouping separator.
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This only allows to get the primary grouping size. There is no API to get
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the secondary grouping size.
7429b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of digits grouped together.
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getGroupingSize() {
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getGroupingSize();
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the multiplier which is applied to the number before formatting
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or after parsing.
752f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the multiplier.
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMultiplier() {
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getMultiplier();
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the prefix which is formatted or parsed before a negative number.
761f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the negative prefix.
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getNegativePrefix() {
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getNegativePrefix();
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the suffix which is formatted or parsed after a negative number.
770f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the negative suffix.
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getNegativeSuffix() {
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getNegativeSuffix();
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the prefix which is formatted or parsed before a positive number.
779f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the positive prefix.
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getPositivePrefix() {
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getPositivePrefix();
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the suffix which is formatted or parsed after a positive number.
788f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the positive suffix.
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getPositiveSuffix() {
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.getPositiveSuffix();
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.hashCode();
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the decimal separator is shown when there are no
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * fractional digits.
803f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the decimal separator should always be formatted;
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} otherwise.
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isDecimalSeparatorAlwaysShown() {
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.isDecimalSeparatorAlwaysShown();
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This value indicates whether the return object of the parse operation is
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of type {@code BigDecimal}. This value defaults to {@code false}.
814f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if parse always returns {@code BigDecimals},
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} if the type of the result is {@code Long} or
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Double}.
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isParseBigDecimal() {
820947eeb80f985827209c9500851e288504d58ec2eclaireho        return dform.isParseBigDecimal();
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the flag that indicates whether numbers will be parsed as integers.
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * When this decimal format is used for parsing and this value is set to
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code true}, then the resulting numbers will be of type
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code java.lang.Integer}. Special cases are NaN, positive and negative
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * infinity, which are still returned as {@code java.lang.Double}.
829f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
8309b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} that the resulting numbers of parse operations
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            will be of type {@code java.lang.Integer} except for the
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            special cases described above.
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setParseIntegerOnly(boolean value) {
838820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes        // In this implementation, NativeDecimalFormat is wrapped to
8399b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        // fulfill most of the format and parse feature. And this method is
840820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes        // delegated to the wrapped instance of NativeDecimalFormat.
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setParseIntegerOnly(value);
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether parsing with this decimal format will only
846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * return numbers of type {@code java.lang.Integer}.
847f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this {@code DecimalFormat}'s parse method only
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         returns {@code java.lang.Integer}; {@code false} otherwise.
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isParseIntegerOnly() {
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.isParseIntegerOnly();
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final Double NEGATIVE_ZERO_DOUBLE = new Double(-0.0);
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses a {@code Long} or {@code Double} from the specified string
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * starting at the index specified by {@code position}. If the string is
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * successfully parsed then the index of the {@code ParsePosition} is
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * updated to the index following the parsed text. On error, the index is
863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * unchanged and the error index of {@code ParsePosition} is set to the
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * index where the error occurred.
865f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string to parse.
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param position
869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            input/output parameter, specifies the start index in
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code string} from where to start parsing. If parsing is
871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            successful, it is updated with the index following the parsed
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            text; on error, the index is unchanged and the error index is
873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            set to the index where the error occurred.
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Long} or {@code Double} resulting from the parse or
875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code null} if there is an error. The result will be a
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Long} if the parsed number is an integer in the range of a
877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         long, otherwise the result is a {@code Double}. If
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code isParseBigDecimal} is {@code true} then it returns the
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         result as a {@code BigDecimal}.
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Number parse(String string, ParsePosition position) {
883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Number number = dform.parse(string, position);
884b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes        if (number == null) {
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this.isParseBigDecimal()) {
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (number instanceof Long) {
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return new BigDecimal(number.longValue());
890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((number instanceof Double) && !((Double) number).isInfinite()
892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    && !((Double) number).isNaN()) {
893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return new BigDecimal(number.toString());
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (number instanceof BigInteger) {
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 BigDecimal) || (number instanceof BigInteger)) {
902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new Double(number.doubleValue());
903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this.isParseIntegerOnly() && number.equals(NEGATIVE_ZERO_DOUBLE)) {
905fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes            return Long.valueOf(0);
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return number;
908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the {@code DecimalFormatSymbols} used by this decimal format.
913f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code DecimalFormatSymbols} to set.
916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDecimalFormatSymbols(DecimalFormatSymbols value) {
918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (value != null) {
919fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes            // The Java object is canonical, and we copy down to native code.
920f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            this.symbols = (DecimalFormatSymbols) value.clone();
921f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            dform.setDecimalFormatSymbols(this.symbols);
922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the currency used by this decimal format. The min and max fraction
927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * digits remain the same.
928f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param currency
930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the currency this {@code DecimalFormat} should use.
931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see DecimalFormatSymbols#setCurrency(Currency)
932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setCurrency(Currency currency) {
935f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setCurrency(Currency.getInstance(currency.getCurrencyCode()));
936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        symbols.setCurrency(currency);
937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets whether the decimal separator is shown when there are no fractional
941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * digits.
942f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} if the decimal separator should always be
945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            formatted; {@code false} otherwise.
946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDecimalSeparatorAlwaysShown(boolean value) {
948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setDecimalSeparatorAlwaysShown(value);
949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the number of digits grouped together by the grouping separator.
953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This only allows to set the primary grouping size; the secondary grouping
954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * size can only be set with a pattern.
9559b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of digits grouped together.
958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setGroupingSize(int value) {
960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setGroupingSize(value);
961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets whether or not grouping will be used in this format. Grouping
965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * affects both parsing and formatting.
966f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} if grouping is used; {@code false} otherwise.
969adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setGroupingUsed(boolean value) {
972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setGroupingUsed(value);
973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether grouping will be used in this format.
977f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if grouping is used; {@code false} otherwise.
979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isGroupingUsed() {
982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.isGroupingUsed();
983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
986f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Sets the maximum number of digits after the decimal point.
987f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * If the value passed is negative then it is replaced by 0.
988f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Regardless of this setting, no more than 340 digits will be used.
989f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
990f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * @param value the maximum number of fraction digits.
991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMaximumFractionDigits(int value) {
994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.setMaximumFractionDigits(value);
995f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setMaximumFractionDigits(getMaximumFractionDigits());
99642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        // Changing the maximum fraction digits needs to update ICU4C's rounding configuration.
99742db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        setRoundingMode(roundingMode);
998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1001f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Sets the maximum number of digits before the decimal point.
1002f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * If the value passed is negative then it is replaced by 0.
1003f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Regardless of this setting, no more than 309 digits will be used.
1004f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1005f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * @param value the maximum number of integer digits.
1006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMaximumIntegerDigits(int value) {
1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.setMaximumIntegerDigits(value);
1010f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setMaximumIntegerDigits(getMaximumIntegerDigits());
1011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1014f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Sets the minimum number of digits after the decimal point.
1015f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * If the value passed is negative then it is replaced by 0.
1016f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Regardless of this setting, no more than 340 digits will be used.
1017f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1018f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * @param value the minimum number of fraction digits.
1019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMinimumFractionDigits(int value) {
1022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.setMinimumFractionDigits(value);
1023f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setMinimumFractionDigits(getMinimumFractionDigits());
1024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1027f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Sets the minimum number of digits before the decimal point.
1028f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * If the value passed is negative then it is replaced by 0.
1029f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Regardless of this setting, no more than 309 digits will be used.
1030f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1031f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * @param value the minimum number of integer digits.
1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMinimumIntegerDigits(int value) {
1035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.setMinimumIntegerDigits(value);
1036f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        dform.setMinimumIntegerDigits(getMinimumIntegerDigits());
1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the multiplier which is applied to the number before formatting or
1041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * after parsing.
1042f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the multiplier.
1045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMultiplier(int value) {
1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setMultiplier(value);
1048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the prefix which is formatted or parsed before a negative number.
1052f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the negative prefix.
1055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setNegativePrefix(String value) {
1057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setNegativePrefix(value);
1058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the suffix which is formatted or parsed after a negative number.
1062f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the negative suffix.
1065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1066adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setNegativeSuffix(String value) {
1067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setNegativeSuffix(value);
1068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the prefix which is formatted or parsed before a positive number.
1072f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the positive prefix.
1075adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setPositivePrefix(String value) {
1077adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setPositivePrefix(value);
1078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the suffix which is formatted or parsed after a positive number.
1082f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the positive suffix.
1085adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1086adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setPositiveSuffix(String value) {
1087adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setPositiveSuffix(value);
1088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1089adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1090adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
10915501a3d4b3d7657c183ed5446fe67fa011fbf70bElliott Hughes     * Sets the behavior of the parse method. If set to {@code true} then all
1092adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the returned objects will be of type {@code BigDecimal}.
1093f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
1095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code true} if all the returned objects should be of type
1096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code BigDecimal}; {@code false} otherwise.
1097adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1098adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setParseBigDecimal(boolean newValue) {
1099947eeb80f985827209c9500851e288504d58ec2eclaireho        dform.setParseBigDecimal(newValue);
1100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the pattern of this decimal format using localized pattern
1104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * characters.
1105f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the localized pattern.
1107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toLocalizedPattern() {
1109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.toLocalizedPattern();
1110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the pattern of this decimal format using non-localized pattern
1114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * characters.
1115f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the non-localized pattern.
1117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toPattern() {
1119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dform.toPattern();
1120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // the fields list to be serialized
1123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final ObjectStreamField[] serialPersistentFields = {
112428eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("positivePrefix", String.class),
112528eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("positiveSuffix", String.class),
112628eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("negativePrefix", String.class),
112728eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("negativeSuffix", String.class),
112828eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("posPrefixPattern", String.class),
112928eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("posSuffixPattern", String.class),
113028eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("negPrefixPattern", String.class),
113128eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("negSuffixPattern", String.class),
113228eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("multiplier", int.class),
113328eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("groupingSize", byte.class),
113428eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("groupingUsed", boolean.class),
113528eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("decimalSeparatorAlwaysShown", boolean.class),
113628eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("parseBigDecimal", boolean.class),
113728eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("roundingMode", RoundingMode.class),
113828eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("symbols", DecimalFormatSymbols.class),
113928eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("useExponentialNotation", boolean.class),
114028eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("minExponentDigits", byte.class),
114128eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("maximumIntegerDigits", int.class),
114228eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("minimumIntegerDigits", int.class),
114328eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("maximumFractionDigits", int.class),
114428eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("minimumFractionDigits", int.class),
114528eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes        new ObjectStreamField("serialVersionOnStream", int.class),
114628eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes    };
1147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Writes serialized fields following serialized forms specified by Java
1150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specification.
1151f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param stream
1153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the output stream to write serialized bytes
1154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
1155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if some I/O error occurs
1156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassNotFoundException
1157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
11581c4b8eb0aebfe7f99c10fb1d01716946e8e74ad7Elliott Hughes    private void writeObject(ObjectOutputStream stream) throws IOException, ClassNotFoundException {
1159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectOutputStream.PutField fields = stream.putFields();
11609b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("positivePrefix", dform.getPositivePrefix());
11619b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("positiveSuffix", dform.getPositiveSuffix());
11629b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("negativePrefix", dform.getNegativePrefix());
11639b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("negativeSuffix", dform.getNegativeSuffix());
1164186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        fields.put("posPrefixPattern", (String) null);
1165186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        fields.put("posSuffixPattern", (String) null);
1166186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        fields.put("negPrefixPattern", (String) null);
1167186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        fields.put("negSuffixPattern", (String) null);
11689b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("multiplier", dform.getMultiplier());
11699b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("groupingSize", (byte) dform.getGroupingSize());
11709b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("groupingUsed", dform.isGroupingUsed());
1171fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        fields.put("decimalSeparatorAlwaysShown", dform.isDecimalSeparatorAlwaysShown());
1172947eeb80f985827209c9500851e288504d58ec2eclaireho        fields.put("parseBigDecimal", dform.isParseBigDecimal());
117342db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        fields.put("roundingMode", roundingMode);
11749b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("symbols", symbols);
1175f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        fields.put("useExponentialNotation", false);
1176f8ba29b25f7fc2ef93ab39a8ac436c94d55b3984Elliott Hughes        fields.put("minExponentDigits", (byte) 0);
11779b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("maximumIntegerDigits", dform.getMaximumIntegerDigits());
11789b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("minimumIntegerDigits", dform.getMinimumIntegerDigits());
11799b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("maximumFractionDigits", dform.getMaximumFractionDigits());
11809b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson        fields.put("minimumFractionDigits", dform.getMinimumFractionDigits());
118142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        fields.put("serialVersionOnStream", 4);
1182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        stream.writeFields();
1183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads serialized fields following serialized forms specified by Java
1187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specification.
1188f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
1189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param stream
1190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the input stream to read serialized bytes
1191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
1192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if some I/O error occurs
1193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassNotFoundException
1194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if some class of serialized objects or fields cannot be found
1195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
119642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
1197186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        ObjectInputStream.GetField fields = stream.readFields();
1198186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        this.symbols = (DecimalFormatSymbols) fields.get("symbols", null);
1199186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes
12005d593ea1361bd7c5ef3353b66d63ac64e95d9d41Elliott Hughes        initNative("");
1201186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setPositivePrefix((String) fields.get("positivePrefix", ""));
1202186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setPositiveSuffix((String) fields.get("positiveSuffix", ""));
1203186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setNegativePrefix((String) fields.get("negativePrefix", "-"));
1204186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setNegativeSuffix((String) fields.get("negativeSuffix", ""));
1205186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setMultiplier(fields.get("multiplier", 1));
1206186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setGroupingSize(fields.get("groupingSize", (byte) 3));
1207186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setGroupingUsed(fields.get("groupingUsed", true));
1208186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        dform.setDecimalSeparatorAlwaysShown(fields.get("decimalSeparatorAlwaysShown", false));
1209186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes
121042db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        setRoundingMode((RoundingMode) fields.get("roundingMode", RoundingMode.HALF_EVEN));
121142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes
1212186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        final int maximumIntegerDigits = fields.get("maximumIntegerDigits", 309);
1213186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        final int minimumIntegerDigits = fields.get("minimumIntegerDigits", 309);
1214186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        final int maximumFractionDigits = fields.get("maximumFractionDigits", 340);
1215186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        final int minimumFractionDigits = fields.get("minimumFractionDigits", 340);
1216fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        // Tell ICU what we want, then ask it what we can have, and then
1217f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // set that in our Java object. This isn't RI-compatible, but then very little of our
1218f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // behavior in this area is, and it's not obvious how we can second-guess ICU (or tell
1219f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // it to just do exactly what we ask). We only need to do this with maximumIntegerDigits
1220f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        // because ICU doesn't seem to have its own ideas about the other options.
1221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        dform.setMaximumIntegerDigits(maximumIntegerDigits);
1222f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        super.setMaximumIntegerDigits(dform.getMaximumIntegerDigits());
1223186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes
1224186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        setMinimumIntegerDigits(minimumIntegerDigits);
1225f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        setMinimumFractionDigits(minimumFractionDigits);
1226f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        setMaximumFractionDigits(maximumFractionDigits);
1227186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        setParseBigDecimal(fields.get("parseBigDecimal", false));
1228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1229186ae3b4b3ccad7baad8a33d59952263427ddda5Elliott Hughes        if (fields.get("serialVersionOnStream", 0) < 3) {
12309b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson            setMaximumIntegerDigits(super.getMaximumIntegerDigits());
1231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setMinimumIntegerDigits(super.getMinimumIntegerDigits());
1232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setMaximumFractionDigits(super.getMaximumFractionDigits());
1233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setMinimumFractionDigits(super.getMinimumFractionDigits());
1234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
123642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes
123742db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    /**
123842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * Returns the {@code RoundingMode} used by this {@code NumberFormat}.
123942db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * @since 1.6
124042db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     */
124142db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    public RoundingMode getRoundingMode() {
124242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        return roundingMode;
124342db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    }
124442db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes
124542db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    /**
124642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * Sets the {@code RoundingMode} used by this {@code NumberFormat}.
124742db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     * @since 1.6
124842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes     */
124942db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    public void setRoundingMode(RoundingMode roundingMode) {
125042db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        if (roundingMode == null) {
1251d43b9ef11a1095967a3396b246639b563e1a4128Kenny Root            throw new NullPointerException("roundingMode == null");
125242db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        }
125342db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        this.roundingMode = roundingMode;
125442db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        if (roundingMode != RoundingMode.UNNECESSARY) { // ICU4C doesn't support UNNECESSARY.
125542db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes            double roundingIncrement = 1.0 / Math.pow(10, Math.max(0, getMaximumFractionDigits()));
125642db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes            dform.setRoundingMode(roundingMode, roundingIncrement);
125742db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes        }
125842db7d138547e3bba75cf6ed02b6a319e30004aeElliott Hughes    }
1259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
1260