Подтвердить что ты не робот

Java Преобразование долго в валюте

У меня проблемы с конвертацией длинных (центов) в валютный формат.

Мой код:

long doublePayment = 1099;  //Should equal $10.99
DecimalFormat dFormat = new DecimalFormat();
String formattedString = dFormat.format(doublePayment);
System.out.println(formattedString);

Выход: 1,099

Я также попробовал:

long doublePayment = 1099;
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
String s = n.format(doublePayment);
System.out.println(s);

Так как это центы, результат должен быть 10.99 или $ 10.99.

Не могу понять, что я делаю не так. Спасибо!!!

4b9b3361

Ответ 1

Чтобы конвертировать центы в доллары, вы можете использовать

long doublePayment = 1099;
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
String s = n.format(doublePayment / 100.0);
System.out.println(s);

Это будет точным до 70 триллионов долларов.

Ответ 2

В случае, если вам уже давно нужно начать, вы все равно должны использовать java.math.BigDecimal.

    long doublePayment = 1099;
    BigDecimal payment = new BigDecimal(doublePayment).movePointLeft(2);
    System.out.println("$" + payment); // produces: $10.99

Пусть это снова будет сказано вслух: никогда не следует использовать переменные с плавающей запятой, чтобы хранить деньги/валюту.

Ответ 3

Ваш литерал 1099, который составляет тысячу девяносто девять, и справляется с правилами Java для целочисленных литералов. Согласно вашему языку JVM, это число представлено 1,099. Если бы вы были в Европе, это было бы 1.099. Таким образом, это не проблема с вашим выходом, но с вашим входом.

Проблема в том, что вы должны представлять значение фиксированной точки, но вы не знаете java.math.BigDecimal и попытайтесь подделать его. Вещи будут нарушены, когда вы сделаете некоторые вычисления. Не делайте этого.

Это то, что вы должны делать. Просто (это намного меньше кода тоже):

BigDecimal payment = new BigDecimal("10.99");
System.out.println(String.format("$%.2f", payment));

Обратите внимание, как вы действительно инициализируете число с помощью Строка. Кроме того, String.format() позаботится текущего языкового стандарта, или вы можете предоставить требуемый файл с помощью перегруженного метода.

Ответ 4

double doublePayment = 10.99; Вам нужно предоставить такую ​​валюту. NumberFormat не поймет, предоставляете ли вы его в центах или $, если он не видит десятичную точку

Ответ 5

Это не проблема с форматированием, это проблема с вводом. Разделите свой вход на 100, и все будет установлено.

float payment = 1099 / ((float) 100);

Ответ 6

Использовать форматировщик валют:

NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.ENGLISH);
String output = nf.format(value);
System.out.println(value + " " + output);

Ответ 7

Ни один из этих ответов не учитывает, что валюты в разных локалях имеют разное количество дробных цифр. Например, японская иена имеет ноль дробных цифр, а у иорданского динара - три, а затем, конечно, у доллара США - две. Я считаю, что это более подходящее решение:

    long payment = 1099L;
    BigDecimal bd = new BigDecimal(payment);

    Locale jpLocale = new Locale("ja", "JP");//Japan

    Currency jpCurrency = Currency.getInstance(jpLocale);
    NumberFormat jpnf = NumberFormat.getCurrencyInstance(jpLocale);
    int jpNumFractionalDigits = jpCurrency.getDefaultFractionDigits();

    BigDecimal jpbd = bd.movePointLeft(jpNumFractionalDigits);


    Locale usLocale = new Locale("en", "US");//United States

    Currency usCurrency = Currency.getInstance(usLocale);
    NumberFormat usnf = NumberFormat.getCurrencyInstance(usLocale);
    int usNumFractionalDigits = usCurrency.getDefaultFractionDigits();

    BigDecimal usbd = bd.movePointLeft(usNumFractionalDigits);



    System.out.println(jpnf.format(jpbd)); //prints ¥1,099
    System.out.println(usnf.format(usbd));//prints $10.99