简体   繁体   English

NumberFormat.getCurrencyInstance() 不返回语言环境中国和法国的货币符号 (jdk-1.8)

[英]NumberFormat.getCurrencyInstance() not returning currency symbol for Locales CHINA and FRANCE (jdk-1.8)

I have written a program to return double values with the currency symbols of some countries.我编写了一个程序,用某些国家的货币符号返回双精度值。 For this I am using getCurrencyInstance() method to get symbol of particular country.为此,我使用getCurrencyInstance()方法来获取特定国家/地区的符号。

The problem is specific to my laptop's JDK-1.8 and works fine on online compiler.该问题特定于我的笔记本电脑的JDK-1.8 ,并且在在线编译器上运行良好。 The problem, I am facing is that the currency symbol for CHINA and FRANCE are represented with '?'.我面临的问题是中国法国的货币符号用“?”表示。 But for INDIA and US , correct symbols are shown.但对于INDIAUS ,会显示正确的符号。

I am working on this problem for a bit now.我现在正在研究这个问题。 Hence, any leads would be helpful.因此,任何线索都会有所帮助。

Here is my code:这是我的代码:

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

The corresponding output on my machine is:我机器上对应的output是:

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

for china use this code.对于中国,请使用此代码。 Numberformat class's getCurrency().getSymbol(locale) will return currency symbol for particular region. Numberformat 类的 getCurrency().getSymbol(locale) 将返回特定地区的货币符号。 System.out.println("China: " + china.getCurrency().getSymbol(Locale.CHINA) + china.format(payment));

For France use this System.out.println("France: " + france.format(payment) + " " + france.getCurrency().getSymbol(Locale.FRANCE));对于法国,请使用此System.out.println("France: " + france.format(payment) + " " + france.getCurrency().getSymbol(Locale.FRANCE));

The problem in Hackerrank challenge is that there is no UTF-8 encoding. Hackerrank 挑战中的问题是没有 UTF-8 编码。 Try to use this:尝试使用这个:

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

The Solution will be like this;......解决方案将是这样的;......

For Indian Ruppe,there is no Currency.. We have to format it using decimalFormatter as given below.对于 Indian Ruppe,没有货币。我们必须使用如下所示的 decimalFormatter 对其进行格式化。

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

My solution just do substring get rid of UTF-8 issue我的解决方案只是让 substring 摆脱 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);
    }
}
  1. In Case if you need to set symbol for a currency or If you want to customize currency symbol, you can try this.如果您需要为货币设置符号或如果您想自定义货币符号,您可以试试这个。

     Locale indialocal = new Locale("en","India"); NumberFormat india = NumberFormat.getCurrencyInstance(indialocal); DecimalFormatSymbols deciFs = new DecimalFormatSymbols(); deciFs.setCurrencySymbol("Rs."); ((DecimalFormat) india).setDecimalFormatSymbols(deciFs); System.out.println("India: " + india.format(payment));

You can also try this code, because above codes are not working on my laptop.你也可以试试这个代码,因为上面的代码在我的笔记本电脑上不起作用。 Specially for the symbol of YEN专门用于日元的符号

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("Input --> ");
    double payment = scanner.nextDouble();
    scanner.close();
    Locale indiaLocale = new Locale("en", "IN");
    NumberFormat u = NumberFormat.getCurrencyInstance(Locale.US);
    NumberFormat i = NumberFormat.getCurrencyInstance(indiaLocale);
    NumberFormat c = NumberFormat.getCurrencyInstance(Locale.SIMPLIFIED_CHINESE);
    NumberFormat f = NumberFormat.getCurrencyInstance(Locale.FRANCE);

    System.out.println("US: " + u.format(payment));
    System.out.println("India: " + i.format(payment));
    System.out.println("China: " + c.format(payment));
    System.out.println("France: " + f.format(payment));


}

In your console -->在您的控制台中 -->

Input --> 12324.134输入 --> 12324.134

US: $1,232.13美国:1,232.13 美元

India: ₹1,232.13印度:1,232.13 卢比

China: ¥1,232.13中国:¥1,232.13

France: 1 232,13 €法国:1 232,13 欧元

If your solution doesn't work because of yen symbol, try pasting that code, but in Java 7:如果您的解决方案由于日元符号而不起作用,请尝试粘贴该代码,但在 Java 7 中:

import java.io.*;
import java.util.*;
import java.text.NumberFormat;
import java.text.DecimalFormat;



public class Solution {

    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        Double number = sc.nextDouble();
        DecimalFormat IndianCurrencyFormat = new DecimalFormat("##,##,###.00");
       
  
        
