Формат валюты 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...