Как получить форматированную стоимость валюты для Индии?

#java #formatting #format #currency #number-formatting

Вопрос:

Например, в США 1000000 представлено как 1 000 000 (1 миллион), но в Индии оно представлено как 10 00 000 (10 лакхов). Для этого я испробовал несколько методов

 double value = 1000000d;
NumberFormat numberFormatter = NumberFormat.getNumberInstance(new Locale("en", "IN"));
System.out.println(numberFormatter.format(value));
            

NumberFormat deci = new DecimalFormat("#,##,##,###.##");
System.out.println("Decimal Format " deci.format(value));

NumberFormat format = NumberFormat.getNumberInstance();
format.setCurrency(Currency.getInstance("INR"));
format.setMaximumFractionDigits(2);      
System.out.println(format.format(value));
 

Но все эти методы дают результат в 1 000 000, но мне требуется формат 10 00 000. Что мне нужно здесь изменить?

Ответ №1:

Форматирование десятичных чисел Java не поддерживает группы Из Документов :

Разделитель групп обычно используется для обозначения тысяч, но в некоторых странах он разделяет десятки тысяч. Размер группировки-это постоянное количество цифр между символами группировки, например 3 для 100 000 000 или 4 для 1 000 000 000. Если вы предоставляете шаблон с несколькими символами группировки, используется интервал между последним и концом целого числа. Так что «#,##,###,####» == «######,####» == «##,####,####».

Для этого вам понадобится другая библиотека. Предлагаю следующее : http://site.icu-project.org/https://mvnrepository.com/artifact/com.ibm.icu/icu4j/69.1

Код

 double value = 1000000d;
NumberFormat numberFormatter = NumberFormat.getNumberInstance(new Locale("en", "IN"));
System.out.println(numberFormatter.format(value));
 

Выход :

 10,00,000
 

Ответ №2:

 public static String fmt(String s)
{
    String formatted = "";
    if(s.length() > 1){
        formatted = s.substring(0,1);
        s = s.substring(1);
    }
    
    while(s.length() > 3){
        formatted  = ","   s.substring(0,2);
        s = s.substring(2);
    }
    return formatted   ","   s   ".00"; 
}