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