Apakah ada cara untuk memformat desimal sebagai berikut:
100 -> "100"
100.1 -> "100.10"
Jika bilangan bulat, hilangkan bagian desimalnya. Jika tidak, format dengan dua tempat desimal.
Jawaban:
Aku meragukan itu. Masalahnya adalah bahwa 100 tidak pernah 100 jika itu float, biasanya 99.9999999999 atau 100.0000001 atau semacamnya.
Jika Anda ingin memformatnya seperti itu, Anda harus menentukan epsilon, yaitu jarak maksimum dari bilangan bulat, dan menggunakan pemformatan bilangan bulat jika perbedaannya lebih kecil, dan float sebaliknya.
Sesuatu seperti ini akan berhasil:
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
}
}
Saya akan merekomendasikan menggunakan paket java.text:
double money = 100.1;
NumberFormat formatter = NumberFormat.getCurrencyInstance();
String moneyString = formatter.format(money);
System.out.println(moneyString);
Ini memiliki keuntungan tambahan karena menjadi spesifik lokasi.
Tetapi, jika Anda harus, potong String yang Anda dapatkan jika nilainya satu dolar:
if (moneyString.endsWith(".00")) {
int centsIndex = moneyString.lastIndexOf(".00");
if (centsIndex != -1) {
moneyString = moneyString.substring(1, centsIndex);
}
}
BigDecimal
dengan formatter. joda-money.sourceforge.net harus menjadi perpustakaan yang bagus untuk digunakan setelah selesai.
double amount =200.0;
Locale locale = new Locale("en", "US");
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale);
System.out.println(currencyFormatter.format(amount));
atau
double amount =200.0;
System.out.println(NumberFormat.getCurrencyInstance(new Locale("en", "US"))
.format(amount));
Cara terbaik untuk menampilkan mata uang
Keluaran
$ 200,00
Jika Anda tidak ingin menggunakan tanda, gunakan metode ini
double amount = 200;
DecimalFormat twoPlaces = new DecimalFormat("0.00");
System.out.println(twoPlaces.format(amount));
200,00
Ini juga bisa digunakan (Dengan seribu pemisah)
double amount = 2000000;
System.out.println(String.format("%,.2f", amount));
2.000.000,00
Saya tidak menemukan solusi yang baik setelah pencarian google, cukup posting solusi saya untuk referensi lain. gunakan priceToString untuk memformat uang.
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);
}
}
"###,###,###.00"
untuk "###,###,##0.00"
menunjukkan "0,00" ketika nilai adalah "0"
Iya. Anda dapat menggunakan java.util.formatter . Anda dapat menggunakan string format seperti "% 10.2f"
String.format()
adalah pembungkus statis yang bagus untuk itu. Tidak yakin mengapa Anda menggunakan '10'.
Saya menggunakan yang ini (menggunakan StringUtils dari commons-lang):
Double qty = 1.01;
String res = String.format(Locale.GERMANY, "%.2f", qty);
String fmt = StringUtils.removeEnd(res, ",00");
Anda hanya harus menangani lokal dan String terkait yang akan dipotong.
Saya pikir ini sederhana dan jelas untuk mencetak mata uang:
DecimalFormat df = new DecimalFormat("$###,###.##"); // or pattern "###,###.##$"
System.out.println(df.format(12345.678));
keluaran: $ 12,345,68
Dan salah satu solusi yang mungkin untuk pertanyaan tersebut:
public static void twoDecimalsOrOmit(double d) {
System.out.println(new DecimalFormat(d%1 == 0 ? "###.##" : "###.00").format(d));
}
twoDecimalsOrOmit((double) 100);
twoDecimalsOrOmit(100.1);
Keluaran:
100
100.10
Biasanya kita perlu melakukan inversi, jika kolom uang json Anda adalah float, nilainya bisa 3,1, 3,15, atau hanya 3.
Dalam hal ini Anda mungkin perlu membulatkannya untuk tampilan yang benar (dan untuk dapat menggunakan topeng pada bidang masukan nanti):
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));
ini cara terbaik untuk melakukan itu.
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"
NumberFormat currency = NumberFormat.getCurrencyInstance();
String myCurrency = currency.format(123.5);
System.out.println(myCurrency);
keluaran:
$123.50
Jika Anda ingin mengubah mata uang,
NumberFormat currency = NumberFormat.getCurrencyInstance(Locale.CHINA);
String myCurrency = currency.format(123.5);
System.out.println(myCurrency);
keluaran:
¥123.50
Anda harus melakukan sesuatu seperti ini:
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);
}
yang mencetak:
100
100,10
Saya tahu ini adalah pertanyaan lama tapi ...
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));
}
}
Anda bisa melakukan sesuatu seperti ini dan memasukkan bilangan bulat dan kemudian sen setelahnya.
String.format("$%,d.%02d",wholeNum,change);
Saya setuju dengan @duffymo bahwa Anda perlu menggunakan java.text.NumberFormat
metode untuk hal-hal semacam ini. Anda benar-benar dapat melakukan semua pemformatan secara asli di dalamnya tanpa melakukan String apa pun yang membandingkan diri Anda sendiri:
private String formatPrice(final double priceAsDouble)
{
NumberFormat formatter = NumberFormat.getCurrencyInstance();
if (Math.round(priceAsDouble * 100) % 100 == 0) {
formatter.setMaximumFractionDigits(0);
}
return formatter.format(priceAsDouble);
}
Beberapa hal yang perlu diperhatikan:
Math.round(priceAsDouble * 100) % 100
hanya bekerja di sekitar ketidakakuratan ganda / pelampung. Pada dasarnya hanya memeriksa apakah kita membulatkan ke tempat ratusan (mungkin ini adalah bias AS) apakah ada sisa sen. setMaximumFractionDigits()
metodenyaApapun logika Anda untuk menentukan apakah desimal harus dipotong atau tidak, setMaximumFractionDigits()
harus digunakan.
*100
dan %100
menjadi bias AS, Anda dapat menggunakan Math.pow(10, formatter.getMaximumFractionDigits())
daripada hard-code 100
untuk menggunakan nomor yang benar untuk lokal ...
Jika Anda ingin mengerjakan mata uang, Anda harus menggunakan kelas BigDecimal. Masalahnya adalah, tidak ada cara untuk menyimpan beberapa angka float dalam memori (mis. Anda dapat menyimpan 5.3456, tetapi tidak 5.3455), yang dapat berdampak pada penghitungan yang buruk.
Ada artikel bagus bagaimana bekerja sama dengan BigDecimal dan mata uang:
http://www.javaworld.com/javaworld/jw-06-2001/jw-0601-cents.html
Format dari 1000000.2 hingga 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;
}
Posting ini sangat membantu saya untuk mendapatkan apa yang saya inginkan. Jadi saya hanya ingin menyumbangkan kode saya di sini untuk membantu orang lain. Ini kode saya dengan beberapa penjelasan.
Kode berikut:
double moneyWithDecimals = 5.50;
double moneyNoDecimals = 5.00;
System.out.println(jeroensFormat(moneyWithDecimals));
System.out.println(jeroensFormat(moneyNoDecimals));
Akan kembali:
€ 5,-
€ 5,50
Metode jeroensFormat () sebenarnya:
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;
}
}
Metode displayJeroensFormat yang memanggil metode 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
}
Akan memiliki keluaran sebagai berikut:
€ 10,50
€ 10,95
€ 10,-
€ 100.000 (In Holland numbers bigger than € 999,- and wit no decimals don't have ,-)
Kode ini menggunakan mata uang Anda saat ini. Dalam kasus saya, itu adalah Belanda jadi string yang diformat untuk saya akan berbeda dengan seseorang di AS.
Lihat saja 3 karakter terakhir dari angka-angka itu. Kode saya memiliki pernyataan if untuk memeriksa apakah 3 karakter terakhir sama dengan ", 00". Untuk menggunakan ini di AS, Anda mungkin harus mengubahnya menjadi ".00" jika belum berfungsi.
Saya cukup gila untuk menulis fungsi saya sendiri:
Ini akan mengonversi bilangan bulat ke format mata uang (dapat dimodifikasi untuk desimal juga):
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();
}
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);
}
Untuk orang-orang yang ingin memformat mata uang, tetapi tidak ingin mata uangnya berbasis lokal, kita dapat melakukan ini:
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...
Inilah yang saya lakukan, menggunakan bilangan bulat untuk mewakili jumlah sebagai sen:
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);
}
Masalah dengan NumberFormat.getCurrencyInstance()
adalah terkadang Anda benar-benar ingin $ 20 menjadi $ 20, itu terlihat lebih baik daripada $ 20.
Jika ada yang menemukan cara yang lebih baik untuk melakukan ini, menggunakan NumberFormat, saya mendengarkan.