How to use Java's DecimalFormat for “smart” currency formatting?

前端 未结 10 569
旧巷少年郎
旧巷少年郎 2021-01-01 09:34

I\'d like to use Java\'s DecimalFormat to format doubles like so:

#1 - 100 -> $100
#2 - 100.5 -> $100.50
#3 - 100.41 -> $100.41

Th

相关标签:
10条回答
  • 2021-01-01 10:30

    Use NumberFormat:

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

    Also, don't use doubles to represent exact values. If you're using currency values in something like a Monte Carlo method (where the values aren't exact anyways), double is preferred.

    See also: Write Java programs to calculate and format currency

    0 讨论(0)
  • 2021-01-01 10:30

    You can check "is number whole or not" and choose needed number format.

    public class test {
    
      public static void main(String[] args){
        System.out.println(function(100d));
        System.out.println(function(100.5d));
        System.out.println(function(100.42d));
      }
    
      public static String function(Double doubleValue){
        boolean isWholeNumber=(doubleValue == Math.round(doubleValue));
        DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols(Locale.GERMAN);
        formatSymbols.setDecimalSeparator('.');
    
        String pattern= isWholeNumber ? "#.##" : "#.00";    
        DecimalFormat df = new DecimalFormat(pattern, formatSymbols);
        return df.format(doubleValue);
      }
    }
    

    will give exactly what you want:

    100
    100.50
    100.42
    
    0 讨论(0)
  • 2021-01-01 10:31

    printf also works.

    Example:

    double anyNumber = 100; printf("The value is %4.2f ", anyNumber);

    Output:

    The value is 100.00

    4.2 means force the number to have two digits after the decimal. The 4 controls how many digits to the right of the decimal.

    0 讨论(0)
  • 2021-01-01 10:32

    You could use the Java Money API to achieve this. (although this is not using DecialFormat)

    long amountInCents = ...;
    double amountInEuro = amountInCents / 100.00;
    
    String customPattern; 
    if (minimumOrderValueInCents % 100 == 0) {
        customPattern = "# ¤";
    } else {
        customPattern = "#.## ¤";
    }
    
    Money minDeliveryAmount = Money.of(amountInEuro, "EUR");
    MonetaryAmountFormat formatter = MonetaryFormats.getAmountFormat(AmountFormatQueryBuilder.of(Locale.GERMANY)
                .set(CurrencyStyle.SYMBOL)
                .set("pattern", customPattern)
                .build());
    
    System.out.println(minDeliveryAmount);
    
    0 讨论(0)
提交回复
热议问题