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? Kami 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:
Mari kita gunakan format yang lebih sesuai untuk double :
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() .
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 |
Keputusan:
Hai dunia!
|
%b | Sebarang jenis yang akan dihantar ke boolean : true - jika nilainya bukan null, false - jika null |
Keputusan:
Hello palsu
|
%h | Anda boleh menghantar sebarang objek, yang akan dihantar ke rentetan nilai heksadesimal daripada kaedah hashCode() |
Keputusan:
Hello 106c44!
|
%c | Digunakan untuk menentukan aksara Unicode ( char ) |
Keputusan:
Hai dunia!
|
%d | Integer ditentukan ( int. byte, short, int, long, BigInteger ) |
Keputusan:
Saya sudah 20!
|
%f | Digunakan untuk menentukan nombor titik terapung |
Keputusan:
Nombor PI ialah - 3.141590!
|
%e | Nombor titik terapung dalam tatatanda saintifik |
Keputusan:
Nombor PI ialah - 3.141590e+00!
|
%a | Nombor titik terapung akan diwakili dalam perenambelasan |
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 |
Keputusan:
Saya sudah 19!
|
%o | Integer ( int. byte, short, int, long, BigInteger ) diterima dan akan diwakili sebagai nombor perlapanan |
Keputusan:
Saya sudah 31!
|
%t | Awalan untuk penukaran tarikh dan masa. Bendera tambahan diperlukan untuk pemformatan |
Keputusan:
Hari ini hari Sabtu
|
%n | Pemisah talian khusus platform. Analog\n |
Keputusan:
Hi hi
|
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 . Bentuk 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.
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.
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. Dalam 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. Baiklah, 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. |
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!
GO TO FULL VERSION