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

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

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

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

Ответ 1

Я сомневаюсь. Проблема в том, что 100 никогда не 100, если это float, обычно 99.9999999999 или 100.0000001 или что-то в этом роде.

Если вы хотите отформатировать его таким образом, вам нужно определить epsilon, то есть максимальное расстояние от целочисленного числа, и использовать целочисленное форматирование, если разница меньше, и поплавок в противном случае.

Что-то вроде этого сделало бы трюк:

public String formatDecimal(float number) {
  float epsilon = 0.004f; // 4 tenths of a cent
  if (Math.abs(Math.round(number) - number) < epsilon) {
     return String.format("%10.0f", number); // sdb
  } else {
     return String.format("%10.2f", number); // dj_segfault
  }
}

Ответ 2

Я бы рекомендовал использовать пакет java.text:

double money = 100.1;
NumberFormat formatter = NumberFormat.getCurrencyInstance();
String moneyString = formatter.format(money);
System.out.println(moneyString);

Это имеет дополнительное преимущество в отношении специфики локали.

Но, если вам нужно, обрезайте строку, которую вы вернетесь, если это целый доллар:

if (moneyString.endsWith(".00")) {
    int centsIndex = moneyString.lastIndexOf(".00");
    if (centsIndex != -1) {
        moneyString = moneyString.substring(1, centsIndex);
    }
}

Ответ 3

double amount =200.0;
Locale locale = new Locale("en", "US");      
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale);
System.out.println(currencyFormatter.format(amount));

или

double amount =200.0;
System.out.println(NumberFormat.getCurrencyInstance(new Locale("en", "US"))
        .format(amount));

Лучший способ отображения валюты

Выход

$200,00

Если вы не хотите использовать знак, используйте этот метод

double amount = 200;
DecimalFormat twoPlaces = new DecimalFormat("0.00");
System.out.println(twoPlaces.format(amount));

200.00

Это также может быть использовано (с разделителем тысяч)

double amount = 2000000;    
System.out.println(String.format("%,.2f", amount));          

2,000,000.00

Ответ 4

Я не нашел хорошего решения после поиска в Google, просто отправьте мое решение для других ссылок. используйте priceToString для форматирования денег.

public static String priceWithDecimal (Double price) {
    DecimalFormat formatter = new DecimalFormat("###,###,###.00");
    return formatter.format(price);
}

public static String priceWithoutDecimal (Double price) {
    DecimalFormat formatter = new DecimalFormat("###,###,###.##");
    return formatter.format(price);
}

public static String priceToString(Double price) {
    String toShow = priceWithoutDecimal(price);
    if (toShow.indexOf(".") > 0) {
        return priceWithDecimal(price);
    } else {
        return priceWithoutDecimal(price);
    }
}

Ответ 5

Да. Вы можете использовать java.util.formatter. Вы можете использовать строку форматирования, такую ​​как "% 10.2f"

Ответ 6

Я использую этот (используя StringUtils из commons-lang):

Double qty = 1.01;
String res = String.format(Locale.GERMANY, "%.2f", qty);
String fmt = StringUtils.removeEnd(res, ",00");

Вы должны заботиться только о локали и соответствующей Строке для измельчения.

Ответ 7

Я думаю, что это просто и понятно для печати валюты:

DecimalFormat df = new DecimalFormat("$###,###.##"); // or pattern "###,###.##$"
System.out.println(df.format(12345.678));

: $12 345,68

И одно из возможных решений вопроса:

public static void twoDecimalsOrOmit(double d) {
    System.out.println(new DecimalFormat(d%1 == 0 ? "###.##" : "###.00").format(d));
}

twoDecimalsOrOmit((double) 100);
twoDecimalsOrOmit(100.1);

Вывод:

100

100.10

Ответ 8

Обычно нам нужно сделать обратное, если ваше поле json money - это float, оно может быть равно 3.1, 3.15 или просто 3.

В этом случае вам может понадобиться округлить его для правильного отображения (и иметь возможность использовать маску в поле ввода позже):

floatvalue = 200.0; // it may be 200, 200.3 or 200.37, BigDecimal will take care
Locale locale = new Locale("en", "US");      
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale);

BigDecimal valueAsBD = BigDecimal.valueOf(value);
    valueAsBD.setScale(2, BigDecimal.ROUND_HALF_UP); // add digits to match .00 pattern

System.out.println(currencyFormatter.format(amount));

Ответ 9

вы должны сделать что-то вроде этого:

public static void main(String[] args) {
    double d1 = 100d;
    double d2 = 100.1d;
    print(d1);
    print(d2);
}

private static void print(double d) {
    String s = null;
    if (Math.round(d) != d) {
        s = String.format("%.2f", d);
    } else {
        s = String.format("%.0f", d);
    }
    System.out.println(s);
}

который печатает:

100

100,10

Ответ 10

Я знаю, что это старый вопрос, но...

import java.text.*;

public class FormatCurrency
{
    public static void main(String[] args)
    {
        double price = 123.4567;
        DecimalFormat df = new DecimalFormat("#.##");
        System.out.print(df.format(price));
    }
}

Ответ 11

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

String.format("$%,d.%02d",wholeNum,change);

Ответ 12

Я согласен с @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().

Ответ 13

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

    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"

Ответ 14

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

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

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

Ответ 15

Формат от 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;
}

Ответ 16

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

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

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
  • US: 999,999.99

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

Ответ 17

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

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

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

Ответ 18

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

Ответ 19

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

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, я все уши.

Ответ 20

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

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...