JavaRush /Java Blog /Random-ID /Format keluaran angka di Java

Format keluaran angka di Java

Dipublikasikan di grup Random-ID
Halo semua! Seringkali metode kami dilengkapi dengan angka yang perlu ditampilkan dalam format khusus. Tampaknya seperti hal kecil, tapi bagaimana Anda akan melaksanakan tugas ini? Format keluaran angka di Java - 1Kami mengundang Anda untuk sedikit memikirkan hal ini hari ini. Pertama, untuk mempelajari pemformatan angka di Java, mari kita ingat metode format kelas String : public static String format(String format, Object... args) - mengembalikan string yang diformat dari format string menggunakan argumen args yang tersisa . Dan sekedar contoh:
String str = String.format("Hi - %s! How are you %s?", "Sasha", "At work");
System.out.println(str);
Hasilnya, kita akan mendapatkan output di konsol:
Halo Sasha! Bagaimana keadaan di tempat kerja?

metode printf dan format

String.format() bukan satu-satunya metode untuk memformat string. Analoginya adalah System.out.printf() dan System.out.format(); . Jadi, kita bisa mengganti kode sebelumnya dengan:
System.out.printf("Hi - %s! How are you %s?", "Sasha", "At work");
atau
System.out.format("Hi - %s! How are you %s?", "Sasha", "At work");
Output di konsol akan tetap sama. Satu-satunya perbedaan adalah metode ini langsung menampilkan nilai di konsol, tidak seperti String.format() . Tapi saya lebih suka String.format() karena kita tidak selalu perlu menampilkan hasilnya di konsol, jadi kita akan menggunakan metode ini lebih lanjut. Mari kita kembali ke contoh kita. Apa yang kita lihat? Dan faktanya adalah di tempat di mana terdapat karakter - %s , garis - "Sasha" dan "di tempat kerja" disisipkan . Bagaimana hal ini dapat membantu kita dalam pembangunan? Bayangkan Anda memiliki teks templat yang besar, tetapi di beberapa tempat Anda perlu memasukkan nilai yang mungkin berbeda dan menjadi argumen dari luar. Di sinilah pemformatan ini berguna. Penentu format dimulai dengan tanda persen, %, dan diakhiri dengan karakter yang menunjukkan tipe argumen yang akan diformat. Dan, seperti yang mungkin Anda pahami, %s digunakan untuk menyisipkan objek - string. Tetapi jika kita mencoba menyisipkan, misalnya, tanda ganda ke tempat objek string didaftarkan:
String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
ini juga akan berhasil. double akan dilemparkan ke string dan kita akan mendapatkan:
Halo - 55.6! Bagaimana keadaan di tempat kerja?
Selain string dan angka floating point, ada tipe lain di Java kan? Jadi mari kita lihat keseluruhan persenjataannya:
Jenis nilai yang akan diformat Contoh
%S Tipe apa pun yang akan dilemparkan ke string
String.format("Hi %s!","world")
Hasil:
Halo Dunia!
%B Tipe apa pun yang akan dimasukkan ke boolean : true - jika nilainya bukan null, false - jika null
String.format("Hi %b!",null)
Hasil:
Halo salah
%H Anda dapat meneruskan objek apa pun, yang akan dimasukkan ke string nilai heksadesimal dari metode hashCode()
String.format("Hi %h!","world")
Hasil:
Halo 106c44!
%C Digunakan untuk menentukan karakter Unicode ( char )
String.format("Hello m%cr!",'And')
Hasil:
Halo Dunia!
%D Integer ditentukan ( int.byte, short, int, long, BigInteger )
String.format("I'm already %d!",20)
Hasil:
Saya sudah berumur 20!
%F Digunakan untuk menentukan nomor floating point
String.format("PI is - %f!", 3.14159)
Hasil:
Nomor PI-nya adalah - 3.141590!
%e Angka floating point dalam notasi ilmiah
String.format("PI is - %e!", 3.14159);
Hasil:
Nomor PI-nya adalah - 3.141590e+00!
%A Angka floating point akan direpresentasikan dalam heksadesimal
String.format("PI is - %a!", 3.14159)
Hasil:
Nomor PI-nya adalah - 0x1.921f9f01b866ep1!
%X Sebuah integer dilewatkan ( int.byte, short, int, long, BigInteger ), hasil formatnya adalah karakter dengan nomor yang diberikan pada tabel ASCII
String.format("I'm already %x!",25)
Hasil:
Saya sudah berusia 19 tahun!
%Hai Integer ( int.byte, short, int, long, BigInteger ) diterima dan akan direpresentasikan sebagai bilangan oktal
String.format("I already %o!",25);
Hasil:
Saya sudah berusia 31 tahun!
%T Awalan untuk konversi tanggal dan waktu. Bendera tambahan diperlukan untuk pemformatan
String.format("Today is %tA",new Date())
Hasil:
Hari ini adalah hari Sabtu
%N Pemisah garis khusus platform. Analog\n
String.format("Hello %n Hello")
Hasil:
Hai Hai
Mari kita gunakan format yang lebih cocok untuk double :
String str = String.format("The distance from Kyiv to Odessa is %f. Not so short, is it?", 475.4d);
System.out.println(str);
Keluaran konsol:
Jarak dari Kiev ke Odessa adalah 475.400000. Tidak sedikit, bukan?
Seperti yang mungkin sudah Anda sadari, %f akan menjadi penentu yang lebih tepat untuk bilangan floating point, yang mencakup tipe data seperti double dan float di Java. Dengan specifier ini kita dapat memformat bilangan floating point:
String str = String.format("The distance from Kyiv to Odessa is %.2f. Not so short, is it?", 475.4d);
Memasukkan .2 ke dalam penentu ini akan memotong jumlah tempat desimal menjadi dua, memberi kita keluaran:
Jarak dari Kiev ke Odessa adalah 475,40. Tidak sedikit, bukan?
.2 bukan satu-satunya perubahan pada penentu. Kombinasi himpunan bagian ini disebut instruksi . Format keluaran angka di Java - 2Bentuk umum petunjuknya adalah sebagai berikut:
%[argument_index][flags][width][.precision]penentu tipe
Sekarang mari kita uraikan semuanya secara berurutan:
  • [argument_index] adalah bilangan bulat yang menunjukkan posisi dalam daftar argumen. Misalnya, link ke argumen pertama adalah $1, link ke argumen kedua adalah $2, dan seterusnya. Jika posisi tidak ditentukan, argumen harus berada dalam urutan yang sama seperti yang direferensikan dalam format string.
  • [bendera] adalah karakter khusus untuk pemformatan. Misalnya:
    • Tanda + yang menunjukkan bahwa jika suatu nilai numerik positif, maka harus disertai tanda +
    • - artinya menyelaraskan hasilnya ke kiri
    • , menyetel pemisah ribuan untuk bilangan bulat
  • [lebar] adalah bilangan bulat desimal positif yang menentukan jumlah minimum karakter yang akan dihasilkan. Jika angka ini diawali dengan 0 maka karakter yang hilang akan diisi dengan 0, jika tidak ada 0 maka dengan spasi.
  • [.accuracy] adalah bilangan bulat non-negatif yang diawali dengan titik. Biasanya digunakan untuk membatasi jumlah karakter. Perilaku spesifik bergantung pada tipe penentu tertentu.
