Формат номера валюты Java - PullRequest
       19

Формат номера валюты Java

76 голосов
/ 04 марта 2010

Есть ли способ отформатировать десятичное число следующим образом:

100   -> "100"  
100.1 -> "100.10"

Если это круглое число, пропустите десятичную часть. В противном случае формат с двумя десятичными разрядами.

Ответы [ 20 ]

4 голосов
/ 23 августа 2013

Вы можете просто сделать что-то вроде этого и передать целое число, а затем центы после.

String.format("$%,d.%02d",wholeNum,change);
4 голосов
/ 17 октября 2017

это лучший способ сделать это.

    public static String formatCurrency(String amount) {
        DecimalFormat formatter = new DecimalFormat("###,###,##0.00");
        return formatter.format(Double.parseDouble(amount));
    }

100 -> "100,00"
100,1 -> 100,10

4 голосов
/ 15 октября 2014

Я согласен с @duffymo, что вам нужно использовать методы java.text.NumberFormat для такого рода вещей.На самом деле вы можете выполнить все форматирование в нем без каких-либо строковых сравнений:

private String formatPrice(final double priceAsDouble) 
{
    NumberFormat formatter = NumberFormat.getCurrencyInstance();
    if (Math.round(priceAsDouble * 100) % 100 == 0) {
        formatter.setMaximumFractionDigits(0);
    }
    return formatter.format(priceAsDouble);
}

Пара битов, на которые нужно указать:

  • Все Math.round(priceAsDouble * 100) % 100 просто работает вокругнеточности двойников / поплавков.В основном, просто проверяем, округляем ли мы до сотен мест (возможно, это смещение в США), остаются ли центы.
  • Хитрость для удаления десятичных дробей - это метод setMaximumFractionDigits()

Какой бы ни была ваша логика для определения, следует ли усекать десятичные дроби, setMaximumFractionDigits() следует использовать.

3 голосов
/ 13 октября 2012

Если вы хотите работать с валютами, вы должны использовать класс BigDecimal. Проблема в том, что невозможно сохранить некоторые числа с плавающей запятой в памяти (например, вы можете хранить 5,3456, но не 5,3455), что может привести к неверным вычислениям.

Есть хорошая статья о том, как сотрудничать с BigDecimal и валютами:

http://www.javaworld.com/javaworld/jw-06-2001/jw-0601-cents.html

3 голосов
/ 18 апреля 2013

Формат от 1000000.2 до 1 000 000,20

private static final DecimalFormat DF = new DecimalFormat();

public static String toCurrency(Double d) {
    if (d == null || "".equals(d) || "NaN".equals(d)) {
        return " - ";
    }
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
    DecimalFormatSymbols symbols = DF.getDecimalFormatSymbols();
    symbols.setGroupingSeparator(' ');
    String ret = DF.format(bd) + "";
    if (ret.indexOf(",") == -1) {
        ret += ",00";
    }
    if (ret.split(",")[1].length() != 2) {
        ret += "0";
    }
    return ret;
}
2 голосов
/ 01 ноября 2018
  public static String formatPrice(double value) {
        DecimalFormat formatter;
        if (value<=99999)
          formatter = new DecimalFormat("###,###,##0.00");
        else
            formatter = new DecimalFormat("#,##,##,###.00");

        return formatter.format(value);
    }
2 голосов
/ 15 апреля 2018

Я был достаточно сумасшедшим, чтобы написать свою собственную функцию:

Это преобразует целое число в формат валюты (также можно изменить для десятичных дробей):

 String getCurrencyFormat(int v){
        String toReturn = "";
        String s =  String.valueOf(v);
        int length = s.length();
        for(int i = length; i >0 ; --i){
            toReturn += s.charAt(i - 1);
            if((i - length - 1) % 3 == 0 && i != 1) toReturn += ',';
        }
        return "$" + new StringBuilder(toReturn).reverse().toString();
    }
2 голосов
/ 30 ноября 2013

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

Следующий код:

double moneyWithDecimals = 5.50;
double moneyNoDecimals = 5.00;
System.out.println(jeroensFormat(moneyWithDecimals));
System.out.println(jeroensFormat(moneyNoDecimals));

Вернет:

€ 5,-
€ 5,50

Фактический метод jeroensFormat ():

public String jeroensFormat(double money)//Wants to receive value of type double
{
        NumberFormat dutchFormat = NumberFormat.getCurrencyInstance();
        money = money;
        String twoDecimals = dutchFormat.format(money); //Format to string
        if(tweeDecimalen.matches(".*[.]...[,]00$")){
            String zeroDecimals = twoDecimals.substring(0, twoDecimals.length() -3);
                return zeroDecimals;
        }
        if(twoDecimals.endsWith(",00")){
            String zeroDecimals = String.format("€ %.0f,-", money);
            return zeroDecimals; //Return with ,00 replaced to ,-
        }
        else{ //If endsWith != ,00 the actual twoDecimals string can be returned
            return twoDecimals;
        }
}

Метод displayJeroensFormat, вызывающий метод jeroensFormat ()

    public void displayJeroensFormat()//@parameter double:
    {
        System.out.println(jeroensFormat(10.5)); //Example for two decimals
        System.out.println(jeroensFormat(10.95)); //Example for two decimals
        System.out.println(jeroensFormat(10.00)); //Example for zero decimals
        System.out.println(jeroensFormat(100.000)); //Example for zero decimals
    }

Будет иметь следующий вывод:

€ 10,50
€ 10,95
€ 10,-
€ 100.000 (In Holland numbers bigger than € 999,- and wit no decimals don't have ,-)

Этот код использует вашу текущую валюту.В моем случае это Голландия, так что форматированная строка для меня будет отличаться от той, что в США.

  • Голландия: 999,999,99
  • США: 999 999,99

Просто посмотрите последние 3 символа этих чисел.В моем коде есть оператор if, чтобы проверить, равны ли последние 3 символа значению ", 00".Чтобы использовать это в США, вам, возможно, придется изменить это значение на «.00», если оно уже не работает.

1 голос
/ 07 декабря 2012

Это то, что я сделал, используя вместо этого целое число для представления суммы в центах:

public static String format(int moneyInCents) {
    String format;
    Number value;
    if (moneyInCents % 100 == 0) {
        format = "%d";
        value = moneyInCents / 100;
    } else {
        format = "%.2f";
        value = moneyInCents / 100.0;
    }
    return String.format(Locale.US, format, value);
}

Проблема с NumberFormat.getCurrencyInstance() заключается в том, что иногда вы действительно хотите, чтобы 20 долларов составляли 20 долларов, это выглядит лучше, чем 20,00 долларов.

Если кто-нибудь найдет лучший способ сделать это, используя NumberFormat, я весь слух.

0 голосов
/ 02 июля 2019

Для людей, которые хотят отформатировать валюту, но не хотят, чтобы она основывалась на местной валюте, мы можем сделать это:

val numberFormat = NumberFormat.getCurrencyInstance() // Default local currency
val currency = Currency.getInstance("USD")            // This make the format not locale specific 
numberFormat.setCurrency(currency)

...use the formator as you want...
...