Bagaimana saya bisa memformat nomor String untuk memiliki koma dan bulat?

142

Apa cara terbaik untuk memformat nomor berikut yang diberikan kepada saya sebagai sebuah String?

String number = "1000500000.574" //assume my value will always be a String

Saya ingin ini menjadi String dengan nilai: 1,000,500,000.57

Bagaimana saya bisa memformatnya?

Sheehan Alam
sumber

Jawaban:

256

Anda mungkin ingin melihat DecimalFormatkelas; ini mendukung lokal yang berbeda (misalnya: di beberapa negara yang akan diformat sebagai 1.000.500.000,57gantinya).

Anda juga perlu mengubah string itu menjadi angka, ini dapat dilakukan dengan:

double amount = Double.parseDouble(number);

Contoh kode:

String number = "1000500000.574";
double amount = Double.parseDouble(number);
DecimalFormat formatter = new DecimalFormat("#,###.00");

System.out.println(formatter.format(amount));
NullUserException
sumber
dapatkah Anda menunjukkan contoh bagaimana saya bisa menggunakan NumberFormat dengan case khusus ini?
Sheehan Alam
1
Anda juga dapat menggunakan solusi di bawah ini - String public static getRoundOffValue (nilai ganda) {DecimalFormat df = DecimalFormat baru ("##, ##, ##, ##, ##, ##, ##, ##, ## 0.00"); return df.format (nilai); }
Jitendra Nath
Saya juga lebih suka nol sebelum titik seperti DecimalFormat formatter = new DecimalFormat ("#, ## 0.00"); - mendapatkan 0,00 untuk nol kedengarannya salah untukku
Leo
45

Ini juga dapat dilakukan dengan menggunakan String.format (), yang mungkin lebih mudah dan / atau lebih fleksibel jika Anda memformat banyak angka dalam satu string.

    String number = "1000500000.574";
    Double numParsed = Double.parseDouble(number);

    System.out.println(String.format("The input number is: %,.2f", numParsed));
    // Or
    String numString = String.format("%,.2f", numParsed);

Untuk string format "%, 2f" - "," berarti grup digit yang terpisah dengan koma, dan ".2" berarti membulatkan ke dua tempat setelah desimal.

Untuk referensi tentang opsi pemformatan lain, lihat https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Greg H
sumber
42

Setelah Anda mengonversi String Anda menjadi angka, Anda dapat menggunakannya

// format the number for the default locale
NumberFormat.getInstance().format(num)

atau

// format the number for a particular locale
NumberFormat.getInstance(locale).format(num)
Aaron Novstrup
sumber
Bagaimana cara menentukan lokal dan membulatkan ke (katakanlah) 2 desimal?
Jonik
6
Ah, sudahlah, temukan:new DecimalFormat("0.##", DecimalFormatSymbols.getInstance(locale))
Jonik
16

Mengingat ini adalah hasil Google nomor satu format number commas java, inilah jawaban yang berfungsi untuk orang-orang yang bekerja dengan bilangan bulat dan tidak peduli dengan desimal.

String.format("%,d", 2000000)

output:

2,000,000
Ben Watson
sumber
juga berfungsi untuk mengapung, misalnya, printf ("%, f \ n", decimalNumber)
philwalk
12

Saya telah membuat utilitas pemformatan saya sendiri. Yang sangat cepat memproses format bersama dengan memberi Anda banyak fitur :)

Ini mendukung:

  • Format Koma Misalnya 1234567 menjadi 1.234.567.
  • Awalan dengan "Ribu (K), Juta (M), Miliar (B), Triliun (T)".
  • Ketelitian 0 hingga 15.
  • Mengubah ukuran presisi (Berarti jika Anda menginginkan presisi 6 digit, tetapi hanya memiliki 3 digit yang tersedia, maka akan memaksa ke 3).
  • Penurunan awalan (Berarti jika awalan yang Anda pilih terlalu besar itu menurunkannya ke awalan yang lebih cocok).

Kode dapat ditemukan di sini . Anda menyebutnya seperti ini:

public static void main(String[])
{
   int settings = ValueFormat.COMMAS | ValueFormat.PRECISION(2) | ValueFormat.MILLIONS;
   String formatted = ValueFormat.format(1234567, settings);
}

Saya juga harus menunjukkan ini tidak menangani dukungan desimal, tetapi sangat berguna untuk nilai integer. Contoh di atas akan menampilkan "1.23M" sebagai output. Saya mungkin dapat menambahkan dukungan desimal mungkin, tetapi tidak melihat terlalu banyak digunakan untuk itu sejak itu saya mungkin juga menggabungkan ini menjadi jenis kelas BigInteger yang menangani array char [] yang dikompresi untuk perhitungan matematika.

Jeremy Trifilo
sumber
2
Ini bagus jika Anda hanya bekerja dalam bahasa Inggris. Saran saya adalah untuk menghindari hal-hal seperti itu membuat marah makan malam pengguna non-Inggris saya karena mereka tidak bisa mengerti apa Katau Martinya
rishabhmhjn
@rishabhmhjn tapi ... tidak bisakah Anda hanya men-tweak untuk memodifikasi surat yang Anda butuhkan? Apakah nasib burukmu salahnya? : o dan apa yang dia buat cukup keren, meskipun tautannya tampaknya tidak tersedia saat ini ..
Aquarius Power
@AquariusPower masalahnya adalah, mis., Nomor Jepang tidak mengikuti sistem metrik. Jumlah mereka seperti 1 百 untuk 100, 1 千 untuk 1000, 1 万 untuk 10.000, kemudian menjadi 1 千万 untuk 1000.0000. Tim saya sedang mengerjakan sesuatu yang serupa di Javascript. Anda dapat menggunakan logika yang disebutkan di sini: github.com/statusbrew/angular-bignumber
rishabhmhjn
Menemukan kode lama saya untuk ini jadi saya mengunggahnya kembali ke GitHub. Tautan dalam komentar telah diperbarui.
Jeremy Trifilo
6
public void convert(int s)
{
    System.out.println(NumberFormat.getNumberInstance(Locale.US).format(s));
}

public static void main(String args[])
{
    LocalEx n=new LocalEx();
    n.convert(10000);
}
pengguna3314142
sumber
6

Anda juga dapat menggunakan solusi di bawah ini -

public static String getRoundOffValue(double value){

        DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00");
        return df.format(value);
}
Jitendra Nath
sumber
4

Anda dapat melakukan seluruh konversi dalam satu baris, menggunakan kode berikut:

String number = "1000500000.574";
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number));

Dua tanda # terakhir dalam konstruktor DecimalFormat juga bisa 0s. Either way bekerja.

Peter Griffin
sumber
3

Jawaban pertama berfungsi dengan sangat baik, tetapi untuk NOL / 0 akan memformat sebagai 0,00

Karenanya format #, ## 0.00 bekerja dengan baik untuk saya. Selalu uji angka yang berbeda seperti 0/100 / 2334.30 dan angka negatif sebelum digunakan untuk sistem produksi.

Venod Raveendran
sumber
3

Inilah cara paling sederhana untuk sampai ke sana:

String number = "10987655.876";
double result = Double.parseDouble(number);
System.out.println(String.format("%,.2f",result)); 

output: 10.987.655,88

John Paker
sumber