Format Angka Mata Uang Jawa

91

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.

DD.
sumber

Jawaban:

48

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
  }
}
extraneon
sumber
8
Minor nitpick: float bisa persis 100, dengan pola bit 0x42c80000.
Karol S
2
Ya, seperti yang dikemukakan Karol S, banyak angka yang BISA disamakan dengan pelampung. Hanya saja tidak SEMUA angka. 100 adalah satu angka yang dapat diwakili, Anda harus memperhitungkan angka yang tidak boleh.
csga5000
160

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);
    }
}
duffymo
sumber
17
Anda tidak boleh menggunakan tanda ganda untuk mewakili mata uang. Ubah menjadi panjang dan kelola sendiri koma desimal atau gunakan BigDecimaldengan formatter. joda-money.sourceforge.net harus menjadi perpustakaan yang bagus untuk digunakan setelah selesai.
gpampara
5
Saya setuju re: double! = Uang, tapi pertanyaan itu tidak diajukan seperti itu.
duffymo
3
Apa maksudmu begitulah cara kerja mata uang? Saya dapat mengatakan sesuatu berharga $ 1 bukan $ 1,00 .... ada cara berbeda untuk menampilkan mata uang (selain default) dan pertanyaan ini menanyakan bagaimana menghilangkan bagian desimal jika bilangan bulat.
DD.
1
Ini masalah rendering. Letakkan logika di UI Anda untuk menerima mata uang sebagai String dan potong desimal dan sen jika itu adalah dolar yang tepat.
duffymo
2
Setuju - itulah mengapa saya merekomendasikan menggunakan Lokal ketika saya menulis ini 5,5 tahun yang lalu. "Tetapi, jika Anda harus, ...." adalah frase kuncinya.
duffymo
126
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

Thilina Dharmasena
sumber
Sepertinya "mata uang" tidak direferensikan atau digunakan setelah dinyatakan ... apakah ada efek samping dari baris 3? Atau beberapa alasan Anda memasukkannya?
Damian
Baca lebih lanjut tentang [Lokal Kelas] [1] [1]: docs.oracle.com/javase/7/docs/api/java/util/…
Thilina Dharmasena
18

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);
    }
}
wu liang
sumber
Dia tidak pernah mengatakan itu lebih baik. DIA baru saja memposting solusinya sehingga orang lain dapat merujuk darinya. Setidaknya yang bisa Anda ucapkan adalah terima kasih.
Umang Desai
1
Bagaimana jika saya ingin menampilkan harga dalam format India. Tanpa desimal. Format -> ##, ##, ###
Bhuvan
Pada metode priceWithDecimal (Double), cobalah mengubah masker "###,###,###.00"untuk "###,###,##0.00"menunjukkan "0,00" ketika nilai adalah "0"
dellasavia
1
apa yang akan sebaliknya untuk mengubah mata uang yang diformat menjadi Double lagi
Vivek Shankar
6

Iya. Anda dapat menggunakan java.util.formatter . Anda dapat menggunakan string format seperti "% 10.2f"

dj_segfault
sumber
String.format()adalah pembungkus statis yang bagus untuk itu. Tidak yakin mengapa Anda menggunakan '10'.
Xr.
Tanpa panduan tentang ukuran angka, saya memilih 10 Ex Recto. Kami tidak tahu apakah ini harga sebatang permen atau mobil. Saya yakin Anda juga dapat melakukan "% .2f" untuk membiarkan ukuran total tidak dibatasi.
dj_segfault
DD ingin bagian desimal dihilangkan, jika jumlahnya adalah bilangan bulat dari unit mata uang.
jarnbjo
6

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.

Dirk Lachowski
sumber
5

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

Andrew
sumber
Anda telah melewatkan inti dari postingan tersebut. Jika angkanya adalah bilangan bulat, saya tidak ingin menampilkan desimal apa pun.
DD.
DD. Saya minta maaf, dan saya mengoreksi jawaban sesuai pertanyaan.
Andrew
5

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));
sagits
sumber
5

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"

Samet ÖZTOPRAK
sumber
5
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
Subhashi
sumber
4

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

Stefan De Boey
sumber
Akankah Math.round (d)! = D berfungsi? Dengan mengapung itu sering! = Bahkan jika Anda berpikir demikian.
extraneon
1
sebaliknya, jika d akan menjadi 100.000000000000001 maka akan tetap dicetak sebagai 100
Stefan De Boey
4

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));
    }
}
Aezur
sumber
3
Ini tidak bekerja, ini 100.1 -> "100.1" misalnya - lihat stackoverflow.com/questions/5033404/…
davnicwil
4

Anda bisa melakukan sesuatu seperti ini dan memasukkan bilangan bulat dan kemudian sen setelahnya.

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

Saya setuju dengan @duffymo bahwa Anda perlu menggunakan java.text.NumberFormatmetode 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:

  • Keseluruhan 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.
  • Trik untuk menghilangkan desimal adalah setMaximumFractionDigits()metodenya

Apapun logika Anda untuk menentukan apakah desimal harus dipotong atau tidak, setMaximumFractionDigits()harus digunakan.

xbakesx.dll
sumber
1
Tunjukkan maksud Anda tentang *100dan %100menjadi bias AS, Anda dapat menggunakan Math.pow(10, formatter.getMaximumFractionDigits())daripada hard-code 100untuk menggunakan nomor yang benar untuk lokal ...
daiscog
3

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

Adrian Adamczyk
sumber
2
Ini sama sekali tidak relevan dengan pertanyaan yang saya ajukan.
DD.
3

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;
}
Lukas
sumber
2

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,5010,9510,-
€ 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.

  • Belanda: 999.999,99
  • AS: 999.999,99

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.

Jeroen
sumber
2

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();
    }
A-Sharabiani
sumber
2
  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);
    }
PRATEEK BHARDWAJ
sumber
2

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...
Haomin
sumber
1

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.

Viktor Nordling
sumber