Отображение валюты в индийском формате нумерации - PullRequest
47 голосов
/ 21 марта 2011

У меня есть вопрос о форматировании валюты рупии (индийская рупия - INR).

Обычно значение типа 450500 форматируется и отображается как 450,500.В Индии то же значение отображается как 4,50,500

Например, числа здесь представлены как:

1
10
100
1,000
10,000
1,00,000
10,00,000
1,00,00,000
10,00,00,000

См. Индийская система нумерации

Разделители идут после двух цифр, за исключением последнего набора, который исчисляется тысячами.

Я искал в Интернете, и люди попросили использовать локаль en_GB или шаблон #,##,##,##,##0.00

Я попробовал это на JSTL, используя следующий тег:

<fmt:formatNumber value="${product.price}" type="currency" 
  pattern="#,##,##,##,###.00"/>

Но, похоже, это не решает проблему.Любая помощь в этом вопросе будет принята с благодарностью.

Спасибо

Ответы [ 15 ]

59 голосов
/ 21 марта 2011

К сожалению DecimalFormat не поддерживает группы переменной ширины.Поэтому он никогда не будет форматировать значения точно так, как вы хотите:

Если вы предоставляете шаблон с несколькими символами группировки, интервал между последним и концом целого числа будет таким, которыйиспользуется.Итак, "#,##,###,####" == "######,####" == "##,####,####".

Большинство механизмов форматирования чисел в Java основаны на этом классе и поэтому наследуют этот недостаток.

ICU4J (Java-версия International Components дляUnicode ) предоставляет класс NumberFormat, который поддерживает этот формат:

Format format = com.ibm.icu.text.NumberFormat.getCurrencyInstance(new Locale("en", "in"));
System.out.println(format.format(new BigDecimal("100000000")));

Этот код будет выдавать этот вывод:

Rs 10,00,00,000.00

Примечание: класс com.ibm.icu.text.NumberFormat не расширяет класс java.text.NumberFormat (поскольку он уже расширяет базовый класс ICU), он делает однако расширить класс java.text.Format, который имеет метод format(Object).

20 голосов
/ 31 августа 2013

С Android это работает для меня:

new DecimalFormat("##,##,##0").format(amount);

450500 форматируется как 4,50,500

http://developer.android.com/reference/java/text/DecimalFormat.html - DecimalFormat поддерживает две группировкиразмеры - основной размер группировки, и один используется для всех остальных.

9 голосов
/ 30 августа 2013

вот простая вещь, которую вы можете сделать,

 float amount = 100000;

 NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en", "IN"));

 String moneyString = formatter.format(amount);

 System.out.println(moneyString);

Результат будет 100 000 рупий.

5 голосов
/ 06 декабря 2013

Я тоже попал в ту же проблему.Я работал с DecimalFormat.

Я не знаю JSTL, но вы можете выяснить что-то по моему решению.

Так как размер группировки остается постоянным в DecimalFormat.Я разделил обе части, отформатировал их по-разному и соединил обе.Вот код.

public static String format(double value) {
    if(value < 1000) {
        return format("###", value);
    } else {
        double hundreds = value % 1000;
        int other = (int) (value / 1000);
        return format(",##", other) + ',' + format("000", hundreds);
    }
}

private static String format(String pattern, Object value) {
    return new DecimalFormat(pattern).format(value);
}

Он предоставит формат, подобный индийской системе нумерации.

Если вам нужны десятичные точки, просто добавьте ".##" в обоих условиях.

"###" до "###.##" и "000" до "000.##".

4 голосов
/ 09 марта 2016

Простое решение -

Double amount = 5356673553123.0; //amount is an example ,can be used with any double value

**DecimalFormat IndianCurrencyFormat = new DecimalFormat("##,##,###.00");**

затем используйте его как -

String formattedAmount = IndianCurrencyFormat.format(amount);
3 голосов
/ 13 марта 2017
public String getIndianCurrencyFormat(String amount) {
    StringBuilder stringBuilder = new StringBuilder();
    char amountArray[] = amount.toCharArray();
    int a = 0, b = 0;
    for (int i = amountArray.length - 1; i >= 0; i--) {
        if (a < 3) {
            stringBuilder.append(amountArray[i]);
            a++;
        } else if (b < 2) {
            if (b == 0) {
                stringBuilder.append(",");
                stringBuilder.append(amountArray[i]);
                b++;
            } else {
                stringBuilder.append(amountArray[i]);
                b = 0;
            }
        }
    }
    return stringBuilder.reverse().toString();
}

Это то, что я сделал, для получения формата индийской валюты.если ввод 1234567890, значит вывод 1,23,45,67,890.

2 голосов
/ 01 ноября 2017

версия Kotlin, работает на Android API 26

fun currencyLocale(value: Double): String {
    val formatter = NumberFormat.getCurrencyInstance(Locale("en", "in"))
    return formatter.format(value)
}

fun parseCommaSeparatedCurrency(value: String): Number {
    return NumberFormat.getCurrencyInstance(Locale("en", "in")).parse(value)
}
2 голосов
/ 27 июля 2017

Если языковой стандарт по умолчанию недоступен и пользователь не вносит никаких изменений в языковой стандарт, мы можем перейти к настройке символа валюты с использованием юникода и десятичного форматирования. Как в приведенном ниже коде:

Например, Установка символа индийской валюты и форматирование значения. Это будет работать без изменения пользователем настроек.

    Locale locale = new Locale("en","IN");
    DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getCurrencyInstance(locale);
    DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(locale);
    dfs.setCurrencySymbol("\u20B9");
    decimalFormat.setDecimalFormatSymbols(dfs);
    System.out.println(decimalFormat.format(payment));

Выход:

₹12,324.13
2 голосов
/ 16 июля 2015

enter image description here

Просто скопируйте мимо этой функции. :)

  public static String rupeeFormat(String value){
            value=value.replace(",","");
            char lastDigit=value.charAt(value.length()-1);
            String result = "";
            int len = value.length()-1;
            int nDigits = 0;

            for (int i = len - 1; i >= 0; i--)
            {
                result = value.charAt(i) + result;
                nDigits++;
                if (((nDigits % 2) == 0) && (i > 0))
                {
                    result = "," + result;
                }
            }
            return (result+lastDigit);
        }
1 голос
/ 12 октября 2017

На Android android.icu.text.NumberFormat доступен только после 24 уровня API.Поэтому для поддержки более низкой версии я написал свой собственный метод в Java.

public static String formatIndianCommaSeparated(long rupee){
    // remove sign if present
    String raw = String.valueOf(Math.abs(rupee));
    int numDigits = raw.length();
    StringBuilder sb = new StringBuilder(raw);
    // Reverse the string to start from right most digits
    sb = sb.reverse();
    // Counter to keep track of number of commas placed
    int commas = 0;
    for (int i=0; i<numDigits; i++){
        // Insert a comma if i is in the range [3, 5, 7, 9, ...)
        if (i % 2 == 1 && i != 1 ){
            sb.insert(i+commas, ",");
            commas++;
        }
    }
    // Reverse the string back to get original number
    String sign = (rupee < 0) ? "-" : "";
    return sign + sb.reverse().toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...