以印度编号格式显示货币

我有一个关于格式化卢比货币(印度卢比 – 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 

参考印度编号系统

分隔符在两位数之后,除了最后一组,数以千计。

我在互联网上search和人们已经要求使用语言环境en_GB或模式#,##,##,##,##0.00

我试图通过使用下面的标记JSTL:

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

但是这似乎并没有解决这个问题。 任何帮助在这个问题将不胜感激。

谢谢

不幸的是DecimalFormat不支持可变宽度的组。 所以它不会完全按照你的想法格式化数据:

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

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

ICU4J( Unicode的国际组件的Java版本)提供了一个支持这种格式的NumberFormat类:

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

这段代码将产生这个输出:

 卢比10,00,00,000.00 

注意: com.ibm.icu.text.NumberFormat类不扩展java.text.NumberFormat类(因为它已经扩展了一个ICU内部的基类),但它扩展了java.text.Format类,它具有format(Object)方法。

与Android,这对我工作:

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

450500被格式化为4,50,500

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

这里很简单,你可以做,

  float amount = 100000; NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en", "IN")); String moneyString = formatter.format(amount); System.out.println(moneyString); 

输出将是Rs.100,000.00。

我也遇到了同样的问题。 我正在使用DecimalFormat

我没有JSTL知识,但你可以通过我的解决scheme找出一些东西。

因为分组大小在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.##"

简单的解决scheme是 –

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

这就是我所做的,获得印度货币格式。 如果input是1234567890,则表示输出是1,23,45,67,890。

在这里输入图像描述

只需复制过去这个function。 🙂

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

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

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

你可以在这里看到更多的细节。

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

这是更好的答案和dynamic工作,而不是手动指定代码中的单个区域设置。

 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 >selectEnglish(India)

输出:

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

如果没有默认的区域设置可用,并且用户不对区域设置进行任何更改,则可以使用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 

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

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

ALTER FUNCTION [dbo]。[udf_CurrencyFormat](@ UC varchar(50))RETURNS varchar(50)AS BEGIN declare @FC varchar(50),@ Scale varchar(3),@ i bigint = 1,@ a int = 3 ,@ b int = 2,@ WhileLength bigint,@ UCScale varchar(50),@Con varchar(20)set @Scale = charindex('。',@ UC) – 如果number有'。' (@Scale!='0')开始设置@ UCScale = @ UC设置@ Con =子串(@ 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 <= @ WhileLength) – length-3/2 = 3如果长度为9(cast(len(@UC)as bigint)-3)/ 2 (@ UC,@ a,0,',')set @ i = @ i + 1结束 – set @ FC = @ UC结束 – 如果奇数('(@UC)as bigint)%2 = 0) – if even begin set @WhileLength =(((cast(len(@UC)as bigint)-1)-3) / 2)+1 while(@i <= @ WhileLength)if(@ i = 1)开始设置@ UC = stuff(@ UC,@ b,0,',')end else begin set @ b = @ b (@Scale!='0')开始设置@ UC = stuff(@ UC,@ b,0,',')结束设置@ i = @ i + 1结束设置@ FC = FC = @ FC + @ Con end –if(@Scale!='0')–set @ FC = @ UC return @FC END