В Java, оказывается, существует стандартный класс java.util.Currency, который позволяет работать с валютами и их кодами в соответствии с ISO 4217. Он хранится в пакете java.util и позволяет отобразить числовой код 810, например, на строковый код RUR.
У класса Currency нет публичного конструктора. Получить экземпляр класса можно вызвав один из статических методов:
1 2 3 4 5 6 7 8 9 10 11 |
$ jshell | Welcome to JShell -- Version 11.0.10 | For an introduction type: /help intro jshell> var rouble = Currency.getInstance("RUR") rouble ==> RUR jshell> var byLocale = Currency.getInstance(Locale.UK) byLocale ==> GBP jshell> |
Если вы ещё не знакомы с JShell, то на моем сайте есть краткая инструкция о его использовании.
Для каждой валюты всегда существует только один экземпляр Currency, поэтому его экземпляры можно сравнивать через ==:
1 2 |
jshell> Currency.getInstance(Locale.US) == Currency.getInstance("USD") $6 ==> true |
У класса Currency есть методы для получения числового кода, строкового кода и названия валюты:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
$ jshell | Welcome to JShell -- Version 11.0.10 | For an introduction type: /help intro jshell> var rouble = Currency.getInstance("RUR") rouble ==> RUR jshell> rouble.getDisplayName() $2 ==> "Российский рубль (1991–1998)" jshell> rouble.getDisplayName(Locale.US) $3 ==> "Russian Ruble (1991–1998)" jshell> rouble.getDisplayName(new Locale("ru", "RU")) $4 ==> "Российский рубль (1991–1998)" jshell> rouble.getCurrencyCode() $5 ==> "RUR" jshell> rouble.getNumericCode() $6 ==> 810 jshell> rouble.getNumericCodeAsString() $7 ==> "810" jshell> rouble.getSymbol() $8 ==> "р." jshell> rouble.getSymbol(Locale.US) $9 ==> "RUR" jshell> rouble.getSymbol(new Locale("ru", "RU")) $10 ==> "р." jshell> rouble.getSymbol(new Locale("en", "GB")) $11 ==> "RUR" jshell> rouble.getSymbol(Locale.UK) $12 ==> "RUR" jshell> |
Причём метод getNumericCodeAsString() появился только в Java 9, в предыдущих версиях приходилось довольствоваться методом getNumericCode(), после которого нужно вручную добавлять символы нуля в начале, так как он возвращает примитивный тип int:
1 2 3 4 5 6 7 8 9 10 11 |
jshell> String.format("%03d", Currency.getInstance("BOB").getNumericCode()) $14 ==> "068" jshell> var bob = Currency.getInstance("BOB") bob ==> BOB jshell> bob.getNumericCode() $16 ==> 68 jshell> String.format(Locale.ROOT, "%03d", bob.getNumericCode()) $18 ==> "068" |
Есть возможность получить список всех доступных валют методом getAvailableCurrencies():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
jshell> { ...> Currency.getAvailableCurrencies() ...> .stream() ...> .map(Currency::getDisplayName) ...> .forEach(System.out::println); ...> } Платина Sucre доллар США бахрейнский динар нидерландский антильский гульден конвертируемая марка Боснии и Герцеговины добра Сан-Томе и Принсипи (1977–2017) новозеландский доллар Европейская составная единица кубинское песо ганский седи ... |
Этот список довольно большой, поэтому здесь привел только начало вывода.
Можно получить количество цифр для дробной части валюты (для рублей это будет количество цифр для копеек):
1 2 |
jshell> Currency.getInstance("RUR").getDefaultFractionDigits() $29 ==> 2 |