Saya juga ingin mencatat bahwa semua elemen instruksi di atas bersifat opsional, dan semuanya akan berfungsi tanpa elemen tersebut. Sebagai contoh penggunaan subsetting, bayangkan kita memerlukan keluaran spesifik dari bilangan Pi:
String str = String.format("%1$+09.5f", 3.1415926535897);
System.out.print(str);
Dan karenanya, keluaran di konsol:
+03.14159
Tampaknya mudah, bukan? Namun saat memformat angka, Anda tidak bisa mengabaikan DecimalFormat . Mari kita cari tahu apa artinya ini.

Format Desimal

DecimalFormat adalah kelas untuk memformat angka apa pun di Java, baik bilangan bulat atau angka floating point. Saat objek DecimalFormat dibuat , Anda dapat menentukan templat untuk memformat angka masuk langsung di konstruktor. Seperti inilah contoh kita menggunakan DecimalFormat :
DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
Keluaran konsol:
72.224
Baris #.### adalah pola yang menunjukkan bahwa kita memformat nilai yang diteruskan ke 3 tempat desimal. Simbol apa lagi yang tersedia untuk pola? Berikut beberapa di antaranya:
  • # — digit, angka nol di depan dihilangkan;
  • 0 — digit selalu ditampilkan, meskipun angkanya lebih sedikit (dalam hal ini, 0 ditampilkan);
  • . — tanda pemisah desimal;
  • , — tanda pengelompokan pemisah (misalnya, pemisah ribuan);
  • ; — memisahkan format;
  • - — menandai awalan angka negatif;
  • % - dikalikan dengan 100 dan menampilkan angka sebagai persentase;
  • ? — dikalikan dengan 1000 dan menampilkan angka dalam ppm;
  • E - Memisahkan mantissa dan eksponen untuk notasi ilmiah.
