JavaRush /Blog Java /Random-MS /Formatkan output nombor dalam Java

Formatkan output nombor dalam Java

Diterbitkan dalam kumpulan
Hai semua! Selalunya kaedah kami datang dengan nombor yang perlu dipaparkan dalam beberapa format khas. Ia kelihatan seperti perkara kecil, tetapi bagaimana anda akan melaksanakan tugas ini? Formatkan output nombor dalam Java - 1Kami menjemput anda untuk memikirkan perkara ini sedikit hari ini. Mula-mula, untuk menyelami pemformatan nombor dalam Java, mari kita ingat kaedah format kelas String : format String statik awam(Format rentetan, Objek... args) - mengembalikan rentetan yang diformatkan daripada rentetan format menggunakan argumen args yang tinggal . Dan hanya contoh:
String str = String.format("Hi - %s! How are you %s?", "Sasha", "At work");
System.out.println(str);
Akibatnya, kami akan mendapat output dalam konsol:
Hello Sasha! Bagaimana keadaan di tempat kerja?

Kaedah printf dan format

String.format() bukan satu-satunya kaedah untuk memformat rentetan. Analognya ialah System.out.printf() dan System.out.format(); . Jadi, kita boleh menggantikan kod 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 dalam konsol akan kekal sama. Satu-satunya perbezaan ialah kaedah ini dengan serta-merta memaparkan nilai dalam konsol, tidak seperti String.format() . Tetapi saya lebih suka String.format() kerana kita tidak semestinya perlu memaparkan hasilnya dalam konsol, jadi kita akan menggunakan kaedah ini dengan lebih lanjut. Mari kita kembali kepada contoh kita. Apa yang kita nampak? Dan hakikatnya ialah di tempat yang terdapat aksara - %s , baris - “Sasha” dan “di tempat kerja” disisipkan . Bagaimanakah ini boleh membantu kita dalam pembangunan? Bayangkan anda mempunyai teks templat yang besar, tetapi di beberapa tempat anda perlu memasukkan nilai yang mungkin berbeza dan datang sebagai hujah dari luar. Di sinilah pemformatan ini berguna. Penentu format bermula dengan tanda peratus, % dan berakhir dengan aksara yang menunjukkan jenis hujah yang akan diformatkan. Dan, seperti yang anda mungkin faham, %s digunakan untuk memasukkan objek - rentetan. Tetapi jika kita cuba memasukkan, sebagai contoh, dua kali ganda ke tempat di mana objek rentetan didaftarkan:
String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
ini juga akan berfungsi. double akan dilemparkan ke rentetan dan kita akan mendapat:
Hello - 55.6! Bagaimana keadaan di tempat kerja?
Selain nombor rentetan dan titik terapung, terdapat jenis lain di Jawa, bukan? Jadi mari kita lihat keseluruhan senjata:
Jenis nilai untuk diformat Contoh
%s Sebarang jenis yang akan dihantar ke rentetan
String.format("Hi %s!","world")
Keputusan:
Hai dunia!
%b Sebarang jenis yang akan dihantar ke boolean : true - jika nilainya bukan null, false - jika null
String.format("Hi %b!",null)
Keputusan:
Hello palsu
%h Anda boleh menghantar sebarang objek, yang akan dihantar ke rentetan nilai heksadesimal daripada kaedah hashCode()
String.format("Hi %h!","world")
Keputusan:
Hello 106c44!
%c Digunakan untuk menentukan aksara Unicode ( char )
String.format("Hello m%cr!",'And')
Keputusan:
Hai dunia!
%d Integer ditentukan ( int. byte, short, int, long, BigInteger )
String.format("I'm already %d!",20)
Keputusan:
Saya sudah 20!
%f Digunakan untuk menentukan nombor titik terapung
String.format("PI is - %f!", 3.14159)
Keputusan:
Nombor PI ialah - 3.141590!
%e Nombor titik terapung dalam tatatanda saintifik
String.format("PI is - %e!", 3.14159);
Keputusan:
Nombor PI ialah - 3.141590e+00!
%a Nombor titik terapung akan diwakili dalam perenambelasan
String.format("PI is - %a!", 3.14159)
Keputusan:
Nombor PI ialah - 0x1.921f9f01b866ep1!
%x Integer diluluskan ( int. byte, short, int, long, BigInteger ), hasil pemformatan akan menjadi aksara dengan nombor yang diberikan dalam jadual ASCII
String.format("I'm already %x!",25)
Keputusan:
Saya sudah 19!
%o Integer ( int. byte, short, int, long, BigInteger ) diterima dan akan diwakili sebagai nombor perlapanan
String.format("I already %o!",25);
Keputusan:
Saya sudah 31!
%t Awalan untuk penukaran tarikh dan masa. Bendera tambahan diperlukan untuk pemformatan
String.format("Today is %tA",new Date())
Keputusan:
Hari ini hari Sabtu
%n Pemisah talian khusus platform. Analog\n
String.format("Hello %n Hello")
Keputusan:
Hi hi
Mari kita gunakan format yang lebih sesuai 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);
Output konsol:
Jarak dari Kyiv ke Odessa ialah 475.400000. Bukan sedikit kan?
Seperti yang anda mungkin sedar, %f akan menjadi penentu yang lebih sesuai untuk nombor titik terapung, yang termasuk jenis data seperti dua kali ganda dan terapung dalam Java. Dengan penentu ini kita boleh memformat nombor titik terapung:
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 bilangan tempat perpuluhan kepada dua, memberikan kita output:
Jarak dari Kyiv ke Odessa ialah 475.40. Bukan sedikit kan?
.2 bukan satu-satunya tweak kepada penentu. Gabungan subset ini dipanggil arahan . Formatkan output nombor dalam Java - 2Bentuk umum arahan adalah seperti berikut:
%[argument_index][flags][width][.precision]penentu jenis
Sekarang mari kita tafsirkan semuanya mengikut urutan:
  • [argument_index] ialah integer yang menunjukkan kedudukan dalam senarai argumen. Sebagai contoh, pautan ke hujah pertama ialah $1, pautan ke hujah kedua ialah $2, dsb. Jika kedudukan tidak ditentukan, argumen mestilah dalam susunan yang sama seperti yang dirujuk dalam rentetan format.
  • [flags] ialah aksara khas untuk pemformatan. Sebagai contoh:
    • + bendera yang menunjukkan bahawa jika nilai berangka adalah positif, ia mesti mengandungi tanda +
    • - bermaksud menyelaraskan hasil ke kiri
    • , menetapkan pemisah ribu untuk integer
  • [lebar] ialah integer perpuluhan positif yang menentukan bilangan minimum aksara yang akan dikeluarkan. Jika nombor ini didahului dengan 0, maka aksara yang hilang akan diisi dengan 0, jika tiada 0, maka dengan ruang.
  • [.ketepatan] ialah integer bukan negatif yang didahului oleh titik. Biasanya digunakan untuk mengehadkan bilangan aksara. Tingkah laku khusus bergantung pada jenis penentu tertentu.
