8215181: Accounting currency format support

Reviewed-by: lancea, rriggs
This commit is contained in:
Naoto Sato 2019-08-07 14:56:26 -07:00
parent 2ce6d6ba36
commit 865afd7fda
5 changed files with 126 additions and 13 deletions

View file

@ -575,6 +575,15 @@ public abstract class NumberFormat extends Format {
/**
* Returns a currency format for the specified locale.
*
* <p>If the specified locale contains the "{@code cf}" (
* <a href="https://www.unicode.org/reports/tr35/tr35.html#UnicodeCurrencyFormatIdentifier">
* currency format style</a>)
* <a href="../util/Locale.html#def_locale_extension">Unicode extension</a>,
* the returned currency format uses the style if it is available.
* Otherwise, the style uses the default "{@code standard}" currency format.
* For example, if the style designates "{@code account}", negative
* currency amounts use a pair of parentheses in some locales.
*
* @param inLocale the desired locale
* @return the {@code NumberFormat} instance for currency formatting
*/

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -63,7 +63,7 @@ public class NumberFormatProviderImpl extends NumberFormatProvider implements Av
private static final int NUMBERSTYLE = 0;
private static final int CURRENCYSTYLE = 1;
private static final int PERCENTSTYLE = 2;
private static final int SCIENTIFICSTYLE = 3;
private static final int ACCOUNTINGSTYLE = 3;
private static final int INTEGERSTYLE = 4;
private final LocaleProviderAdapter.Type type;
@ -184,6 +184,12 @@ public class NumberFormatProviderImpl extends NumberFormatProvider implements Av
String[] numberPatterns = adapter.getLocaleResources(override).getNumberPatterns();
DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(override);
int entry = (choice == INTEGERSTYLE) ? NUMBERSTYLE : choice;
if (choice == CURRENCYSTYLE &&
numberPatterns.length > ACCOUNTINGSTYLE &&
!numberPatterns[ACCOUNTINGSTYLE].isEmpty() &&
"account".equalsIgnoreCase(override.getUnicodeLocaleType("cf"))) {
entry = ACCOUNTINGSTYLE;
}
DecimalFormat format = new DecimalFormat(numberPatterns[entry], symbols);
if (choice == INTEGERSTYLE) {