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

46
demandé sur MaDa 2011-03-21 17:41:46

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

53
répondu Joachim Sauer 2014-08-01 14:15:55

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.

18
répondu Kiran 2013-08-31 03:51:51

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.

9
répondu CleanX 2014-11-19 10:50:18

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

4
répondu Akshat 2013-12-06 06:01:43

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);
4
répondu NikHiL Bonte 2016-03-09 06:14:03
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.

3
répondu Palanivelraghul 2017-03-13 08:42:32

enter image description here

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);
        }
2
répondu Nishant Shah 2015-07-17 05:29:04

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
2
répondu SimplyProgrammer 2017-07-31 12:08:16
//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);
1
répondu G M 2016-12-01 15:49:54

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)
}
1
répondu Kavin Varnan 2017-11-01 05:22:29

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 .

0
répondu user3693466 2014-05-31 04:56:48
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);
     }
}
0
répondu Amit gupta 2016-09-27 04:24:35

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)
0
répondu Er. Kaushik Kajavadara 2017-01-20 07:39:49

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();
}
0
répondu ankit209 2017-10-12 07:56:41

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

-3
répondu Deepak Bhardwaj 2018-03-22 06:58:50