Saya juga ingin ambil perhatian bahawa semua elemen arahan di atas adalah pilihan, dan semuanya akan berfungsi tanpanya. Sebagai contoh menggunakan subsetting, mari kita bayangkan bahawa kita memerlukan output tertentu bagi nombor Pi:
String str = String.format("%1$+09.5f", 3.1415926535897);
System.out.print(str);
Dan dengan itu, output dalam konsol:
+03.14159
Nampak mudah kan? Tetapi apabila ia datang untuk memformat nombor, anda tidak boleh mengabaikan DecimalFormat . Mari kita fikirkan apa maksudnya.

Format Perpuluhan

DecimalFormat ialah kelas untuk memformat sebarang nombor dalam Java, sama ada integer atau nombor terapung. Apabila objek DecimalFormat dicipta , anda boleh menentukan templat untuk memformat nombor masuk terus dalam pembina. Ini adalah contoh kami akan kelihatan seperti menggunakan DecimalFormat :
DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
Output konsol:
72,224
Baris #.### ialah corak yang menunjukkan bahawa kami sedang memformatkan nilai yang dihantar kepada 3 tempat perpuluhan. Apakah simbol lain yang tersedia untuk corak? Berikut adalah sebahagian daripada mereka:
  • # — digit, sifar pendahuluan ditinggalkan;
  • 0 — digit sentiasa dipaparkan, walaupun nombor itu mempunyai lebih sedikit digit (dalam kes ini, 0 dipaparkan);
  • . — tanda pemisah perpuluhan;
  • , — tanda kumpulan pemisah (contohnya, pemisah beribu-ribu);
  • ; — memisahkan format;
  • - — menandakan awalan nombor negatif;
  • % - darab dengan 100 dan menunjukkan nombor sebagai peratusan;
  • ? — darab dengan 1000 dan menunjukkan nombor dalam ppm;
  • E - Mengasingkan mantissa dan eksponen untuk tatatanda saintifik.
