以印度编号格式显示货币

时间:2011-03-21 14:41:46

标签: java internationalization locale

我有关于格式化卢比货币(印度卢比 - 印度卢比)的问题。

通常会将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

参考Indian Numbering System

分隔符在两位数之后,最后一组除外,数字为千位。

我在互联网上搜索过,人们要求使用区域设置en_GB或模式#,##,##,##,##0.00

我在JSTL上尝试使用以下标记:

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

但这似乎并没有解决问题。任何有关此事的帮助将不胜感激。

由于

22 个答案:

答案 0 :(得分:57)

不幸的是DecimalFormat不支持变宽组。因此,它不会完全按照您的要求格式化值:

  

如果提供具有多个分组字符的模式,则最后一个和整数结尾之间的间隔是使用的间隔。所以"#,##,###,####" == "######,####" == "##,####,####"

Java中的大多数数字格式化机制都基于该类,因此继承了这个缺陷。

ICU4J(International Components for Unicode的Java版本)提供了{strong>支持此格式的<{3}}类:

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扩展NumberFormat类(因为它已经扩展了ICU内部基类),确实但是扩展java.text.NumberFormat类,它具有java.text.Format方法。

答案 1 :(得分:20)

使用Android,这对我有用:

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

450500格式化为4,50,500

http://developer.android.com/reference/java/text/DecimalFormat.html - DecimalFormat支持两种分组大小 - 主要分组大小,以及一种用于所有其他分组大小。

答案 2 :(得分:9)

这是你能做的简单事情,

 float amount = 100000;

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

 String moneyString = formatter.format(amount);

 System.out.println(moneyString);

输出将为Rs.100,000.00。

答案 3 :(得分:5)

我也遇到了同样的问题。 我正在使用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 :(得分:4)

简单的解决方案是 -

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

答案 5 :(得分:3)

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。

答案 6 :(得分:2)

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

答案 7 :(得分:2)

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

答案 8 :(得分:2)

如果没有可用的默认区域设置且用户未对区域设置进行任何更改,我们可以使用unicode和decimal格式设置货币符号。如下面的代码所示:

例如设置印度货币符号并格式化值。这将在没有用户更改设置的情况下工作。

    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 :(得分:1)

尝试一下:

NumberFormat.getCurrencyInstance(new Locale("en","IN")).format(number)

“ en”是英语的。 “ IN”代表该国家(印度)。

答案 10 :(得分:1)

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

答案 11 :(得分:0)

更好的答案和动态工作,而不是手动在代码中指定单个Locale。

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)

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

我探索的几个选项如下

...
@EventListener(ApplicationReadyEvent.class)
public void doSomethingAfterStartup() throws UnknownHostException {
    System.setSecurityManager(new SecurityManagerImpl());
}
...

最后一个需要重新获得以下依赖关系

    import java.text.NumberFormat;
    import java.util.Locale;

    class NumberFormatDemo {

        public static void main(String[] args) {
            Double d = 45124853123456.78941;
            NumberFormat nf = NumberFormat.getInstance(Locale.ITALY);
            System.out.println("ITALY representation of " + d + " : " + nf.format(d));

            nf = NumberFormat.getInstance(Locale.GERMANY);
            System.out.println("GERMANY representation of " + d + " : " + nf.format(d));

            nf = NumberFormat.getInstance(Locale.CHINESE);
            System.out.println("CHINESE representation of " + d + " : " + nf.format(d));

            nf = NumberFormat.getInstance(Locale.US);
            System.out.println("US representation of " + d + " : " + nf.format(d));

            nf = NumberFormat.getInstance(Locale.ENGLISH);
            System.out.println("ENGLISH representation of " + d + " : " + nf.format(d));

            nf = NumberFormat.getInstance(Locale.UK);
            System.out.println("UK representation of " + d + " : " + nf.format(d));

            //===================================================
            //ICU4j example
            com.ibm.icu.text.NumberFormat format = com.ibm.icu.text.NumberFormat.getCurrencyInstance(new Locale("en", "in"));
            System.out.println("INDIA representation of " + d + " : " + nf.format(d));
        }
    }

答案 15 :(得分:0)

public static String paiseToString(long paise)
{
    DecimalFormat fmt = new DecimalFormat("#0.00");
    boolean minus = paise < 0;
    StringBuilder sb = new StringBuilder(fmt.format(Math.abs(paise)/100.0));
    for (int index = sb.length()-6; index > 0; index-=2)
    {
        sb.insert(index,',');
    }
    if (minus)
       sb.insert(0,'-');
    return sb.toString();
}

public static String rupeesToString(long rupees)
{
    boolean minus = rupees < 0;
    StringBuilder sb = new StringBuilder(Long.toString(Math.abs(rupees)));
    for (int index = sb.length()-3; index > 0; index-=2)
    {
        sb.insert(index,',');
    }
    if (minus)
       sb.insert(0,'-');
    return sb.toString();
}

// Test the functions
public static void main(String[] args)
{
    // Test for positive values
    long val = 1;
    while (val < Long.MAX_VALUE/10)
    {
        System.out.printf("%28s %28s\n",paiseToString(val),rupeesToString(val));
        val *= 10;
    }
    // Test for negative values
    val = -1;
    while (val > Long.MIN_VALUE/10)
    {
        System.out.printf("%28s %28s\n",paiseToString(val),rupeesToString(val));
        val *= 10;
    }       
}

答案 16 :(得分:0)

在Android上对我来说正常工作

public static String priceFormatWithDec(String price) {
    DecimalFormat decimalFormat = new DecimalFormat("#,##,###.00");
    String format = decimalFormat.format(Double.parseDouble(price));
    return String.format("%s", format);
}

