NativeDecimalFormat.java revision d5344fec27edfcf7acf9f703c9d7dff14a832943
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License.
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage com.ibm.icu4jni.text;
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
19f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughesimport com.ibm.icu4jni.util.LocaleData;
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigDecimal;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigInteger;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.text.AttributedCharacterIterator;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.text.AttributedString;
25f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughesimport java.text.DecimalFormatSymbols;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.text.FieldPosition;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.text.Format;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.text.NumberFormat;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.text.ParsePosition;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Currency;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Locale;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughespublic class NativeDecimalFormat {
341efbe3391e92e6188918122a600623090561364fElliott Hughes    /**
351efbe3391e92e6188918122a600623090561364fElliott Hughes     * Constants corresponding to the native type UNumberFormatSymbol, for getSymbol/setSymbol.
361efbe3391e92e6188918122a600623090561364fElliott Hughes     */
37f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_DECIMAL_SEPARATOR_SYMBOL = 0;
38f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_GROUPING_SEPARATOR_SYMBOL = 1;
39f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_PATTERN_SEPARATOR_SYMBOL = 2;
40f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_PERCENT_SYMBOL = 3;
41f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_ZERO_DIGIT_SYMBOL = 4;
42f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_DIGIT_SYMBOL = 5;
43f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_MINUS_SIGN_SYMBOL = 6;
44f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_PLUS_SIGN_SYMBOL = 7;
45f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_CURRENCY_SYMBOL = 8;
46f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_INTL_CURRENCY_SYMBOL = 9;
47f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_MONETARY_SEPARATOR_SYMBOL = 10;
48f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_EXPONENTIAL_SYMBOL = 11;
49f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_PERMILL_SYMBOL = 12;
50f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_PAD_ESCAPE_SYMBOL = 13;
51f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_INFINITY_SYMBOL = 14;
52f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_NAN_SYMBOL = 15;
53f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_SIGNIFICANT_DIGIT_SYMBOL = 16;
54f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_MONETARY_GROUPING_SEPARATOR_SYMBOL = 17;
55f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private static final int UNUM_FORMAT_SYMBOL_COUNT = 18;
56820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes
571efbe3391e92e6188918122a600623090561364fElliott Hughes    /**
581efbe3391e92e6188918122a600623090561364fElliott Hughes     * Constants corresponding to the native type UNumberFormatAttribute, for
591efbe3391e92e6188918122a600623090561364fElliott Hughes     * getAttribute/setAttribute.
601efbe3391e92e6188918122a600623090561364fElliott Hughes     */
611efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_PARSE_INT_ONLY = 0;
621efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_GROUPING_USED = 1;
631efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_DECIMAL_ALWAYS_SHOWN = 2;
641efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_MAX_INTEGER_DIGITS = 3;
651efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_MIN_INTEGER_DIGITS = 4;
661efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_INTEGER_DIGITS = 5;
671efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_MAX_FRACTION_DIGITS = 6;
681efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_MIN_FRACTION_DIGITS = 7;
691efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_FRACTION_DIGITS = 8;
701efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_MULTIPLIER = 9;
711efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_GROUPING_SIZE = 10;
721efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_ROUNDING_MODE = 11;
731efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_ROUNDING_INCREMENT = 12;
741efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_FORMAT_WIDTH = 13;
751efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_PADDING_POSITION = 14;
761efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_SECONDARY_GROUPING_SIZE = 15;
771efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_SIGNIFICANT_DIGITS_USED = 16;
781efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_MIN_SIGNIFICANT_DIGITS = 17;
791efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_MAX_SIGNIFICANT_DIGITS = 18;
801efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_LENIENT_PARSE = 19;
81820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes
821efbe3391e92e6188918122a600623090561364fElliott Hughes    /**
831efbe3391e92e6188918122a600623090561364fElliott Hughes     * Constants corresponding to the native type UNumberFormatTextAttribute, for
841efbe3391e92e6188918122a600623090561364fElliott Hughes     * getTextAttribute/setTextAttribute.
851efbe3391e92e6188918122a600623090561364fElliott Hughes     */
861efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_POSITIVE_PREFIX = 0;
871efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_POSITIVE_SUFFIX = 1;
881efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_NEGATIVE_PREFIX = 2;
891efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_NEGATIVE_SUFFIX = 3;
901efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_PADDING_CHARACTER = 4;
911efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_CURRENCY_CODE = 5;
921efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_DEFAULT_RULESET = 6;
931efbe3391e92e6188918122a600623090561364fElliott Hughes    private static final int UNUM_PUBLIC_RULESETS = 7;
94f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes
951efbe3391e92e6188918122a600623090561364fElliott Hughes    /**
961efbe3391e92e6188918122a600623090561364fElliott Hughes     * The address of the ICU DecimalFormat* on the native heap.
971efbe3391e92e6188918122a600623090561364fElliott Hughes     */
98f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    private final int addr;
99f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes
1001efbe3391e92e6188918122a600623090561364fElliott Hughes    /**
1011efbe3391e92e6188918122a600623090561364fElliott Hughes     * The last pattern we gave to ICU, so we can make repeated applications cheap.
1021efbe3391e92e6188918122a600623090561364fElliott Hughes     * This helps in cases like String.format("%.2f,%.2f\n", x, y) where the DecimalFormat is
1031efbe3391e92e6188918122a600623090561364fElliott Hughes     * reused.
104820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes     */
1051efbe3391e92e6188918122a600623090561364fElliott Hughes    private String lastPattern;
1061efbe3391e92e6188918122a600623090561364fElliott Hughes
107820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes    // TODO: store all these in DecimalFormat instead!
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean negPrefNull;
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean negSuffNull;
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean posPrefNull;
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean posSuffNull;
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1131bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson    /**
1141bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson     * Cache the BigDecimal form of the multiplier. This is null until we've
115f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * formatted a BigDecimal (with a multiplier that is not 1), or the user has
1161bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson     * explicitly called {@link #setMultiplier(int)} with any multiplier.
1171bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson     */
1181efbe3391e92e6188918122a600623090561364fElliott Hughes    private BigDecimal multiplierBigDecimal = null;
1191bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson
120820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes    public NativeDecimalFormat(String pattern, Locale locale, DecimalFormatSymbols symbols) {
121d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes        this.addr = openDecimalFormat(pattern);
1221efbe3391e92e6188918122a600623090561364fElliott Hughes        this.lastPattern = pattern;
123f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        setDecimalFormatSymbols(symbols);
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
126f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    // Used to implement clone.
127820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes    private NativeDecimalFormat(NativeDecimalFormat other) {
1281efbe3391e92e6188918122a600623090561364fElliott Hughes        this.addr = cloneDecimalFormatImpl(other.addr);
1291efbe3391e92e6188918122a600623090561364fElliott Hughes        this.lastPattern = other.lastPattern;
130f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        this.negPrefNull = other.negPrefNull;
131f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        this.negSuffNull = other.negSuffNull;
132f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        this.posPrefNull = other.posPrefNull;
133f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        this.posSuffNull = other.posSuffNull;
134f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    }
135f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes
136820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes    // TODO: remove this and just have DecimalFormat.hashCode do the right thing itself.
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
139f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        return this.getPositivePrefix().hashCode();
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
144820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes        return new NativeDecimalFormat(this);
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
148f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    protected void finalize() {
1491efbe3391e92e6188918122a600623090561364fElliott Hughes        closeDecimalFormatImpl(this.addr);
150f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    }
151f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes
152f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    /**
153f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * Note: this doesn't check that the underlying native DecimalFormat objects' configured
154f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * native DecimalFormatSymbols objects are equal. It is assumed that the
155820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes     * caller (DecimalFormat) will check the DecimalFormatSymbols objects
156f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * instead, for performance.
157f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     *
158f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     * This is also unreasonably expensive, calling down to JNI multiple times.
159f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     *
160820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes     * TODO: remove this and just have DecimalFormat.equals do the right thing itself.
161f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     */
162f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    @Override
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object object) {
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (object == this) {
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
167820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes        if (!(object instanceof NativeDecimalFormat)) {
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
170820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes        NativeDecimalFormat obj = (NativeDecimalFormat) object;
171f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        if (obj.addr == this.addr) {
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
174f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        return obj.toPattern().equals(this.toPattern()) &&
175f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                obj.isDecimalSeparatorAlwaysShown() == this.isDecimalSeparatorAlwaysShown() &&
176f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                obj.getGroupingSize() == this.getGroupingSize() &&
177f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                obj.getMultiplier() == this.getMultiplier() &&
178f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                obj.getNegativePrefix().equals(this.getNegativePrefix()) &&
179f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                obj.getNegativeSuffix().equals(this.getNegativeSuffix()) &&
180f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                obj.getPositivePrefix().equals(this.getPositivePrefix()) &&
181f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                obj.getPositiveSuffix().equals(this.getPositiveSuffix()) &&
182f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                obj.getMaximumIntegerDigits() == this.getMaximumIntegerDigits() &&
183f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                obj.getMaximumFractionDigits() == this.getMaximumFractionDigits() &&
184f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                obj.getMinimumIntegerDigits() == this.getMinimumIntegerDigits() &&
185f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                obj.getMinimumFractionDigits() == this.getMinimumFractionDigits() &&
186f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                obj.isGroupingUsed() == this.isGroupingUsed() &&
187f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes                obj.getCurrency() == this.getCurrency();
188f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    }
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
190f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes    /**
191d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes     * Copies the DecimalFormatSymbols settings into our native peer in bulk.
192f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes     */
193820dd9b89746b3e3005bd5d23176cde1a69048b7Elliott Hughes    public void setDecimalFormatSymbols(final DecimalFormatSymbols dfs) {
194d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes        setDecimalFormatSymbols(this.addr, dfs.getCurrencySymbol(), dfs.getDecimalSeparator(),
195d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes                dfs.getDigit(), dfs.getGroupingSeparator(), dfs.getInfinity(),
196d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes                dfs.getInternationalCurrencySymbol(), dfs.getMinusSign(),
197d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes                dfs.getMonetaryDecimalSeparator(), dfs.getNaN(), dfs.getPatternSeparator(),
198d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes                dfs.getPercent(), dfs.getPerMill(), dfs.getZeroDigit());
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2011bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson    private BigDecimal applyMultiplier(BigDecimal valBigDecimal) {
2021bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson       if (multiplierBigDecimal == null) {
2031bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson           multiplierBigDecimal = BigDecimal.valueOf(getMultiplier());
2041bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson       }
2051bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson       // Get new value by multiplying multiplier.
2061bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson       return valBigDecimal.multiply(multiplierBigDecimal);
2071bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson    }
208d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes
209d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes    public StringBuffer formatBigDecimal(BigDecimal value, StringBuffer buffer, FieldPosition field) {
210d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        if (buffer == null || field == null) {
211d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes            throw new NullPointerException();
212d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        }
213d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        if (getMultiplier() != 1) {
214d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes            value = applyMultiplier(value);
215d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        }
216d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        StringBuilder val = new StringBuilder();
217d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        val.append(value.unscaledValue().toString(10));
218d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        int scale = value.scale();
219d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        scale = makeScalePositive(scale, val);
220d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        String fieldType = getFieldType(field.getFieldAttribute());
221d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        String result = format(this.addr, val.toString(), field, fieldType, null, scale);
222d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        return buffer.append(result);
223d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes    }
224d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes
225d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes    public StringBuffer formatBigInteger(BigInteger value, StringBuffer buffer, FieldPosition field) {
226d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        if (buffer == null || field == null) {
227d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes            throw new NullPointerException();
228d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        }
229d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        String fieldType = getFieldType(field.getFieldAttribute());
230d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        String result = format(this.addr, value.toString(10), field, fieldType, null, 0);
231d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes        return buffer.append(result);
232d7e81f7408fb84307d7792b7e3ab8c5a510b294bElliott Hughes    }
2338c7e05b66900808a96fc26903ac389a6c66b1674Elliott Hughes
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public StringBuffer format(long value, StringBuffer buffer, FieldPosition field) {
235a1e5d8a2c1594f7a6ed8aca6e82b106ec8ce79d6Elliott Hughes        if (buffer == null || field == null) {
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String fieldType = getFieldType(field.getFieldAttribute());
2391efbe3391e92e6188918122a600623090561364fElliott Hughes        buffer.append(format(this.addr, value, field, fieldType, null));
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return buffer;
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public StringBuffer format(double value, StringBuffer buffer, FieldPosition field) {
244a1e5d8a2c1594f7a6ed8aca6e82b106ec8ce79d6Elliott Hughes        if (buffer == null || field == null) {
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String fieldType = getFieldType(field.getFieldAttribute());
2481efbe3391e92e6188918122a600623090561364fElliott Hughes        buffer.append(format(this.addr, value, field, fieldType, null));
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return buffer;
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void applyLocalizedPattern(String pattern) {
2531efbe3391e92e6188918122a600623090561364fElliott Hughes        applyPattern(this.addr, true, pattern);
2541efbe3391e92e6188918122a600623090561364fElliott Hughes        lastPattern = null;
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void applyPattern(String pattern) {
2581efbe3391e92e6188918122a600623090561364fElliott Hughes        if (lastPattern != null && pattern.equals(lastPattern)) {
2591efbe3391e92e6188918122a600623090561364fElliott Hughes            return;
2601efbe3391e92e6188918122a600623090561364fElliott Hughes        }
2611efbe3391e92e6188918122a600623090561364fElliott Hughes        applyPattern(this.addr, false, pattern);
2621efbe3391e92e6188918122a600623090561364fElliott Hughes        lastPattern = pattern;
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public AttributedCharacterIterator formatToCharacterIterator(Object object) {
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(object instanceof Number)) {
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Number number = (Number) object;
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String text = null;
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        StringBuffer attributes = new StringBuffer();
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(number instanceof BigInteger) {
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            BigInteger valBigInteger = (BigInteger) number;
2751efbe3391e92e6188918122a600623090561364fElliott Hughes            text = format(this.addr, valBigInteger.toString(10), null, null, attributes, 0);
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else if(number instanceof BigDecimal) {
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            BigDecimal valBigDecimal = (BigDecimal) number;
2781bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson            if (getMultiplier() != 1) {
2791bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson                valBigDecimal = applyMultiplier(valBigDecimal);
2801bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson            }
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            StringBuilder val = new StringBuilder();
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            val.append(valBigDecimal.unscaledValue().toString(10));
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int scale = valBigDecimal.scale();
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            scale = makeScalePositive(scale, val);
2851efbe3391e92e6188918122a600623090561364fElliott Hughes            text = format(this.addr, val.toString(), null, null, attributes, scale);
286b56d4f145a425910db1f6201edc593b61127ca83Elliott Hughes        } else if (number instanceof Double || number instanceof Float) {
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            double dv = number.doubleValue();
2881efbe3391e92e6188918122a600623090561364fElliott Hughes            text = format(this.addr, dv, null, null, attributes);
289b56d4f145a425910db1f6201edc593b61127ca83Elliott Hughes        } else {
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            long lv = number.longValue();
2911efbe3391e92e6188918122a600623090561364fElliott Hughes            text = format(this.addr, lv, null, null, attributes);
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
294b56d4f145a425910db1f6201edc593b61127ca83Elliott Hughes        AttributedString as = new AttributedString(text);
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String[] attrs = attributes.toString().split(";");
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // add NumberFormat field attributes to the AttributedString
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int size = attrs.length / 3;
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(size * 3 != attrs.length) {
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return as.getIterator();
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < size; i++) {
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Format.Field attribute = getField(attrs[3*i]);
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            as.addAttribute(attribute, attribute, Integer.parseInt(attrs[3*i+1]),
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    Integer.parseInt(attrs[3*i+2]));
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // return the CharacterIterator from AttributedString
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return as.getIterator();
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int makeScalePositive(int scale, StringBuilder val) {
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (scale < 0) {
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            scale = -scale;
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = scale; i > 0; i--) {
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                val.append('0');
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            scale = 0;
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return scale;
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toLocalizedPattern() {
3241efbe3391e92e6188918122a600623090561364fElliott Hughes        return toPatternImpl(this.addr, true);
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toPattern() {
3281efbe3391e92e6188918122a600623090561364fElliott Hughes        return toPatternImpl(this.addr, false);
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Number parse(String string, ParsePosition position) {
3321efbe3391e92e6188918122a600623090561364fElliott Hughes        return parse(addr, string, position);
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // start getter and setter
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMaximumFractionDigits() {
3381efbe3391e92e6188918122a600623090561364fElliott Hughes        return getAttribute(this.addr, UNUM_MAX_FRACTION_DIGITS);
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMaximumIntegerDigits() {
3421efbe3391e92e6188918122a600623090561364fElliott Hughes        return getAttribute(this.addr, UNUM_MAX_INTEGER_DIGITS);
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMinimumFractionDigits() {
3461efbe3391e92e6188918122a600623090561364fElliott Hughes        return getAttribute(this.addr, UNUM_MIN_FRACTION_DIGITS);
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMinimumIntegerDigits() {
3501efbe3391e92e6188918122a600623090561364fElliott Hughes        return getAttribute(this.addr, UNUM_MIN_INTEGER_DIGITS);
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Currency getCurrency() {
3541efbe3391e92e6188918122a600623090561364fElliott Hughes        String curr = getSymbol(this.addr, UNUM_INTL_CURRENCY_SYMBOL);
355f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        if (curr.equals("") || curr.equals("\u00a4\u00a4")) {
356f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes            return null;
357f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        }
358f2d5062b67e57ef00ee81fec67480f0d58d66b50Elliott Hughes        return Currency.getInstance(curr);
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getGroupingSize() {
3621efbe3391e92e6188918122a600623090561364fElliott Hughes        return getAttribute(this.addr, UNUM_GROUPING_SIZE);
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getMultiplier() {
3661efbe3391e92e6188918122a600623090561364fElliott Hughes        return getAttribute(this.addr, UNUM_MULTIPLIER);
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getNegativePrefix() {
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (negPrefNull) {
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
3731efbe3391e92e6188918122a600623090561364fElliott Hughes        return getTextAttribute(this.addr, UNUM_NEGATIVE_PREFIX);
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getNegativeSuffix() {
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (negSuffNull) {
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
3801efbe3391e92e6188918122a600623090561364fElliott Hughes        return getTextAttribute(this.addr, UNUM_NEGATIVE_SUFFIX);
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getPositivePrefix() {
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (posPrefNull) {
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
3871efbe3391e92e6188918122a600623090561364fElliott Hughes        return getTextAttribute(this.addr, UNUM_POSITIVE_PREFIX);
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getPositiveSuffix() {
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (posSuffNull) {
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
3941efbe3391e92e6188918122a600623090561364fElliott Hughes        return getTextAttribute(this.addr, UNUM_POSITIVE_SUFFIX);
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isDecimalSeparatorAlwaysShown() {
3981efbe3391e92e6188918122a600623090561364fElliott Hughes        return getAttribute(this.addr, UNUM_DECIMAL_ALWAYS_SHOWN) != 0;
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isParseIntegerOnly() {
4021efbe3391e92e6188918122a600623090561364fElliott Hughes        return getAttribute(this.addr, UNUM_PARSE_INT_ONLY) != 0;
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isGroupingUsed() {
4061efbe3391e92e6188918122a600623090561364fElliott Hughes        return getAttribute(this.addr, UNUM_GROUPING_USED) != 0;
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDecimalSeparatorAlwaysShown(boolean value) {
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int i = value ? -1 : 0;
4111efbe3391e92e6188918122a600623090561364fElliott Hughes        setAttribute(this.addr, UNUM_DECIMAL_ALWAYS_SHOWN, i);
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setCurrency(Currency currency) {
4151efbe3391e92e6188918122a600623090561364fElliott Hughes        setSymbol(this.addr, UNUM_CURRENCY_SYMBOL, currency.getSymbol());
4161efbe3391e92e6188918122a600623090561364fElliott Hughes        setSymbol(this.addr, UNUM_INTL_CURRENCY_SYMBOL, currency.getCurrencyCode());
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setGroupingSize(int value) {
4201efbe3391e92e6188918122a600623090561364fElliott Hughes        setAttribute(this.addr, UNUM_GROUPING_SIZE, value);
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setGroupingUsed(boolean value) {
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int i = value ? -1 : 0;
4251efbe3391e92e6188918122a600623090561364fElliott Hughes        setAttribute(this.addr, UNUM_GROUPING_USED, i);
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMaximumFractionDigits(int value) {
4291efbe3391e92e6188918122a600623090561364fElliott Hughes        setAttribute(this.addr, UNUM_MAX_FRACTION_DIGITS, value);
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMaximumIntegerDigits(int value) {
4331efbe3391e92e6188918122a600623090561364fElliott Hughes        setAttribute(this.addr, UNUM_MAX_INTEGER_DIGITS, value);
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMinimumFractionDigits(int value) {
4371efbe3391e92e6188918122a600623090561364fElliott Hughes        setAttribute(this.addr, UNUM_MIN_FRACTION_DIGITS, value);
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMinimumIntegerDigits(int value) {
4411efbe3391e92e6188918122a600623090561364fElliott Hughes        setAttribute(this.addr, UNUM_MIN_INTEGER_DIGITS, value);
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setMultiplier(int value) {
4451efbe3391e92e6188918122a600623090561364fElliott Hughes        setAttribute(this.addr, UNUM_MULTIPLIER, value);
4461bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson        // Update the cached BigDecimal for multiplier.
4471bf75229139701cbdc5d6823ed81094233cfdebeJesse Wilson        multiplierBigDecimal = BigDecimal.valueOf(value);
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setNegativePrefix(String value) {
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        negPrefNull = value == null;
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!negPrefNull) {
4531efbe3391e92e6188918122a600623090561364fElliott Hughes            setTextAttribute(this.addr, UNUM_NEGATIVE_PREFIX, value);
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setNegativeSuffix(String value) {
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        negSuffNull = value == null;
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!negSuffNull) {
4601efbe3391e92e6188918122a600623090561364fElliott Hughes            setTextAttribute(this.addr, UNUM_NEGATIVE_SUFFIX, value);
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setPositivePrefix(String value) {
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        posPrefNull = value == null;
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!posPrefNull) {
4671efbe3391e92e6188918122a600623090561364fElliott Hughes            setTextAttribute(this.addr, UNUM_POSITIVE_PREFIX, value);
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setPositiveSuffix(String value) {
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        posSuffNull = value == null;
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!posSuffNull) {
4741efbe3391e92e6188918122a600623090561364fElliott Hughes            setTextAttribute(this.addr, UNUM_POSITIVE_SUFFIX, value);
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setParseIntegerOnly(boolean value) {
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int i = value ? -1 : 0;
4801efbe3391e92e6188918122a600623090561364fElliott Hughes        setAttribute(this.addr, UNUM_PARSE_INT_ONLY, i);
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static protected String getFieldType(Format.Field field) {
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(field == null) {
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(field.equals(NumberFormat.Field.SIGN)) {
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "sign";
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(field.equals(NumberFormat.Field.INTEGER)) {
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "integer";
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(field.equals(NumberFormat.Field.FRACTION)) {
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "fraction";
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(field.equals(NumberFormat.Field.EXPONENT)) {
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "exponent";
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(field.equals(NumberFormat.Field.EXPONENT_SIGN)) {
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "exponent_sign";
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(field.equals(NumberFormat.Field.EXPONENT_SYMBOL)) {
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "exponent_symbol";
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(field.equals(NumberFormat.Field.CURRENCY)) {
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "currency";
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(field.equals(NumberFormat.Field.GROUPING_SEPARATOR)) {
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "grouping_separator";
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(field.equals(NumberFormat.Field.DECIMAL_SEPARATOR)) {
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "decimal_separator";
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(field.equals(NumberFormat.Field.PERCENT)) {
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "percent";
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(field.equals(NumberFormat.Field.PERMILLE)) {
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "permille";
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Format.Field getField(String type) {
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(type.equals("")) {
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(type.equals("sign")) {
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return NumberFormat.Field.SIGN;
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(type.equals("integer")) {
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return NumberFormat.Field.INTEGER;
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(type.equals("fraction")) {
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return NumberFormat.Field.FRACTION;
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(type.equals("exponent")) {
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return NumberFormat.Field.EXPONENT;
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(type.equals("exponent_sign")) {
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return NumberFormat.Field.EXPONENT_SIGN;
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(type.equals("exponent_symbol")) {
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return NumberFormat.Field.EXPONENT_SYMBOL;
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(type.equals("currency")) {
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return NumberFormat.Field.CURRENCY;
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(type.equals("grouping_separator")) {
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return NumberFormat.Field.GROUPING_SEPARATOR;
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(type.equals("decimal_separator")) {
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return NumberFormat.Field.DECIMAL_SEPARATOR;
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(type.equals("percent")) {
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return NumberFormat.Field.PERCENT;
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(type.equals("permille")) {
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return NumberFormat.Field.PERMILLE;
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
5621efbe3391e92e6188918122a600623090561364fElliott Hughes
563d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes    private static int openDecimalFormat(String pattern) {
5641efbe3391e92e6188918122a600623090561364fElliott Hughes        try {
5651efbe3391e92e6188918122a600623090561364fElliott Hughes            // FIXME: if we're about to override everything, should we just ask for the cheapest locale (presumably the root locale)?
566d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes            return openDecimalFormatImpl(pattern);
5671efbe3391e92e6188918122a600623090561364fElliott Hughes        } catch (NullPointerException npe) {
5681efbe3391e92e6188918122a600623090561364fElliott Hughes            throw npe;
5691efbe3391e92e6188918122a600623090561364fElliott Hughes        } catch (RuntimeException re) {
5701efbe3391e92e6188918122a600623090561364fElliott Hughes            throw new IllegalArgumentException("syntax error: " + re.getMessage() + ": " + pattern);
5711efbe3391e92e6188918122a600623090561364fElliott Hughes        }
5721efbe3391e92e6188918122a600623090561364fElliott Hughes    }
5731efbe3391e92e6188918122a600623090561364fElliott Hughes
5741efbe3391e92e6188918122a600623090561364fElliott Hughes    private static void applyPattern(int addr, boolean localized, String pattern) {
5751efbe3391e92e6188918122a600623090561364fElliott Hughes        try {
5761efbe3391e92e6188918122a600623090561364fElliott Hughes            applyPatternImpl(addr, localized, pattern);
5771efbe3391e92e6188918122a600623090561364fElliott Hughes        } catch (NullPointerException npe) {
5781efbe3391e92e6188918122a600623090561364fElliott Hughes            throw npe;
5791efbe3391e92e6188918122a600623090561364fElliott Hughes        } catch (RuntimeException re) {
5801efbe3391e92e6188918122a600623090561364fElliott Hughes            throw new IllegalArgumentException("syntax error: " + re.getMessage() + ": " + pattern);
5811efbe3391e92e6188918122a600623090561364fElliott Hughes        }
5821efbe3391e92e6188918122a600623090561364fElliott Hughes    }
5831efbe3391e92e6188918122a600623090561364fElliott Hughes
5841efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native void applyPatternImpl(int addr, boolean localized, String pattern);
5851efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native int cloneDecimalFormatImpl(int addr);
5861efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native void closeDecimalFormatImpl(int addr);
5871efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native String format(int addr, long value, FieldPosition position, String fieldType, StringBuffer attributes);
5881efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native String format(int addr, double value, FieldPosition position, String fieldType, StringBuffer attributes);
5891efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native String format(int addr, String value, FieldPosition position, String fieldType, StringBuffer attributes, int scale);
5901efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native int getAttribute(int addr, int symbol);
5911efbe3391e92e6188918122a600623090561364fElliott Hughes    // FIXME: do we need getSymbol any more? the Java-side object should be the canonical source.
5921efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native String getSymbol(int addr, int symbol);
5931efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native String getTextAttribute(int addr, int symbol);
594d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes    private static native int openDecimalFormatImpl(String pattern);
5951efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native Number parse(int addr, String string, ParsePosition position);
596d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes    private static native void setDecimalFormatSymbols(int addr, String currencySymbol,
597d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes            char decimalSeparator, char digit, char groupingSeparator, String infinity,
598d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes            String internationalCurrencySymbol, char minusSign, char monetaryDecimalSeparator,
599d5344fec27edfcf7acf9f703c9d7dff14a832943Elliott Hughes            String nan, char patternSeparator, char percent, char perMill, char zeroDigit);
6001efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native void setSymbol(int addr, int symbol, String str);
6011efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native void setSymbol(int addr, int symbol, char ch);
6021efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native void setAttribute(int addr, int symbol, int i);
6031efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native void setTextAttribute(int addr, int symbol, String str);
6041efbe3391e92e6188918122a600623090561364fElliott Hughes    private static native String toPatternImpl(int addr, boolean localized);
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
606