Mari kita lihat beberapa contoh:
System.out.println(new DecimalFormat( "###,###.##" ).format(74554542.224463));
Output konsol:
74,554,542.22
System.out.println(new DecimalFormat( "%###.##" ).format(0.723456));
Output konsol:
%72.35
System.out.println(new DecimalFormat( "000.###" ).format(42.224463));
Output konsol:
042.224
Ia tidak perlu mencipta objek DecimalFormat baharu setiap kali untuk menentukan templat baharu. Ia akan mencukupi untuk menggunakan kaedah applyPattern dan applyLocalizedPattern :
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
Apabila kita bercakap tentang memformat nombor titik terapung, kita agak berminat untuk membulatkan, bukan? Jadi, apabila memangkas nombor dengan tempat perpuluhan melebihi corak yang ditentukan, DecimalFormat membundarkan nombor itu ke atas jika nombor dipangkas terakhir lebih besar daripada 5. Bagaimana jika nombor dipangkas terakhir ialah 5? Sesungguhnya, dalam kes ini, nombor ini betul-betul berada di tengah-tengah antara integer terdekat. Formatkan output nombor dalam Java - 3Dalam kes ini, nombor sebelumnya diambil kira. Jika nombor sebelumnya genap, pembundaran dilakukan:
DecimalFormat dF = new DecimalFormat("##.###");
String result = dF.format(56.4595);
System.out.println((result));
Output konsol:
56,459
Jika ganjil, ia tidak dilakukan:
DecimalFormat dF = new DecimalFormat("##.###");
String str = dF.format(56.4595);
System.out.println((str));
Output konsol:
56,459
Perbezaan antara memformat nombor titik terapung menggunakan String.format() dan DecimalFormat.format() ialah dalam kes pertama akan terdapat sifar mengekor, walaupun tiada bahagian pecahan. Sebagai contoh:
String firstStr = String.format("%.4f", 9.00001273);
System.out.println((firstStr));
Output konsol:
9.0000
DecimalFormat decimalFormat = new DecimalFormat("#.####");
String secondStr = decimalFormat.format(9.00001273);
System.out.println((secondStr));
Output konsol:
9
Seperti yang anda lihat, apabila memformat nombor 9.00001273 dengan ketepatan empat tempat perpuluhan, kaedah format() kelas String akan mengeluarkan nilai 9.0000 , manakala kaedah format() yang serupa bagi DecimalFormat akan mengeluarkan 9 .

BigDecimal dan BigInteger

Memandangkan kita telah menyentuh topik pembundaran nombor di Jawa, mari kita bincangkan tentang cara menggunakan kelas BigDecimal untuk operasi sedemikian . Kelas ini memberi tumpuan kepada bekerja dengan nombor yang benar-benar BESAR: untuk itu, nilai ganda maksimum dan apungan adalah terlalu kecil. Kelas ini mempunyai banyak tetapan berbeza untuk pembundaran titik terapung, serta banyak kaedah untuk operasi aritmetik. Ia mempunyai kelas yang serupa, tetapi menumpukan pada bekerja dengan integer BESAR - BigInteger . Anda boleh membaca lebih lanjut mengenai BigDecimal dan BigInteger dalam artikel ini .