答案 17 :(得分:0)

使用Locale类和getCurrencyInstance,可以获取印度货币格式。

在为印度定义新的语言环境时,对英语使用“ en”,对印地语使用“ hi”。

有关语言环境,请参考https://docs.oracle.com/javase/8/docs/api/java/util/Locale.html

有关getCurrencyInstance的信息,请参见https://docs.oracle.com/javase/8/docs/api/java/text/NumberFormat.html#getCurrencyInstance--

这是一个小实现。

.delete_many()

}

答案 18 :(得分:0)

这对我有用..

public String indianCurrencyFormat(String s) {

    String orignalNo = s;
    String formatted = "";

    if(orignalNo.startsWith("-")) {
        s = s.replace("-","");
    }

    if(orignalNo.contains(".")) {
        if(s.length() > 6){
            StringBuilder sb=new StringBuilder(s);
            s = sb.reverse().toString();

            formatted = s.substring(0,6);
            s = s.substring(6);

            while(s.length() > 1) {
                formatted += "," + s.substring(0,2);
                s = s.substring(2);
            }

            sb = new StringBuilder(formatted+(StringUtils.isNotBlank(s) ? ","+s :""));
            formatted = sb.reverse().toString();
        } else {
            formatted = s;
        }
    } else {
        if(s.length() > 3){
            StringBuilder sb=new StringBuilder(s);
            s = sb.reverse().toString();

            formatted = s.substring(0,3);
            s = s.substring(3);

            while(s.length() > 1) {
                formatted += "," + s.substring(0,2);
                s = s.substring(2);
            }

            sb = new StringBuilder(formatted+(StringUtils.isNotBlank(s) ? ","+s :""));
            formatted = sb.reverse().toString();
        } else {
            formatted = s;
        }
    }

    if (orignalNo.startsWith("-")){
        formatted = "-"+formatted;
    }

    return formatted;
}

答案 19 :(得分:0)

现有库中的默认方法只能显示数千个分隔符。所以我们需要为此编写自定义函数。您可以使用多个子字符串操作来获得所需的结果。

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

您可以查看更多详情here

答案 20 :(得分:-1)

 fun currencyFormatter(inputNumbers: String?): String {
        var formattedNumber = ""
        var decimalPoint=""
        var inputNumber=""

        if (inputNumbers != null) {
            try {
                val sp=inputNumbers.split(".")
                inputNumber=sp[0]
                decimalPoint=sp[1]
            } catch (e: Exception) {
                inputNumber=inputNumbers
            }


            formattedNumber = when {
                inputNumber.length <= 3 -> {
                    inputNumber
                }
                inputNumber.length <= 5 -> {
                    String.format("%s,%s", inputNumber.substring(0, inputNumber.length - 3),
                        inputNumber.substring(inputNumber.length - 3))
                }
                inputNumber.length <= 7 -> {
                    String.format("%s,%s,%s",
                        inputNumber.substring(0, inputNumber.length - 5),
                        inputNumber.substring(inputNumber.length - 5, inputNumber.length - 3),
                        inputNumber.substring(inputNumber.length - 3)
                    )
                }
                inputNumber.length <= 9 -> {
                    String.format("%s,%s,%s,%s",
                        inputNumber.substring(0, inputNumber.length - 7),
                        inputNumber.substring(inputNumber.length - 7, inputNumber.length - 5),
                        inputNumber.substring(inputNumber.length - 5, inputNumber.length - 3),
                        inputNumber.substring(inputNumber.length - 3)
                    )
                }
                else -> inputNumber
            }
        }
        return "$formattedNumber.$decimalPoint"
    }

main(){
 val rs=1200.55f
    print(currencyFormatter(rs.toString()))
}

答案 21 :(得分:-3)

  

ALTER FUNCTION [dbo]。[udf_CurrencyFormat](@ UC varchar(50))RETURNS   varchar(50)AS BEGIN声明@FC varchar(50),@ Scale varchar(3),@ i   bigint = 1,@ a int = 3,@ b int = 2,@ WhileLength bigint,@ UCScale varchar(50),   @Con varchar(20)设置@ Scale = charindex('。',@ UC) - 如果数字有'。'   然后将值设为'0'如果(@Scale!='0')开始设置@ UCScale = @ UC set   @ Con = substring(@ UCScale,charindex('。',@ UCScale),3)set   @ UC = substring(@ UC,0,charindex('。',@ UC)) - substring end   if(cast(len(@UC)as bigint)%2!= 0) - 如果奇数开始设置   @ WhileLength =(cast(len(@UC)as bigint)-3)/ 2 while(@ i&lt; = @ WhileLength) -   length = 3/2 = 3如果长度为9(强制转换(len(@UC)为bigint)-3)/ 2开始设置   @ a = 3 * @我设置@UC = stuff(@ UC,@ a,0,',')设置@ i = @ i + 1 end - while set   @ FC = @ UC end --if odd Scale'0'否则if(cast(len(@UC)as bigint)%2 = 0)    - 如果开始设置@WhileLength =(((cast(len(@UC)as bigint)-1)-3)/ 2)+1 while(@ i&lt; = @ WhileLength)start if(@ i = 1)开始设定   @ UC = stuff(@ UC,@ b,0,',')end else begin set @ b = @ b + 3 set   @ UC = stuff(@ UC,@ b,0,',')结束集@ i = @ i + 1结束集@ FC = @ UC结束   if(@Scale!='0')开始设置@ FC = @ FC + @ Con end --if(@Scale!='0') - 设置   @ FC = @ UC返回@FC END