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

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

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

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

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

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

Ответы [ 20 ]

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

Я бы порекомендовал использовать пакет 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);
    }
}
103 голосов
/ 20 августа 2014
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

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

Я сомневаюсь в этом. Проблема в том, что 100 никогда не бывает 100, если это число с плавающей запятой, обычно это 99,99999999999 или 100,0000001 или что-то в этом роде.

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

Нечто подобное могло бы сработать:

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
  }
}
16 голосов
/ 13 октября 2012

Я не нашел ни одного хорошего решения после поиска в 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);
    }
}
6 голосов
/ 07 декабря 2012

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

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

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

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

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

5 голосов
/ 25 апреля 2015

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

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

5 голосов
/ 16 декабря 2015

Обычно нам нужно сделать обратное. Если ваше поле 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));
4 голосов
/ 24 июня 2013

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

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));
    }
}
4 голосов
/ 04 марта 2010

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

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

...