Mari kita lihat beberapa contoh:
System.out.println(new DecimalFormat( "###,###.##" ).format(74554542.224463));
Keluaran konsol:
74.554.542,22
System.out.println(new DecimalFormat( "%###.##" ).format(0.723456));
Keluaran konsol:
%72,35
System.out.println(new DecimalFormat( "000.###" ).format(42.224463));
Keluaran konsol:
042.224
Tidak perlu membuat objek DecimalFormat baru setiap kali mendefinisikan template baru. Cukup menggunakan metode applyPattern dan applyLocalizedPattern :
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
Ketika kita berbicara tentang memformat bilangan floating point, kita cukup tertarik dengan pembulatan, bukan? Jadi, saat memangkas angka dengan angka desimal di luar pola yang ditentukan, DecimalFormat akan membulatkan angka tersebut ke atas jika angka terakhir yang dipangkas lebih besar dari 5. Bagaimana jika angka terakhir yang dipangkas adalah 5? Memang dalam hal ini bilangan tersebut berada tepat di tengah-tengah antara bilangan bulat terdekat. Format keluaran angka di Java - 3Dalam hal ini, nomor sebelumnya diperhitungkan. Jika bilangan sebelumnya genap maka dilakukan pembulatan:
DecimalFormat dF = new DecimalFormat("##.###");
String result = dF.format(56.4595);
System.out.println((result));
Keluaran konsol:
56.459
Jika ganjil, tidak dilakukan:
DecimalFormat dF = new DecimalFormat("##.###");
String str = dF.format(56.4595);
System.out.println((str));
Keluaran konsol:
56.459
Perbedaan antara memformat bilangan floating point menggunakan String.format() dan DecimalFormat.format() adalah dalam kasus pertama akan ada angka nol di belakangnya, meskipun tidak ada bagian pecahan. Misalnya:
String firstStr = String.format("%.4f", 9.00001273);
System.out.println((firstStr));
Keluaran konsol:
9.0000
DecimalFormat decimalFormat = new DecimalFormat("#.####");
String secondStr = decimalFormat.format(9.00001273);
System.out.println((secondStr));
Keluaran konsol:
9
Seperti yang Anda lihat, saat memformat angka 9.00001273 dengan akurasi empat tempat desimal, metode format() dari kelas String akan menampilkan nilai 9.0000 , sedangkan metode format() serupa dari DecimalFormat akan menampilkan 9 .

Desimal Besar dan Bilangan Bulat Besar

