Visualización de moneda en formato de numeración india

Tengo una pregunta sobre el formato de la moneda rupia (Rupia india – INR).

Normalmente, un valor como 450500 se formatea y se muestra como 450,500 . En India, el mismo valor se muestra como 4,50,500

Por ejemplo, los números aquí se representan como:

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

Consulte el sistema de numeración indio

Los separadores tienen dos dígitos, excepto el último conjunto, que está en miles.

He buscado en Internet y la gente me ha pedido que use la configuración regional en_GB o el patrón #,##,##,##,##0.00

Intenté esto en JSTL usando la siguiente etiqueta:

  

Pero esto no parece resolver el problema. Cualquier ayuda en este asunto será muy apreciada.

Gracias

Desafortunadamente DecimalFormat no admite grupos de ancho variable. Por lo tanto, nunca formateará los valores exactamente como lo desee:

Si proporciona un patrón con múltiples caracteres de agrupación, el intervalo entre el último y el final del entero es el que se utiliza. Entonces "#,##,###,####" == "######,####" == "##,####,####" .

La mayoría de los mecanismos de formato de números en Java se basan en esa clase y, por lo tanto, heredan este defecto.

ICU4J (la versión de Java de International Components for Unicode ) proporciona una clase NumberFormat que admite este formato:

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

Este código producirá esta salida:

  Rs 10,00,00,000.00 

Nota: la clase com.ibm.icu.text.NumberFormat no amplía la clase java.text.NumberFormat (porque ya extiende una clase base interna ICU), pero extiende la clase java.text.Format , que tiene el método de format(Object) .

Con Android, esto funcionó para mí:

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

450500 se formatea como 4,50,500

http://developer.android.com/reference/java/text/DecimalFormat.html – DecimalFormat admite dos tamaños de agrupación: el tamaño de agrupación principal y el utilizado para todos los demás.

aquí hay algo simple que puedes hacer,

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

La salida será Rs.100,000.00.

También me encontré en el mismo problema. Estaba trabajando con DecimalFormat .

No tengo conocimiento de JSTL pero puedes descubrir algo con mi solución.

Como, el tamaño de agrupación permanece constante en DecimalFormat . Separé ambas partes, las formateé con diferentes patrones y concat ambas. Aquí está el código.

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

Proporcionará un formato como Indian Numbering System.

Si desea puntos decimales, solo agregue ".##" en ambas condiciones.

"###" a "###.##" y "000" a "000.##" .

La solución simple es –

 Double amount = 5356673553123.0; //amount is an example ,can be used with any double value **DecimalFormat IndianCurrencyFormat = new DecimalFormat("##,##,###.00");** 

luego úsalo como –

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

Esto es lo que hice, para obtener el formato de moneda india. si la entrada es 1234567890 significa que la salida es 1,23,45,67,890.

enter image description here

Simplemente copie más allá de esta función. 🙂

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

Si no hay una Configuración regional predeterminada disponible y el usuario no realiza ningún cambio en la configuración regional, podemos configurar el símbolo de la moneda mediante formato unicode y decimal. Como en el siguiente código:

Por ejemplo, configurar el símbolo de moneda india y formatear el valor. Esto funcionará sin que el usuario realice cambios en la configuración.

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

Salida:

 ₹12,324.13 

Los métodos predeterminados en las bibliotecas existentes solo pueden mostrar miles de separadores. entonces necesitamos escribir una función personalizada para esto. Puede usar la operación de subcadena múltiple para obtener el resultado deseado.

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

Y en 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; } 

Puedes ver más detalles aquí .

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

Es una mejor respuesta y funciona dinámicamente en lugar de especificar una sola configuración regional en el código de forma manual.

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

para rupias indias formato de cambio de idioma en su dispositivo Android:

Setting > Language & Input Settings > elija English(India)

Salida:

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

En Android android.icu.text.NumberFormat está disponible solo después del nivel 24 de api. Entonces para apoyar la versión más baja escribí mi propio método en 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 

Versión de Kotlin, funciona en 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 declara @FC varchar (50), @ Scachar varchar (3), @ i bigint = 1, @ a int = 3 , @ b int = 2, @ WhileLength bigint, @ UCScale varchar (50), @Con varchar (20) set @ Scale = charindex (‘.’, @ UC) –si el número tiene ‘.’ entonces valor else else ‘0’ si (@Scale! = ‘0’) comienza set @ UCScale = @ UC set @ Con = substring (@ UCScale, charindex (‘.’, @ UCScale), 3) set @ UC = substring ( @ UC, 0, charindex (‘.’, @ UC)) – subcadena final if (cast (len (@UC) como bigint)% 2! = 0) –si impar comienza set @ WhileLength = (cast (len (@UC) como bigint) -3) / 2 while (@i < = @ WhileLength) - length-3/2 = 3 si la longitud es 9 (cast (len (@UC) como 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 impar Escala '0' si if (cast (len (@UC) como bigint)% 2 = 0) --si incluso comienzas a establecer @WhileLength = (((cast (len (@UC) como bigint) -1) -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 = cosas (@ UC, @ b, 0, ',') final set @ i = @ i + 1 final set @ FC = @ UC final si (@Scale! = '0') begin set @ FC = @ FC + @ Con end --if (@Scale! = '0') --set @ FC = @ UC return @FC END