Affichage de la monnaie dans le Format de la numérotation indienne
j'ai une question sur le formatage de la devise de la Roupie (Roupie indienne - INR).
typiquement, une valeur comme 450500
est formatée et affichée comme 450,500
. En Inde, la même valeur est affichée comme 4,50,500
par exemple, les nombres ici sont représentés comme:
1
10
100
1,000
10,000
1,00,000
10,00,000
1,00,00,000
10,00,00,000
Consultez Indiens Système De Numérotation
les séparateurs sont après deux chiffres, sauf pour la dernière série, qui est dans les milliers.
j'ai cherché sur internet et les gens ont demandé à utiliser la locale en_GB
ou le modèle #,##,##,##,##0.00
j'ai essayé ceci sur JSTL en utilisant la balise suivante:
<fmt:formatNumber value="${product.price}" type="currency"
pattern="#,##,##,##,###.00"/>
Mais cela ne semble pas résoudre le problème. Toute aide dans ce domaine seront grandement appréciés.
Merci
15 réponses
malheureusement DecimalFormat
ne supporte pas les groupes de largeur variable. Donc il ne formatera jamais les valeurs exactement comme vous voulez:
Si vous fournissez un modèle avec plusieurs regroupant les personnages, l'intervalle entre la dernière et la fin de l'entier est celui qui est utilisé. So
"#,##,###,####" == "######,####" == "##,####,####"
.
la plupart des mécanismes de formatage de nombres en Java sont basés sur cette classe et donc hériter de cette faille.
ICU4J (la version Java du International Components for Unicode ) fournit un NumberFormat
classe que ne supporter ce formatage:
Format format = com.ibm.icu.text.NumberFormat.getCurrencyInstance(new Locale("en", "in"));
System.out.println(format.format(new BigDecimal("100000000")));
ce code produira cette sortie:
Rs 10,00,00,000.00
Note: la classe com.ibm.icu.text.NumberFormat
ne pas étendre le java.text.NumberFormat
classe (parce qu'elle étend déjà une classe de base interne), il does cependant étendre la java.text.Format
classe, qui a la format(Object)
.
avec Android, cela a fonctionné pour moi:
new DecimalFormat("##,##,##0").format(amount);
450500 est formaté comme 4,50,500
http://developer.android.com/reference/java/text/DecimalFormat.html - Décimalformat supporte deux tailles de groupage-la taille de groupage primaire, et un utilisé pour tous les autres.
voici la chose simple que vous pouvez faire,
float amount = 100000;
NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en", "IN"));
String moneyString = formatter.format(amount);
System.out.println(moneyString);
la sortie sera Rs.100 000 habitants.00.
j'ai aussi eu le même problème.
Je travaillais avec DecimalFormat
.
je n'ai aucune connaissance de JSTL
, mais vous pouvez trouver quelque chose par ma solution.
Que, le regroupement taille reste constante dans DecimalFormat
. J'ai séparé les deux parties, les ai formatées avec des motifs différents et concatté les deux. Voici le code.
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);
}
il fournira le format comme le système de numérotation indienne.
si vous voulez des points décimaux, ajoutez simplement ".##"
dans les deux conditions.
"###"
à "###.##"
et "000"
à "000.##"
.
la solution simple est -
Double amount = 5356673553123.0; //amount is an example ,can be used with any double value
**DecimalFormat IndianCurrencyFormat = new DecimalFormat("##,##,###.00");**
puis l'utiliser comme -
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();
}
C'est ce que j'ai fait, pour obtenir le format de monnaie indienne. si input est 1234567890 signifie sortie est 1,23,45,67,890.
Copiez juste après cette fonction. :)
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);
}
S'il n'y a pas de Locale par défaut disponible et que l'utilisateur ne fait aucun changement à la locale, nous pouvons aller avec la définition du symbole de devise en utilisant unicode et le formatage décimal. Comme dans le code ci-dessous:
Pour, par exemple, définir le symbole de la monnaie indienne et formater la valeur. Cela fonctionnera sans que l'utilisateur ne modifie les paramètres.
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));
sortie:
₹12,324.13
//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);
version Kotlin, il fonctionne sur 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)
}
les méthodes par défaut dans les bibliothèques existantes ne peuvent afficher que des milliers de séparateurs. nous avons donc besoin d'écrire fonction personnalisée pour cela. Vous pouvez utiliser plusieurs opérations de sous-traitance pour obtenir le résultat désiré.
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;
}
et 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;
}
vous pouvez voir plus de détails ici .
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);
}
}
il est préférable de répondre et fonctionne dynamiquement au lieu de spécifier une seule Locale dans le code manuellement.
public String convertToDefaultCurrencyFormat(String amountToConvert){
NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.getDefault());
String moneyString = formatter.format(Double.valueOf(amountToConvert));
return moneyString;
}
pour Roupies indiennes changement de format langue dans votre appareil Android:
Setting > Language & Input Settings >
choisir English(India)
sortie:
₹10,00,000 (Starting with Indian Rupee symbol)
sur Android.intensifs.texte.NumberFormat est disponible après api Niveau 24 seulement. Donc, pour supporter la version inférieure, j'ai écrit ma propre méthode 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();
}
ALTER FUNCTION [dbo].[udf_CurrencyFormat](@UC varchar(50)) retourne varchar (50) AS BEGIN declare @FC varchar (50),@Scale varchar (3),@i bigint=1,@int=3,@int b=2,@WhileLength bigint,@UCScale varchar(50), @Con varchar (20) set @Scale=charindex('.', @UC) --si le nombre a'.' alors, attribuez la valeur " 0 " si (@Scale!= '0') begin set @UCScale=@UC set @Con=substring (@UCScale, charindex('.', @UCScale), 3) set @UC=substrat (@UC, 0, charindex('.', @UC)) -- fin de la chaîne si(cast(len(@UC), bigint)%2!=0) --s'il est impair, commencer à définir @WhileLength=(cast(len(@UC), bigint)-3)/2 si(@i<=@WhileLength) -- longueur-3/2 = 3 si la longueur est de 9 (cast (len (@UC) en tant que bigint)-3) / 2 @a=3*@i set @UC = (@UC,@a,0,',') set @i=@i+1 fin --alors que @FC=@UC fin --s'il est impair, à l'Échelle '0' else if(cast(len(@UC), bigint)%2=0) -- si même le début de set @WhileLength=((cast (len (@UC) comme 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=(@UC,@b,0,",") en fin de set @i=@i+1 fin de set @FC=@UC fin si(@Échelle!= '0') begin set @FC=@FC+@Con end --if (@Scale!='0') --réglé @FC=@UC return @FC END