JavaRush /Java blogi /Random-UZ /Java-da raqamlarning chiqishini formatlash

Java-da raqamlarning chiqishini formatlash

Guruhda nashr etilgan
Hammaga salom! Ko'pincha bizning usullarimiz maxsus formatda ko'rsatilishi kerak bo'lgan raqamlar bilan birga keladi. Bu kichik narsaga o'xshaydi, lekin bu vazifani qanday amalga oshirgan bo'lardingiz? Java-da raqamlarning chiqishini formatlash - 1Bugun sizni bu haqda biroz o'ylashga taklif qilamiz. Birinchidan, Java-da raqamlarni formatlash bilan shug'ullanish uchun, String sinfining formatlash usulini eslaylik : umumiy statik String formati(String formati, Object... args) - qolgan args argumentlari yordamida format satridan formatlangan satrni qaytaradi . Va faqat bir misol:
String str = String.format("Hi - %s! How are you %s?", "Sasha", "At work");
System.out.println(str);
Natijada, biz konsolda chiqishni olamiz:
Salom Sasha! Ishda ishlar qanday?

Printf va formatlash usullari

String.format() satrni formatlashning yagona usuli emas. Uning analoglari System.out.printf() va System.out.format(); . Shunday qilib, oldingi kodni quyidagi bilan almashtirishimiz mumkin:
System.out.printf("Hi - %s! How are you %s?", "Sasha", "At work");
yoki
System.out.format("Hi - %s! How are you %s?", "Sasha", "At work");
Konsoldagi chiqish bir xil bo'lib qoladi. Yagona farq shundaki, bu usullar String.format() dan farqli ravishda konsoldagi qiymatni darhol aks ettiradi . Lekin menga String.format() ko'proq yoqadi, chunki biz har doim natijani konsolda ko'rsatishimiz shart emas, shuning uchun biz bu usuldan keyinroq foydalanamiz. Keling, misolimizga qaytaylik. Biz nimani ko'ramiz? Gap shundaki, %s belgilar bo'lgan joylarda "Sasha" va "ishda" qatorlari qo'yilgan . Bu rivojlanishda bizga qanday yordam berishi mumkin? Tasavvur qiling-a, sizda katta shablon matni bor, lekin ba'zi joylarda siz har xil bo'lishi mumkin bo'lgan va tashqaridan argument sifatida keladigan qiymatlarni kiritishingiz kerak. Bu erda ushbu formatlash foydali bo'ladi. Format spetsifikatsiyalari foiz belgisi bilan boshlanadi, % va formatlashtiriladigan argument turini ko'rsatuvchi belgi bilan tugaydi. Va, ehtimol, tushunganingizdek, %s ob'ektlar - satrlarni kiritish uchun ishlatiladi. Ammo, masalan, string ob'ekti ro'yxatdan o'tgan joyga dubl qo'yishga harakat qilsak :
String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
bu ham ishlaydi. double satrga o'tkaziladi va biz quyidagilarni olamiz:
Salom - 55.6! Ishda ishlar qanday?
Satrlar va suzuvchi nuqta raqamlaridan tashqari, Java-da boshqa turlar ham bor, shunday emasmi? Keling, butun arsenalni ko'rib chiqaylik:
Formatlash uchun qiymat turi Misol
%s Stringga uzatiladigan har qanday tur
String.format("Hi %s!","world")
Natija:
Salom Dunyo!
%b Booleanga o'tkaziladigan har qanday tur : true - qiymat null bo'lmasa, noto'g'ri - agar null bo'lsa
String.format("Hi %b!",null)
Natija:
Salom yolg'on
%h Siz hashCode() usulidan o'n oltilik qiymatlar qatoriga o'tiladigan har qanday ob'ektni o'tkazishingiz mumkin.
String.format("Hi %h!","world")
Natija:
Salom 106c44!
%c Unicode belgisini ( char ) belgilash uchun foydalaniladi
String.format("Hello m%cr!",'And')
Natija:
Salom Dunyo!
%d Butun son ko'rsatilgan ( int. bayt, short, int, long, BigInteger )
String.format("I'm already %d!",20)
Natija:
Men allaqachon 20 yoshdaman!
%f Suzuvchi nuqta raqamini belgilash uchun ishlatiladi
String.format("PI is - %f!", 3.14159)
Natija:
PI raqami - 3.141590!
%e Ilmiy belgilarda suzuvchi nuqta raqamlari
String.format("PI is - %e!", 3.14159);
Natija:
PI raqami - 3.141590e+00!
%a O'zgaruvchan nuqta raqamlari o'n oltilik tizimda ifodalanadi
String.format("PI is - %a!", 3.14159)
Natija:
PI raqami - 0x1.921f9f01b866ep1!
%x Butun son uzatiladi ( int. bayt, short, int, long, BigInteger ), formatlash natijasi ASCII jadvalidagi berilgan raqamga ega bo‘lgan belgi bo‘ladi.
String.format("I'm already %x!",25)
Natija:
Men allaqachon 19 yoshdaman!
%o Butun son ( int. bayt, short, int, long, BigInteger ) qabul qilinadi va sakkizlik son sifatida ifodalanadi
String.format("I already %o!",25);
Natija:
Men allaqachon 31 yoshdaman!
%t Sana va vaqtni o'zgartirish uchun prefiks. Formatlash uchun qo'shimcha bayroqlar talab qilinadi
String.format("Today is %tA",new Date())
Natija:
Bugun shanba
%n Platformaga xos chiziq ajratuvchi. Analog\n
String.format("Hello %n Hello")
Natija:
Salom salom
Keling, double uchun mosroq formatdan foydalanamiz:
String str = String.format("The distance from Kyiv to Odessa is %f. Not so short, is it?", 475.4d);
System.out.println(str);
Konsol chiqishi:
Kievdan Odessagacha bo'lgan masofa 475,400000. Juda oz emas, to'g'rimi?
Siz tushunganingizdek, %f Java-da double va float kabi ma'lumotlar turlarini o'z ichiga olgan suzuvchi nuqta raqamlari uchun ko'proq mos keluvchi belgi bo'lardi . Ushbu spetsifikatsiya yordamida biz suzuvchi nuqta raqamini formatlashimiz mumkin:
String str = String.format("The distance from Kyiv to Odessa is %.2f. Not so short, is it?", 475.4d);
Ushbu ko'rsatkichga .2 qo'shilishi o'nli kasrlar sonini ikkiga qisqartiradi va natijani beradi:
Kievdan Odessagacha bo'lgan masofa 475,40. Juda oz emas, to'g'rimi?
.2 spetsifikatsiyalar uchun yagona tweak emas. Ushbu kichik parametrlarning kombinatsiyasi ko'rsatma deb ataladi . Ko'rsatmalarningJava-da raqamlarning chiqishini formatlash - 2 umumiy shakli quyidagicha:
%[argument_index][bayroqlar][kenglik][.precision]turi spetsifikatsiyasi
Endi hamma narsani tartibda hal qilaylik:
  • [argument_index] - argumentlar ro'yxatidagi pozitsiyani ko'rsatadigan butun son. Masalan, birinchi argumentga havola $1, ikkinchi argumentga havola $2 va hokazo. Agar pozitsiya ko'rsatilmagan bo'lsa, argumentlar format qatorida havola qilingan tartibda bo'lishi kerak.
  • [bayroqlar] formatlash uchun maxsus belgilar. Masalan:
    • Agar raqamli qiymat ijobiy bo'lsa, u + belgisini o'z ichiga olishi kerakligini ko'rsatadigan + bayroq
    • - natijani chapga tekislashni bildiradi
    • , butun sonlar uchun ming ajratgichni o'rnatadi
  • [kenglik] musbat kasrli butun son boʻlib, chiqadigan belgilarning minimal sonini bildiradi. Agar bu raqam oldida 0 bo'lsa, etishmayotgan belgilar 0 bilan, agar 0 bo'lmasa, bo'sh joylar bilan to'ldiriladi.
  • [.accuracy] - oldin nuqta qo'yilgan manfiy bo'lmagan butun son. Odatda belgilar sonini cheklash uchun ishlatiladi. Muayyan xatti-harakatlar spetsifikatorning o'ziga xos turiga bog'liq.
