web-dev-qa-db-fra.com

Affichage de la devise au format de numérotation indienne

J'ai une question sur le formatage de la devise Roupie (Roupie Indienne - INR).

Généralement, une valeur telle que 450500 est formatée et affichée sous la forme 450,500. En Inde, la même valeur est affichée sous la forme 4,50,500

Par exemple, les nombres ici sont représentés par:

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

Refer Indian Numbering System

Les séparateurs sont composés de deux chiffres, à l'exception du dernier ensemble, qui est exprimé en milliers.

J'ai effectué une recherche sur Internet et des personnes ont demandé à utiliser les paramètres régionaux 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 en la matière sera grandement appréciée.

Merci

46
Mihir

Malheureusement, DecimalFormat ne prend pas en charge les groupes de largeur variable. Donc, il ne formera jamais les valeurs exactement comme vous le souhaitez:

Si vous fournissez un modèle avec plusieurs caractères de regroupement, l'intervalle entre le dernier et la fin de l'entier est celui utilisé. Alors "#,##,###,####" == "######,####" == "##,####,####".

La plupart des mécanismes de formatage de nombres en Java sont basés sur cette classe et héritent donc de cette faille.

ICU4J (la version Java de International Components for Unicode ) fournit une NumberFormat class qui fait prend en charge 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:

com.ibm.icu.text.NumberFormat fait pas étendre le Java.text.NumberFormat class (car elle étend déjà une classe de base interne à ICU). Elle fait cependant étendre le Java.text.Format classe, qui a la méthode format(Object) .

54
Joachim Sauer

Avec Android, cela a fonctionné pour moi:

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

450500 devient 4,50,500

http://developer.Android.com/reference/Java/text/DecimalFormat.html - DecimalFormat prend en charge deux tailles de groupe - la taille du groupe principal et l'autre utilisée pour toutes les autres.

19
Kiran

voici une 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.00. 

9
CleanX

Je me suis aussi retrouvé dans le même problème… Je travaillais avec DecimalFormat.

Je n'ai aucune connaissance de JSTL mais vous pouvez trouver quelque chose avec ma solution.

Au fur et à mesure, la taille du groupe reste constante dans DecimalFormat. J'ai séparé les deux parties, les ai formatées avec des motifs différents et les ai concaténées. 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 un format similaire au système de numérotation indien.

Si vous voulez des points décimaux, ajoutez simplement ".##" dans les deux conditions.

"###" à "###.##" et "000" à "000.##".

5
Akshat

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 utilisez-le comme -

String formattedAmount = IndianCurrencyFormat.format(amount);
4
NikHiL Bonte
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 devise indienne. si l'entrée est 1234567890, la sortie est 1,23,45,67,890.

3
Palanivelraghul

S'il n'y a pas de paramètres régionaux disponibles par défaut et que l'utilisateur ne modifie pas les paramètres régionaux, nous pouvons définir le symbole monétaire à l'aide du formatage unicode et décimal. Comme dans le code ci-dessous:

Par exemple Définition du symbole monétaire indien et mise en forme de 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
SimplyProgrammer

enter image description here__extrait de code

Just Copy past this 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);
        }
2
Nishant Shah

Version Kotlin, cela fonctionne sur l'API Android 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)
}
2
Kavin Varnan
//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
G M

Les méthodes par défaut des bibliothèques existantes ne peuvent afficher que des milliers de séparateurs. nous avons donc besoin d'écrire une fonction personnalisée pour cela. Vous pouvez utiliser plusieurs opérations de sous-chaîne pour obtenir le résultat souhaité.

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
user3693466
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
Amit gupta

Il vaut mieux répondre et fonctionne de manière dynamique au lieu de spécifier manuellement un seul paramètre régional.

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

pour changer le format de la roupie indienne Langue dans votre appareil Android:

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

Sortie:

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

Sur Android, Android.icu.text.NumberFormat est disponible uniquement après le niveau 24 de l'API. 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
ankit209