Karena kita telah menyentuh topik pembulatan angka di Java, mari kita bicara tentang cara menggunakan kelas BigDecimal untuk operasi tersebut . Kelas ini difokuskan untuk bekerja dengan angka yang sangat BESAR: untuk itu, nilai double dan float maksimum terlalu kecil. Kelas ini memiliki banyak pengaturan berbeda untuk pembulatan floating point, serta banyak metode untuk operasi aritmatika. Ia memiliki kelas serupa, tetapi fokus bekerja dengan bilangan bulat BESAR - BigInteger . Anda dapat membaca lebih lanjut tentang BigDecimal dan BigInteger di artikel ini .

Memformat Tanggal dan Waktu

Hanya disebutkan di atas bahwa menggunakan format() kelas String Anda juga dapat memformat waktu dan tanggal. Format keluaran angka di Java - 4Baiklah, mari kita lihat cara melakukannya. Pertama, kami ingin mengingatkan Anda bahwa penentu format %t digunakan untuk tanggal . Kedua, saat memformat templat, tanda pemformatan tambahan diperlukan untuk setiap penentu format tanggal. Berikut ini kemungkinan tanda pemformatan untuk tanggal:
Bendera Keterangan
%tB Nama lengkap bulannya, misalnya Januari, Februari, dll.
%tb Nama bulan yang disingkat, misalnya Jan, Feb, dll.
%tA Nama lengkap hari dalam seminggu, misalnya Minggu, Senin
%ta Nama hari dalam seminggu yang disingkat, misalnya Minggu, Sen, dll.
%tY Tahun dalam format 4 digit, misalnya 0000 hingga 9999
%ty Tahun dalam format 2 digit, misalnya 00 hingga 99
%tm Bulan diformat dengan nol di awal, misalnya 01 hingga 12
%tc Tanggal dan waktu dalam format %ta %tb %td %tT %tZ %tY, misalnya Sen 17 Feb 03:56:12 PST 2020
%tD Tanggal dalam format %tm/%td/%ty
%td Hari dalam sebulan dalam format dua digit, misalnya 01 hingga 31
%te Hari dalam sebulan dalam format tanpa awalan 0, misalnya 1 sampai 31
%tT Waktu dalam format 24 jam, misalnya %tH:%tM:%tS
%th Jam sehari dalam format 24 jam, dari 00 hingga 23
%tI Jam sehari untuk format 12 jam, misalnya 01 hingga 12
%tM Menit dalam satu jam diformat dengan angka nol di depannya, misalnya 00 hingga 59
%tS Detik dalam satu menit, terdiri dari dua angka, misalnya 00 hingga 59
%tZ Singkatan zona waktu, seperti PST, UTC, dll.
Ini adalah daftar singkat kemungkinan tanda pemformatan tanggal - ada banyak sekali, untuk setiap selera. Daftar lengkapnya dan kemungkinan penentunya dapat ditemukan di tautan ini . Mari kita lihat cara menggunakan ini. Kali ini kami tidak menggunakan String.format() , tetapi langsung System.out.printf() .

Contoh 1

Selain itu, kita akan menyetel bahasa hasil dengan meneruskannya sebagai argumen pertama ke metode:
Date date = new Date();
System.out.printf(Locale.ENGLISH,"%tB %te, %tY",date,date,date);
Keluaran konsol:
11 Oktober 2020
Tanpa menentukan bahasa, bahasa default akan digunakan (misalnya, saya punya bahasa Rusia).

Contoh 2

Mari kita tampilkan tanggal yang lebih lengkap:
Date date = new Date();
System.out.printf("%td %tB %tY of %n%tH:%tM:%tS",date,date,date,date,date,date,date);
Dan output di konsol:
11 Oktober 2020 13:43:22
Melewati objek Date yang sama sebagai argumen berkali-kali... Kelihatannya tidak bagus, bukan? Mari gunakan subset $ internal untuk menentukan argumen yang ingin kita gunakan:
System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
Output di konsol kami tidak akan berubah. Ada cara lain yang sama menariknya untuk memformat tanggal. Anda dapat membaca tentangnya dan lebih banyak lagi tentang waktu dan tanggal di Jawa dalam materi ini . Sekian untuk hari ini, terima kasih atas perhatiannya!Format keluaran angka di Java - 5
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION