1
votes

NumberFormat.getCurrencyInstance () ne renvoie pas le symbole de devise pour les paramètres régionaux CHINE et FRANCE (jdk-1.8)

J'ai écrit un programme pour renvoyer des valeurs doubles avec les symboles monétaires de certains pays. Pour cela, j'utilise la méthode getCurrencyInstance() pour obtenir le symbole d'un pays particulier.

Le problème est spécifique au JDK-1.8 de mon ordinateur portable et fonctionne bien sur le compilateur en ligne. Le problème auquel je suis confronté est que le symbole monétaire de la CHINE et de la FRANCE est représenté par un «?». Mais pour l' INDE et les États - Unis , les symboles corrects sont affichés.

Je travaille sur ce problème depuis un moment. Par conséquent, toutes les pistes seraient utiles.

Voici mon code:

12324.134
US: $12,324.13
India: Rs.12,324.13
China: ?12,324.13
France: 12 324,13 ?

La sortie correspondante sur ma machine est:

import java.util.Scanner;
import java.text.NumberFormat;
import java.util.Locale;

public class Solution {

public static void main(String[] args) {
    /* Read input */
    Scanner scanner = new Scanner(System.in);
    double payment = scanner.nextDouble();
    scanner.close();

    /* Create custom Locale for India.
    Locale indiaLocale = new Locale("en", "IN");

    /* Create NumberFormats using Locales */
    NumberFormat us     = NumberFormat.getCurrencyInstance(Locale.US);
    NumberFormat india  = NumberFormat.getCurrencyInstance(indiaLocale);
    NumberFormat china  = NumberFormat.getCurrencyInstance(Locale.CHINA);
    NumberFormat france = NumberFormat.getCurrencyInstance(Locale.FRANCE);

    /* Print output */        
    System.out.println("US: "     + us.format(payment));
    System.out.println("India: "  + india.format(payment));
    System.out.println("China: "  + china.format(payment));
    System.out.println("France: " + france.format(payment));
}
}


5 commentaires

Alors sur quoi imprimez-vous? Qu'est-ce qu'il n'utilise pas?


Le problème est probablement que votre périphérique de sortie n'est pas correctement configuré pour afficher le symbole € et tout ce que la Chine utilise correctement. Ou peut-être incapable de le faire du tout.


Je ne peux pas reproduire. Sur mon Java 1.8.0_91, j'obtiens 12 324,13 € ¥12,324.13 pour la Chine et 12 324,13 € pour la France.


Jetez un œil à ceci, un problème similaire - stackoverflow.com/questions/4967430/...


Copie possible des symboles de devise manquants sur le serveur Linux


4 Réponses :


0
votes

pour la Chine, utilisez ce code. GetCurrency (). GetSymbol (locale) de la classe Numberformat renverra le symbole monétaire pour une région particulière. System.out.println("China: " + china.getCurrency().getSymbol(Locale.CHINA) + china.format(payment));

Pour la France, utilisez ce System.out.println("France: " + france.format(payment) + " " + france.getCurrency().getSymbol(Locale.FRANCE));


1 commentaires

Veuillez expliquer votre code et le formater. Si vous avez besoin d'aide, je vous suggère de visiter le Centre d'aide pour plus d'informations sur Comment rédiger une bonne réponse



1
votes

Le problème dans le défi Hackerrank est qu'il n'y a pas d'encodage UTF-8. Essayez d'utiliser ceci:

import java.util.Scanner;
import java.text.NumberFormat;
import java.util.Locale;

public class Solution {

public static void main(String[] args) {
    /* Read input */
    Scanner scanner = new Scanner(System.in);
    double payment = scanner.nextDouble();
    scanner.close();

    /* Create custom Locale for India.*/
    Locale indiaLocale = new Locale("en", "IN");

    /* Create NumberFormats using Locales */
    NumberFormat us     = NumberFormat.getCurrencyInstance(Locale.US);
    NumberFormat india  = NumberFormat.getCurrencyInstance(indiaLocale);
    NumberFormat china  = NumberFormat.getCurrencyInstance(Locale.CHINA);
    NumberFormat france = NumberFormat.getCurrencyInstance(Locale.FRANCE);

    /* Print output */
    try {
      System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out), true, "UTF-8"));        
      System.out.println("US: "     + us.format(payment));
      System.out.println("India: "  + india.format(payment));
      System.out.println("China: "  + china.format(payment));
      System.out.println("France: " + france.format(payment));
    } catch (Exception e) {
      System.out.println("HackerRank please fix your test terminal");
    }
  }
}


0 commentaires

0
votes

La solution sera comme ceci; ......

Pour Indian Ruppe, il n'y a pas de devise. Nous devons le formater en utilisant decimalFormatter comme indiqué ci-dessous.

DecimalFormat IndianCurrencyFormat = new DecimalFormat("##,##,###.00");
            NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.US);
            NumberFormat nf1 = NumberFormat.getCurrencyInstance(Locale.CHINA);
            NumberFormat nf2 = NumberFormat.getCurrencyInstance(Locale.FRANCE);
            String us = nf.format(payment);
            String india ="Rs." + IndianCurrencyFormat.format(payment);
            String china =nf1.format(payment);
            String france =nf2.format(payment);
           System.out.println("US: " + us);
        System.out.println("India: " + india);
        System.out.println("China: " + china);
        System.out.println("France: " + france);


0 commentaires

0
votes

Ma solution fait simplement que la sous-chaîne se débarrasse du problème UTF-8

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
/*
 * input 12324.134
 * output
 * US: $12,324.13
 * India: Rs.12,324.13
 * China: ï¿¥12,324.13
 * France: 12 324,13 €
 */
import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double payment = scanner.nextDouble();
        scanner.close();

        // Write your code here.

        DecimalFormat formatter = new DecimalFormat("###,###.00");
        double roundOff = Math.round(payment * 100) / 100.00;
        String us = NumberFormat.getCurrencyInstance().format(roundOff);
        String india = "Rs." + formatter.format(roundOff);
        String china = NumberFormat.getCurrencyInstance(Locale.CHINA).format(roundOff);
        String france_initial = NumberFormat.getCurrencyInstance(Locale.FRENCH).format(roundOff);
        int len = france_initial.length();
        String france = france_initial.substring(0, len - 1) + " €";
        System.out.println("US: " + us);
        System.out.println("India: " + india);
        System.out.println("China: " + china);
        System.out.println("France: " + france);
    }
}


0 commentaires