Подтвердить что ты не робот

Отображение валюты в индийском формате нумерации

У меня вопрос о форматировании валюты рупии (Indian Rupee - 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"/>

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

Спасибо

4b9b3361

Ответ 1

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

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

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

ICU4J (версия Java Международные компоненты для Юникода) предоставляет 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).

Ответ 2

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

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

450500 отформатирован как 4,50,500

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

Ответ 3

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

 float amount = 100000;

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

 String moneyString = formatter.format(amount);

 System.out.println(moneyString);

Выход будет Rs.100,000.00.

Ответ 4

Я тоже попал в ту же проблему. Я работал с 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.##".

Ответ 5

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

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);

Ответ 6

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.

Ответ 7

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);
        }

Ответ 8

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

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

    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

Ответ 9

//Input:
long num = 450500;

// Unlike other countries, there is no direct Locale field for India.Therefore, we need to construct a locale for India.
Locale loc = new Locale("en", "in"); // This will display currency with "Rs." symbol.

// or use below to display currency with "INR" symbol.
Locale loc = new Locale("", "in");

NumberFormat indiacurrency = NumberFormat.getCurrencyInstance(loc);
String result = indiacurrency.format(num);
System.out.print(result);

Ответ 10

версия 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)
}

Ответ 11

Методы по умолчанию в существующих библиотеках могут отображать только тысячи seperator. поэтому для этого нам нужно написать специальную функцию. Вы можете использовать несколько операций подстроки, чтобы получить желаемый результат.

В java,

function indianCurrencyNumberFormat(rupee) {
    string explore_remaining_units = "";
    if (rupee.length() > 3) {
        last_three_digits = rupee.substring((rupee.length()-3), rupee.length());
        remaining_units = rupee.substring(0, (rupee.length()-3)); 
        remaining_units =  ((remaining_units.length()) % 2 == 1) ? "0"+remaining_units : remaining_units; 
        split_rupee = remaining_units.split("(?<=^(.{2})+)")
        for (i = 0; i < sizeof(split_rupee); i++) {
          explore_remaining_units += ((i == 0) ? ( (int) split_rupee[i]+"," ) : ( split_rupee[i]+"," ));  
        }
        formatted_rupee = explore_remaining_units+last_three_digits;
    } else {
        formatted_rupee = rupee;
    }
    return formatted_rupee; 
}

И в php:

function indianCurrencyNumberFormat($rupee) {
    $explore_remaining_units = "";
    if (strlen($rupee) > 3) {
        $last_three_digits = substr($rupee, strlen($rupee) - 3, strlen($rupee));
        $remaining_units = substr($rupee, 0, strlen($rupee) - 3); 
        $remaining_units = (strlen($remaining_units) % 2 == 1) ? "0".$remaining_units : $remaining_units; 
        $split_rupee = str_split($remaining_units, 2);
        for ($i = 0; $i < sizeof($split_rupee); $i++) {
          $explore_remaining_units .= (($i == 0) ? ( (int) $split_rupee[$i] . "," ) : ( $split_rupee[$i] . "," ));  
        }
        $formatted_rupee = $explore_remaining_units.$last_three_digits;
    } else {
        $formatted_rupee = $rupee;
    }
    return $formatted_rupee; 
}

Вы можете увидеть более подробную информацию здесь.

Ответ 12

import java.util.*;

public class string1 {

     public static void main(String args[])
     {
         int i,j;
         boolean op=false;

         StringBuffer sbuffer = new StringBuffer();
         Scanner input = new Scanner(System.in);
         System.out.println("Enter a string");
         sbuffer.append(input.nextLine());

         int length=sbuffer.length();
         if(sbuffer.length()<3)
         {
             System.out.println("string="+sbuffer);
         }
         else
         {
             for ( i = sbuffer.length(); i >0; i--) 
             {

                 if (i==length-3)
                 {
                     sbuffer.insert(i, ",");
                      op=true;
                 }
                 while(i>1 && op==true)
                 {
                     i=i-2;

                     if(i>=1)
                     {

                     sbuffer.insert(i, ",");
                     }
                 }
             }

         }
         System.out.println("string="+sbuffer);
     }
}

Ответ 13

Лучше ответить и работает динамически, вместо того, чтобы вручную указывать один локальный код.

public String convertToDefaultCurrencyFormat(String amountToConvert){
    NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.getDefault());
    String moneyString = formatter.format(Double.valueOf(amountToConvert));
    return moneyString;
}   

для изменения формата индийских рупий Язык на вашем устройстве Android:

Setting > Language & Input Settings > выберите English(India)

Вывод:

₹10,00,000 (Starting with Indian Rupee symbol)

Ответ 14

В Android android.icu.text.NumberFormat доступен только после уровня api 24. Поэтому для поддержки более низкой версии я написал свой собственный метод в 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();
}

Ответ 15

ALTER FUNCTION [dbo]. [Udf_CurrencyFormat] (@UC varchar (50)) RETURNS varchar (50) AS BEGIN объявляет @FC varchar (50), @Масштаб varchar (3), @i bigint = 1, @a int = 3, @b int = 2, @WhileLength bigint, @UCScale varchar (50), @Con varchar (20) set @Scale = charindex ('.', @UC) --if имеет номер. затем значение else '0', если (@Scale! = '0') begin set @UCScale = @UC set @Con = substring (@UCScale, charindex ('.', @UCScale), 3) set @UC = подстрока ( @UC, 0, charindex ('.', @UC)) - конец подстроки if (cast (len (@UC) как bigint)% 2! = 0) --if нечетное начало set @WhileLength = (cast (len (@UC) как bigint) -3)/2 while (@i <= @WhileLength) - длина -3/2 = 3, если длина равна 9 (cast (len (@UC) как bigint) -3 )/2 begin set @a = 3 * @i set @UC = stuff (@UC, @a, 0, ',') set @i = @i +1 end --while set @FC = @UC end --if odd Scale '0' else if (cast (len (@UC) as bigint)% 2 = 0) --if даже начать задавать @WhileLength = (((cast (len (@UC) как bigint) [CN07 ]) -3)/2) +1 while (@i <= @WhileLength) begin if (@i = 1) begin set @UC = stuff (@UC, @b, 0, ',') end else begin set @b = @b + 3 set @UC = stuff (@UC, @b, 0, ',') end set @i = @i +1 end set @FC = @UC end if (@Scale! = '0') begin set @FC = @FC+ @Con end --if (@Scale! = '0') --set @FC = @UC return @FC END