Shuni ham ta'kidlashni istardimki, ko'rsatmalarning yuqoridagi barcha elementlari ixtiyoriydir va ularsiz hamma narsa ishlaydi. Kichik parametrlardan foydalanishga misol sifatida, Pi sonining aniq chiqishi kerakligini tasavvur qilaylik:
String str = String.format("%1$+09.5f", 3.1415926535897);
System.out.print(str);
Va shunga ko'ra, konsoldagi chiqish:
+03.14159
Oson ko'rinadi, to'g'rimi? Ammo raqamni formatlash haqida gap ketganda, siz DecimalFormatni e'tiborsiz qoldirolmaysiz . Keling, bu nimani anglatishini aniqlaylik.

Decimal Format

DecimalFormat - bu butun son yoki suzuvchi nuqtali raqam bo'lishidan qat'i nazar, Java-da istalgan raqamni formatlash uchun sinf. DecimalFormat obyekti yaratilganda siz kiruvchi raqamlarni formatlash uchun shablonni bevosita konstruktorda belgilashingiz mumkin. DecimalFormat yordamida bizning misolimiz shunday ko'rinadi :
DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
Konsol chiqishi:
72 224
#.### qatori o'tkazilgan qiymatni 3 kasrga formatlashimizni ko'rsatadigan naqshdir. Naqshlar uchun yana qanday belgilar mavjud? Mana ulardan ba'zilari:
  • # — raqam, bosh nol tushirilgan;
  • 0 - raqam har doim ko'rsatiladi, hatto raqam kamroq raqamlarga ega bo'lsa ham (bu holda 0 ko'rsatiladi);
  • . — oʻnlik ajratuvchi belgisi;
  • , — ajratuvchi guruhlash belgisi (masalan, minglik ajratuvchi);
  • ; — formatlarni ajratadi;
  • - — manfiy sonning prefiksini belgilaydi;
  • % - 100 ga ko'payadi va raqamni foiz sifatida ko'rsatadi;
  • ? — 1000 ga ko'payadi va sonni ppm da ko'rsatadi;
  • E - ilmiy belgilar uchun mantis va ko'rsatkichni ajratadi.
Keling, bir nechta misollarni ko'rib chiqaylik:
System.out.println(new DecimalFormat( "###,###.##" ).format(74554542.224463));
Konsol chiqishi:
74 554 542,22
System.out.println(new DecimalFormat( "%###.##" ).format(0.723456));
Konsol chiqishi:
%72,35
System.out.println(new DecimalFormat( "000.###" ).format(42.224463));
Konsol chiqishi:
042.224
Yangi shablonni aniqlash uchun har safar yangi DecimalFormat obyektini yaratish shart emas. Uning applicationPattern va applyLocalizedPattern usullaridan foydalanish kifoya :
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
Biz suzuvchi nuqtali raqamni formatlash haqida gapirganda, bizni yaxlitlash juda qiziqtiradi, shunday emasmi? Shunday qilib, o‘nlik kasrlari belgilangan naqshdan ortiq bo‘lgan sonni qirqishda DecimalFormat oxirgi kesilgan raqam 5 dan katta bo‘lsa, sonni yaxlitlaydi. Agar oxirgi kesilgan raqam 5 bo‘lsa-chi? Haqiqatan ham, bu holda, bu raqam eng yaqin tamsayılar orasidagi o'rtada joylashgan. Java-da raqamlarning chiqishini formatlash - 3Bunday holda, oldingi raqam hisobga olinadi. Agar oldingi raqam juft bo'lsa, yaxlitlash amalga oshiriladi:
DecimalFormat dF = new DecimalFormat("##.###");
String result = dF.format(56.4595);
System.out.println((result));
Konsol chiqishi:
56 459
Agar g'alati bo'lsa, u bajarilmaydi:
DecimalFormat dF = new DecimalFormat("##.###");
String str = dF.format(56.4595);
System.out.println((str));
Konsol chiqishi:
56 459
String.format() va DecimalFormat.format() yordamida suzuvchi nuqtali raqamlarni formatlash oʻrtasidagi farq shundaki, birinchi holatda kasr qismi boʻlmasa ham, keyingi nollar boʻladi. Masalan:
String firstStr = String.format("%.4f", 9.00001273);
System.out.println((firstStr));
Konsol chiqishi:
9.0000
DecimalFormat decimalFormat = new DecimalFormat("#.####");
String secondStr = decimalFormat.format(9.00001273);
System.out.println((secondStr));
Konsol chiqishi:
9
Ko'rib turganingizdek, 9.00001273 raqamini to'rtta kasr aniqligi bilan formatlashda String sinfining format() usuli 9.0000 qiymatini chiqaradi , DecimalFormatning shunga o'xshash format() usuli esa 9 ni chiqaradi .

BigDecimal va BigInteger

Biz Java-da raqamlarni yaxlitlash mavzusiga to'xtalib o'tganimiz uchun, keling, bunday operatsiyalar uchun BigDecimal sinfidan qanday foydalanish haqida gapiraylik . Bu sinf haqiqatan ham KATTA raqamlar bilan ishlashga qaratilgan: buning uchun maksimal ikki va float qiymatlari juda kichik. Bu sinfda suzuvchi nuqta yaxlitlash uchun juda ko'p turli xil sozlamalar, shuningdek, arifmetik operatsiyalar uchun ko'plab usullar mavjud. U shunga o'xshash sinfga ega, ammo asosiy e'tibor KATTA butun sonlar bilan ishlashga qaratilgan - BigInteger . Ushbu maqolada BigDecimal va BigInteger haqida ko'proq o'qishingiz mumkin .

Sana va vaqtni formatlash

Yuqorida faqat String sinfidagi format() dan foydalanib , vaqt va sanani ham formatlashingiz mumkinligi aytib o'tildi . Xo'sh, keling, bu qanday amalga oshirilganini ko'rib chiqaylik. Birinchidan, sanalar uchun %t format ko'rsatkichi ishlatilishini eslatib o'tmoqchimiz . Ikkinchidan, shablonni formatlashda sanalar uchun har bir format ko'rsatkichi uchun qo'shimcha formatlash bayroqlari talab qilinadi. Sanalar uchun mumkin bo'lgan formatlash bayroqlari:Java-da raqamlarning chiqishini formatlash - 4
Bayroqlar Tavsif
%tB Oyning to'liq nomi, masalan, yanvar, fevral va boshqalar.
%tb Oyning qisqartirilgan nomi, masalan, yanvar, fevral va boshqalar.
%tA Hafta kunining to'liq nomi, masalan, yakshanba, dushanba
%ta Hafta kunining qisqartirilgan nomi, masalan, Sun, Mon va boshqalar.
%tY Yil 4 xonali formatda, masalan 0000 dan 9999 gacha
%ty Yil 2 xonali formatda, masalan, 00 dan 99 gacha
%tm Oy boshida nol bilan formatlanadi, masalan, 01 dan 12 gacha
%tc Sana va vaqt %ta %tb %td %tT %tZ %tY formatida, masalan, dushanba 17-fevral 03:56:12 PST 2020
%tD Sana %tm/%td/%ty formatida
%td Ikki xonali formatda oyning kuni, masalan, 01 dan 31 gacha
%te Oyning kuni 0 dan boshlanmasdan formatda, masalan, 1 dan 31 gacha
%tT Vaqt 24 soatlik formatda, masalan %tH:%tM:%tS
%tH Kunning soati 24 soat formatida, 00 dan 23 gacha
%tI 12 soatlik format uchun kun soati, masalan, 01 dan 12 gacha
%tM Soatdagi daqiqalar bosh nol bilan formatlanadi, masalan, 00 dan 59 gacha
%tS Ikkita raqamdan iborat daqiqada soniyalar, masalan, 00 dan 59 gacha
%tZ Vaqt mintaqasining qisqartmasi, masalan, PST, UTC va boshqalar.
Bu sanani formatlash mumkin bo'lgan bayroqlarning qisqartirilgan ro'yxati - har qanday lazzat uchun ularning ko'pi bor. Ularning to'liq ro'yxati va mumkin bo'lgan spetsifikatsiyalar bilan ushbu havolada tanishishingiz mumkin . Keling, buni qanday ishlatishni ko'rib chiqaylik. Bu safar biz String.format() dan foydalanmaymiz , lekin darhol System.out.printf() dan foydalanamiz .

1-misol

Bundan tashqari, biz natija tilini metodga birinchi argument sifatida o'tkazish orqali o'rnatamiz:
Date date = new Date();
System.out.printf(Locale.ENGLISH,"%tB %te, %tY",date,date,date);
Konsol chiqishi:
11 oktyabr, 2020 yil
Tilni ko'rsatmasdan, standart til ishlatiladi (masalan, menda rus tili bor).

2-misol

To'liqroq sanani ko'rsatamiz:
Date date = new Date();
System.out.printf("%td %tB %tY of %n%tH:%tM:%tS",date,date,date,date,date,date,date);
Va konsoldagi chiqish:
2020 yil 11 oktyabr 13:43:22
Xuddi shu Date ob'ektini argument sifatida ko'p marta o'tkazish ... Bu unchalik yaxshi ko'rinmaydi, shunday emasmi? Biz foydalanmoqchi bo'lgan argumentni belgilash uchun $ ichki to'plamidan foydalanamiz :
System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
Bizning konsolimizdagi chiqish o'zgarmaydi. Sanalarni formatlashning boshqa bir xil qiziqarli usullari mavjud. Ushbu materialda ular haqida va Java'da vaqt va sana haqida bir oz ko'proq ma'lumot olishingiz mumkin . Bugun hammasi shu, e'tiboringiz uchun rahmat!Java-da raqamlarning chiqishini formatlash - 5
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION