sistema numeracion india hindú arabica java internationalization locale

java - numeracion - Visualización de moneda en formato de numeración india



sistema de numeracion hindú arabica (15)

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

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:

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

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


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


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)


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


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 here .


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


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.##" .


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


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.


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


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


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


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.