Memformat Tarikh dan Masa

Ia hanya disebutkan di atas bahawa menggunakan format() kelas String anda juga boleh memformat masa dan tarikh. Formatkan output nombor dalam Java - 4Baiklah, mari kita lihat bagaimana ia dilakukan. Pertama, kami ingin mengingatkan anda bahawa penentu format %t digunakan untuk tarikh . Kedua, apabila memformat templat, bendera pemformatan tambahan diperlukan untuk setiap penentu format untuk tarikh. Berikut ialah bendera pemformatan yang mungkin untuk tarikh:
Bendera Penerangan
%tB Nama penuh bulan, contohnya, Januari, Februari, dsb.
%tb Nama singkatan bulan, contohnya, Jan, Feb, dll.
%tA Nama penuh hari dalam seminggu, contohnya, Ahad, Isnin
%ta Nama singkatan hari dalam seminggu, contohnya, Sun, Mon, dsb.
%tY Tahun dalam format 4 digit, contohnya 0000 hingga 9999
%ty Tahun dalam format 2 digit, contohnya, dari 00 hingga 99
%tm Bulan diformatkan dengan sifar pada permulaan, contohnya 01 hingga 12
%tc Tarikh dan masa dalam format %ta %tb %td %tT %tZ %tY, contohnya, Isn Feb 17 03:56:12 PST 2020
%tD Tarikh dalam format %tm/%td/%ty
%td Hari dalam bulan dalam format dua digit, contohnya 01 hingga 31
%te Hari dalam bulan dalam format tanpa mendahului 0, contohnya dari 1 hingga 31
%tT Masa dalam format 24 jam, contohnya %tH:%tM:%tS
%tH Jam dalam sehari dalam format 24 jam, dari 00 hingga 23
%tI Jam dalam sehari untuk format 12 jam, mis. 01 hingga 12
%tM Minit dalam satu jam diformatkan dengan sifar pendahuluan, contohnya 00 hingga 59
%tS Saat dalam satu minit, terdiri daripada dua digit, contohnya, dari 00 hingga 59
%tZ Singkatan zon waktu, seperti PST, UTC, dsb.
Ini ialah senarai dipendekkan bendera pemformatan tarikh yang mungkin - terdapat banyak daripadanya, untuk setiap citarasa. Senarai lengkap mereka dan penentu yang mungkin boleh didapati di pautan ini . Mari lihat cara menggunakan ini. Kali ini kita tidak menggunakan String.format() , tetapi segera System.out.printf() .

Contoh 1

Di samping itu, kami akan menetapkan bahasa hasil dengan menghantarnya sebagai hujah pertama kepada kaedah:
Date date = new Date();
System.out.printf(Locale.ENGLISH,"%tB %te, %tY",date,date,date);
Output konsol:
11 Oktober 2020
Tanpa menentukan bahasa, bahasa lalai akan digunakan (contohnya, saya mempunyai bahasa Rusia).

Contoh 2

Mari paparkan tarikh 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 dalam konsol:
11 Oktober 2020 13:43:22
Melepasi objek Tarikh yang sama sebagai hujah berkali-kali... Ia tidak kelihatan sangat baik, bukan? Mari kita gunakan subset dalaman $ untuk menentukan hujah yang ingin kita gunakan:
System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
Output dalam konsol kami tidak akan berubah. Terdapat cara lain yang sama menarik untuk memformat tarikh. Anda boleh membaca tentang mereka dan sedikit lagi tentang masa dan tarikh di Jawa dalam bahan ini . Itu sahaja untuk hari ini, terima kasih atas perhatian anda!Formatkan output nombor dalam Java - 5
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION