src/share/classes/java/text/NumberFormat.java

Print this page
rev 5696 : 6336885: RFE: Locale Data Deployment Enhancements
4609153: Provide locale data for Indic locales
5104387: Support for gl_ES locale (galician language)
6337471: desktop/system locale preferences support
7056139: (cal) SPI support for locale-dependent Calendar parameters
7058206: Provide CalendarData SPI for week params and display field value names
7073852: Support multiple scripts for digits and decimal symbols per locale
7079560: [Fmt-Da] Context dependent month names support in SimpleDateFormat
7171324: getAvailableLocales() of locale sensitive services should return the actual availability of locales
7151414: (cal) Support calendar type identification
7168528: LocaleServiceProvider needs to be aware of Locale extensions
7171372: (cal) locale's default Calendar should be created if unknown calendar is specified
Summary: JEP 127: Improve Locale Data Packaging and Adopt Unicode CLDR Data (part 1 w/o packaging changes. by Naoto Sato and Masayoshi Okutsu)

*** 52,62 **** import java.util.Map; import java.util.ResourceBundle; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.spi.LocaleServiceProvider; ! import sun.util.LocaleServiceProviderPool; import sun.util.resources.LocaleData; /** * <code>NumberFormat</code> is the abstract base class for all number * formats. This class provides the interface for formatting and parsing --- 52,63 ---- import java.util.Map; import java.util.ResourceBundle; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.spi.LocaleServiceProvider; ! import sun.util.locale.provider.LocaleProviderAdapter; ! import sun.util.locale.provider.LocaleServiceProviderPool; import sun.util.resources.LocaleData; /** * <code>NumberFormat</code> is the abstract base class for all number * formats. This class provides the interface for formatting and parsing
*** 230,239 **** --- 231,241 ---- * <code>pos</code> is null * @exception ArithmeticException if rounding is needed with rounding * mode being set to RoundingMode.UNNECESSARY * @see java.text.FieldPosition */ + @Override public StringBuffer format(Object number, StringBuffer toAppendTo, FieldPosition pos) { if (number instanceof Long || number instanceof Integer || number instanceof Short || number instanceof Byte ||
*** 270,279 **** --- 272,282 ---- * index information as described above. * @return A <code>Number</code> parsed from the string. In case of * error, returns null. * @exception NullPointerException if <code>pos</code> is null. */ + @Override public final Object parseObject(String source, ParsePosition pos) { return parse(source, pos); } /**
*** 499,518 **** LocaleServiceProviderPool.getPool(NumberFormatProvider.class); return pool.getAvailableLocales(); } /** ! * Overrides hashCode */ public int hashCode() { return maximumIntegerDigits * 37 + maxFractionDigits; // just enough fields for a reasonable distribution } /** ! * Overrides equals */ public boolean equals(Object obj) { if (obj == null) { return false; } if (this == obj) { --- 502,523 ---- LocaleServiceProviderPool.getPool(NumberFormatProvider.class); return pool.getAvailableLocales(); } /** ! * Overrides hashCode. */ + @Override public int hashCode() { return maximumIntegerDigits * 37 + maxFractionDigits; // just enough fields for a reasonable distribution } /** ! * Overrides equals. */ + @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (this == obj) {
*** 529,540 **** && groupingUsed == other.groupingUsed && parseIntegerOnly == other.parseIntegerOnly); } /** ! * Overrides Cloneable */ public Object clone() { NumberFormat other = (NumberFormat) super.clone(); return other; } --- 534,546 ---- && groupingUsed == other.groupingUsed && parseIntegerOnly == other.parseIntegerOnly); } /** ! * Overrides Cloneable. */ + @Override public Object clone() { NumberFormat other = (NumberFormat) super.clone(); return other; }
*** 739,786 **** // =======================privates=============================== private static NumberFormat getInstance(Locale desiredLocale, int choice) { ! // Check whether a provider can provide an implementation that's closer ! // to the requested locale than what the Java runtime itself can provide. ! LocaleServiceProviderPool pool = ! LocaleServiceProviderPool.getPool(NumberFormatProvider.class); ! if (pool.hasProviders()) { ! NumberFormat providersInstance = pool.getLocalizedObject( ! NumberFormatGetter.INSTANCE, ! desiredLocale, ! choice); ! if (providersInstance != null) { ! return providersInstance; } } ! /* try the cache first */ ! String[] numberPatterns = cachedLocaleData.get(desiredLocale); ! if (numberPatterns == null) { /* cache miss */ ! ResourceBundle resource = LocaleData.getNumberFormatData(desiredLocale); ! numberPatterns = resource.getStringArray("NumberPatterns"); ! /* update cache */ ! cachedLocaleData.put(desiredLocale, numberPatterns); } ! ! DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(desiredLocale); ! int entry = (choice == INTEGERSTYLE) ? NUMBERSTYLE : choice; ! DecimalFormat format = new DecimalFormat(numberPatterns[entry], symbols); ! ! if (choice == INTEGERSTYLE) { ! format.setMaximumFractionDigits(0); ! format.setDecimalSeparatorAlwaysShown(false); ! format.setParseIntegerOnly(true); ! } else if (choice == CURRENCYSTYLE) { ! format.adjustForCurrencyDefaultFractionDigits(); } - return format; - } - /** * First, read in the default serializable data. * * Then, if <code>serialVersionOnStream</code> is less than 1, indicating that * the stream was written by JDK 1.1, --- 745,786 ---- // =======================privates=============================== private static NumberFormat getInstance(Locale desiredLocale, int choice) { ! LocaleProviderAdapter adapter; ! adapter = LocaleProviderAdapter.getAdapter(NumberFormatProvider.class, ! desiredLocale); ! NumberFormat numberFormat = getInstance(adapter, desiredLocale, choice); ! if (numberFormat == null) { ! numberFormat = getInstance(LocaleProviderAdapter.forJRE(), ! desiredLocale, choice); } + return numberFormat; } ! private static NumberFormat getInstance(LocaleProviderAdapter adapter, ! Locale locale, int choice) { ! NumberFormatProvider provider = adapter.getNumberFormatProvider(); ! NumberFormat numberFormat = null; ! switch (choice) { ! case NUMBERSTYLE: ! numberFormat = provider.getNumberInstance(locale); ! break; ! case PERCENTSTYLE: ! numberFormat = provider.getPercentInstance(locale); ! break; ! case CURRENCYSTYLE: ! numberFormat = provider.getCurrencyInstance(locale); ! break; ! case INTEGERSTYLE: ! numberFormat = provider.getIntegerInstance(locale); ! break; } ! return numberFormat; } /** * First, read in the default serializable data. * * Then, if <code>serialVersionOnStream</code> is less than 1, indicating that * the stream was written by JDK 1.1,
*** 839,853 **** minFractionDigits = (minimumFractionDigits > Byte.MAX_VALUE) ? Byte.MAX_VALUE : (byte)minimumFractionDigits; stream.defaultWriteObject(); } - /** - * Cache to hold the NumberPatterns of a Locale. - */ - private static final Hashtable<Locale, String[]> cachedLocaleData = new Hashtable<>(3); - // Constants used by factory methods to specify a style of format. private static final int NUMBERSTYLE = 0; private static final int CURRENCYSTYLE = 1; private static final int PERCENTSTYLE = 2; private static final int SCIENTIFICSTYLE = 3; --- 839,848 ----
*** 1054,1063 **** --- 1049,1059 ---- * Resolves instances being deserialized to the predefined constants. * * @throws InvalidObjectException if the constant could not be resolved. * @return resolved NumberFormat.Field constant */ + @Override protected Object readResolve() throws InvalidObjectException { if (this.getClass() != NumberFormat.Field.class) { throw new InvalidObjectException("subclass didn't correctly implement readResolve"); }
*** 1125,1162 **** /** * Constant identifying the exponent sign field. */ public static final Field EXPONENT_SIGN = new Field("exponent sign"); } - - /** - * Obtains a NumberFormat instance from a NumberFormatProvider implementation. - */ - private static class NumberFormatGetter - implements LocaleServiceProviderPool.LocalizedObjectGetter<NumberFormatProvider, - NumberFormat> { - private static final NumberFormatGetter INSTANCE = new NumberFormatGetter(); - - public NumberFormat getObject(NumberFormatProvider numberFormatProvider, - Locale locale, - String key, - Object... params) { - assert params.length == 1; - int choice = (Integer)params[0]; - - switch (choice) { - case NUMBERSTYLE: - return numberFormatProvider.getNumberInstance(locale); - case PERCENTSTYLE: - return numberFormatProvider.getPercentInstance(locale); - case CURRENCYSTYLE: - return numberFormatProvider.getCurrencyInstance(locale); - case INTEGERSTYLE: - return numberFormatProvider.getIntegerInstance(locale); - default: - assert false : choice; - } - - return null; - } - } } --- 1121,1126 ----