        String formattedStr = NumberFormat.getCurrencyInstance(Locale.US).format(number);

        System.out.println("US: " + formattedStr);
        System.out.println("India: Rs." + IndianCurrencyFormat.format(number));
        formattedStr = NumberFormat.getCurrencyInstance(Locale.CHINA).format(number);
        System.out.println("China: " + formattedStr);
        formattedStr = NumberFormat.getCurrencyInstance(Locale.FRANCE).format(number);
        System.out.println("France: " + formattedStr);

        
        
        
    }
}

In Java 15 that doesn't work.在 Java 15 中这是行不通的。

Its very some difficult task when working with the numbers to format currencies, By creating local instances through.getCurrencyInstances(new Locale("X", "Y")) meth for CHINA:"zh", "CN" for France: "sk", "SK" required method example:在使用数字格式化货币时,这是一项非常艰巨的任务,通过创建本地实例 through.getCurrencyInstances(new Locale("X", "Y")) meth for CHINA:"zh", "CN" for France: "sk ", "SK" 所需方法示例:

`import java.util. `导入 java.util。 ; ; import java.text.导入 java.text。 ; ; import java.text.NumberFormat;导入 java.text.NumberFormat;

public class Solution {公共 class 解决方案 {

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    double payment = scanner.nextDouble();
    scanner.close();
    
    // Write your code here.
    
    NumberFormat us1 = NumberFormat.getCurrencyInstance(new Locale("en", "US"));
    String us = us1.format(payment);
    
    NumberFormat india1 = NumberFormat.getCurrencyInstance(new Locale("en", "IN"));
    String india = india1.format(payment);
    
    NumberFormat china1 = NumberFormat.getCurrencyInstance(new Locale("zh", "CN"));
    String china = china1.format(payment);
    
    NumberFormat fr1 = NumberFormat.getCurrencyInstance(new Locale("sk", "SK"));
    String fr = fr1.format(payment);
    
    System.out.println("US: " +us);
    System.out.println("India: " +india);
    System.out.println("China: " +china);
    System.out.println("France: " +fr);
}

}` }`

This is helpful for HackerRank.这对 HackerRank 很有帮助。

Create local variable because India haven't currency code Refer to this -https://docs.oracle.com/javase/tutorial/i18n/locale/create.html创建本地变量,因为印度没有货币代码参考这个 -https://docs.oracle.com/javase/tutorial/i18n/locale/create.html

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
import java.text.NumberFormat;
import java.util.Locale;

public class Solution {
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double payment = scanner.nextDouble();
        scanner.close();
        
       
        
        Locale indiaLocale = new Locale("en", "IN");

        // Write your code here.
        NumberFormat us = NumberFormat.getCurrencyInstance(Locale.US);
        NumberFormat india = NumberFormat.getCurrencyInstance(indiaLocale);
        NumberFormat china = NumberFormat.getCurrencyInstance(Locale.CHINA);
        NumberFormat france = NumberFormat.getCurrencyInstance(Locale.FRANCE);
        
        if(payment>=0 || payment<=Math.pow(10,9)){
            
            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));
        
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 NumberFormat.getCurrencyInstance()的Currency格式基于什么标准? - What standard is the Currency formatting of NumberFormat.getCurrencyInstance() based on? 修改NumberFormat.getCurrencyInstance()返回的NumberFormat - Modifying the NumberFormat returned by NumberFormat.getCurrencyInstance() NumberFormat.getCurrencyInstance()将所有内容都归零? - NumberFormat.getCurrencyInstance() turning everything to zero? NumberFormat.getCurrencyInstance() 格式化为带空格的字符串,即没有空格。 如何删除它? - NumberFormat.getCurrencyInstance() formats to a string with whitespace, that is no whitespace. How to remove it? 如何将 NumberFormat.getCurrencyInstance(Locale.US) 转换为 Double - How to convert NumberFormat.getCurrencyInstance(Locale.US) to Double Java:获取NumberFormat.getCurrencyInstance()结果的不同部分 - java: get different parts of NumberFormat.getCurrencyInstance() result Servlet全球化NumberFormat.getCurrencyInstance(Locale.JAPAN)无法正常工作 - Servlet Globalization NumberFormat.getCurrencyInstance(Locale.JAPAN) doen't work properly JDK-1.8 在 JAVA_HOME 缺少“服务器”JVM - JDK-1.8 missing 'server' JVM at JAVA_HOME Java默认NumberFormat货币符号 - Java Default NumberFormat Currency symbol x64 jdk-1.8 能否在带有 Apple Silicon (M1) 芯片的 Mac 上工作? - Will x64 jdk-1.8 work in Mac with Apple Silicon (M1) Chip?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM