JavaRush /Java Blogu /Random-AZ /Java-da rəqəmlərin çıxışını formatlayın

Java-da rəqəmlərin çıxışını formatlayın

Qrupda dərc edilmişdir
Hamıya salam! Çox vaxt üsullarımız bəzi xüsusi formatda göstərilməli olan nömrələrlə gəlir. Bu kiçik bir şey kimi görünür, amma bu tapşırığı necə həyata keçirərdiniz? Java-da rəqəmlərin çıxışını formatlayın - 1Bu gün sizi bu barədə bir az düşünməyə dəvət edirik. Əvvəlcə Java-da rəqəmlərin formatlaşdırılmasına dalmaq üçün String sinfinin format metodunu xatırlayaq : ictimai statik String formatı(String formatı, Obyekt... args) - qalan args arqumentlərindən istifadə edərək format sətirindən formatlanmış sətri qaytarır . Və sadəcə bir nümunə:
String str = String.format("Hi - %s! How are you %s?", "Sasha", "At work");
System.out.println(str);
Nəticədə konsolda çıxış əldə edəcəyik:
Salam Sasha! İşlər necə gedir?

Printf və format üsulları

String.format() sətri formatlaşdırmaq üçün yeganə üsul deyil. Onun analoqları System.out.printf()System.out.format(); . Beləliklə, əvvəlki kodu aşağıdakılarla əvəz edə bilərik:
System.out.printf("Hi - %s! How are you %s?", "Sasha", "At work");
və ya
System.out.format("Hi - %s! How are you %s?", "Sasha", "At work");
Konsoldakı çıxış eyni qalacaq. Yeganə fərq ondadır ki, bu üsullar String.format() dan fərqli olaraq dəyəri dərhal konsolda göstərir . Ancaq mən String.format()-ı daha çox bəyənirəm, çünki nəticəni həmişə konsolda göstərməyə ehtiyacımız yoxdur, ona görə də bu üsuldan daha çox istifadə edəcəyik. Nümunəmizə qayıdaq. Biz nə görürük? Fakt budur ki, simvolların olduğu yerlərdə - %s , sətirlər - "Saşa""işdə" daxil edilir . Bu inkişafda bizə necə kömək edə bilər? Təsəvvür edin ki, böyük bir şablon mətniniz var, lakin bəzi yerlərdə fərqli ola biləcək və kənardan arqument kimi gələn dəyərlər daxil etməlisiniz. Bu formatın lazımlı olduğu yer budur. Format təyinediciləri faiz işarəsi, % ilə başlayır və formatlaşdırılacaq arqumentin növünü göstərən simvolla bitir. Və yəqin ki, başa düşdüyünüz kimi, %s obyektləri - sətirləri daxil etmək üçün istifadə olunur. Ancaq məsələn, sətir obyektinin qeydə alındığı yerə ikiqat daxil etməyə çalışsaq :
String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
bu da işləyəcək. double sətirə ötürüləcək və biz əldə edəcəyik:
Salam - 55.6! İşlər necə gedir?
Sətirlərdən və üzən nöqtə nömrələrindən başqa Java-da başqa növlər də var, elə deyilmi? Beləliklə, gəlin bütün arsenala nəzər salaq:
Formatlanacaq dəyər növü Misal
%s Sətirə ötürüləcək istənilən növ
String.format("Hi %s!","world")
Nəticə:
Salam Dünya!
%b Boolean -a ötürüləcək istənilən növ : doğru - dəyər sıfır deyilsə, yalan - boşdursa
String.format("Hi %b!",null)
Nəticə:
Salam yalan
%h Siz hashCode() metodundan onaltılıq dəyər sətirinə çevriləcək istənilən obyekti ötürə bilərsiniz.
String.format("Hi %h!","world")
Nəticə:
Salam 106c44!
%c Unicode simvolunu ( char ) təyin etmək üçün istifadə olunur
String.format("Hello m%cr!",'And')
Nəticə:
Salam Dünya!
%d Tam ədəd müəyyən edilmişdir ( int. bayt, qısa, int, uzun, BigInteger )
String.format("I'm already %d!",20)
Nəticə:
Artıq 20 yaşım var!
%f Üzən nöqtə nömrəsini təyin etmək üçün istifadə olunur
String.format("PI is - %f!", 3.14159)
Nəticə:
PI nömrəsi - 3.141590!
%e Elmi qeydlərdə üzən nöqtə nömrələri
String.format("PI is - %e!", 3.14159);
Nəticə:
PI nömrəsi - 3.141590e+00!
%a Üzən nöqtə nömrələri onaltılıq sistemlə təmsil olunacaq
String.format("PI is - %a!", 3.14159)
Nəticə:
PI nömrəsi - 0x1.921f9f01b866ep1!
%x Tam ədəd ötürülür ( int. bayt, short, int, long, BigInteger ), formatlaşdırma nəticəsi ASCII cədvəlində verilmiş nömrə ilə simvol olacaq
String.format("I'm already %x!",25)
Nəticə:
Mənim artıq 19 yaşım var!
%o Tam ədəd ( int. bayt, short, int, long, BigInteger ) qəbul edilir və səkkizlik ədəd kimi göstəriləcək
String.format("I already %o!",25);
Nəticə:
Artıq 31 yaşım var!
%t Tarix və vaxt dönüşümləri üçün prefiks. Formatlaşdırma üçün əlavə bayraqlar tələb olunur
String.format("Today is %tA",new Date())
Nəticə:
Bugün şənbədir
%n Platforma üçün xüsusi xətt ayırıcı. Analoq\n
String.format("Hello %n Hello")
Nəticə:
Salam Salam
Double üçün daha uyğun formatdan istifadə edək:
String str = String.format("The distance from Kyiv to Odessa is %f. Not so short, is it?", 475.4d);
System.out.println(str);
Konsol çıxışı:
Kiyevdən Odessaya olan məsafə 475,400000-dir. O qədər də az deyil, hə?
Anladığınız kimi, %f Java-da doublefloat kimi məlumat növlərini əhatə edən üzən nöqtəli nömrələr üçün daha uyğun təyinedici olardı . Bu təyinedici ilə biz üzən nöqtə nömrəsini formatlaya bilərik:
String str = String.format("The distance from Kyiv to Odessa is %.2f. Not so short, is it?", 475.4d);
Bu spesifikatora .2-nin daxil edilməsi ondalıq yerlərin sayını ikiyə endirərək, bizə nəticə verəcək:
Kiyevdən Odessaya olan məsafə 475,40-dır. O qədər də az deyil, hə?
.2 spesifikatorlar üçün yeganə düzəliş deyil. Bu altseçimlərin birləşməsi təlimat adlanır . TəlimatlarınJava-da rəqəmlərin çıxışını formatlayın - 2 ümumi forması aşağıdakı kimidir:
%[arqument_index][bayraqlar][enlik][.precision]növ spesifikatoru
İndi hər şeyi ardıcıllıqla deşifrə edək:
  • [arqument_index] arqument siyahısındakı mövqeyi göstərən tam ədəddir. Məsələn, birinci arqumentin keçidi $1, ikinci arqumentin keçidi $2 və s. Mövqe göstərilməyibsə, arqumentlər format sətirində istinad edildiyi qaydada olmalıdır.
  • [bayraqlar] formatlama üçün xüsusi simvollardır. Misal üçün:
    • Rəqəmsal dəyər müsbət olarsa, ona + işarəsi daxil edilməli olduğunu göstərən + bayraq
    • - nəticənin sola düzülməsi deməkdir
    • , tam ədədlər üçün minlərlə ayırıcı təyin edir
  • [en], çıxarılacaq simvolların minimum sayını təyin edən müsbət onluq tam ədəddir. Bu rəqəmin qarşısında 0 varsa, çatışmayan simvollar 0, 0 yoxdursa, boşluqlarla doldurulacaq.
  • [.dəqiqlik] əvvəlində nöqtə olan qeyri-mənfi tam ədəddir. Adətən simvolların sayını məhdudlaşdırmaq üçün istifadə olunur. Xüsusi davranış spesifik spesifik tipdən asılıdır.
Onu da qeyd etmək istərdim ki, təlimatların yuxarıdakı elementlərinin hamısı isteğe bağlıdır və onlarsız hər şey işləyəcək. Alt parametrlərdən istifadə nümunəsi olaraq, Pi sayının müəyyən bir çıxışına ehtiyacımız olduğunu təsəvvür edək:
String str = String.format("%1$+09.5f", 3.1415926535897);
System.out.print(str);
Və buna görə konsolda çıxış:
+03.14159
Asan görünür, elə deyilmi? Ancaq nömrənin formatlaşdırılmasına gəldikdə, DecimalFormat-a məhəl qoya bilməzsiniz . Bunun nə demək olduğunu anlayaq.

Ondalık Format

DecimalFormat Java-da istənilən ədədi, istər tam ədəd, istərsə də üzən nöqtəli ədədi formatlamaq üçün sinifdir. DecimalFormat obyekti yaradıldıqda , gələn nömrələri birbaşa konstruktorda formatlaşdırmaq üçün şablon təyin edə bilərsiniz. DecimalFormat istifadə edərək nümunəmiz belə görünür :
DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
Konsol çıxışı:
72,224
#.### sətri , ötürülən dəyəri 3 onluq yerə formatlaşdırdığımızı göstərən nümunədir. Nümunələr üçün başqa hansı simvollar mövcuddur? Onlardan bəzilərini təqdim edirik:
  • # — rəqəm, aparıcı sıfırlar buraxılıb;
  • 0 — rəqəmin daha az rəqəmi olsa belə, rəqəm həmişə göstərilir (bu halda 0 göstərilir);
  • . — onluq ayırıcı işarəsi;
  • , — ayırıcı qruplaşdırma işarəsi (məsələn, minlərlə ayırıcı);
  • ; — formatları ayırır;
  • - — mənfi ədədin prefiksini qeyd edir;
  • % - 100-ə vurur və rəqəmi faizlə göstərir;
  • ? — 1000-ə vurulur və rəqəmi ppm ilə göstərir;
  • E - Elmi qeyd üçün mantisanı və eksponenti ayırır.
Bir neçə nümunəyə nəzər salaq:
System.out.println(new DecimalFormat( "###,###.##" ).format(74554542.224463));
Konsol çıxışı:
74,554,542,22
System.out.println(new DecimalFormat( "%###.##" ).format(0.723456));
Konsol çıxışı:
%72,35
System.out.println(new DecimalFormat( "000.###" ).format(42.224463));
Konsol çıxışı:
042.224
Yeni şablon müəyyən etmək üçün hər dəfə yeni DecimalFormat obyekti yaratmaq lazım deyil. Onun applicationPatternapplyLocalizedPattern üsullarından istifadə etmək kifayətdir :
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
Üzən nöqtəli nömrənin formatlaşdırılması haqqında danışarkən, biz yuvarlaqlaşdırma ilə çox maraqlanırıq, elə deyilmi? Beləliklə, göstərilən nümunədən kənarda onluq yerləri olan ədədi kəsərkən, sonuncu kəsilmiş ədəd 5-dən çox olarsa, Ondalık Format rəqəmi yuxarı yuvarlaqlaşdırır. Əgər sonuncu kəsilmiş ədəd 5 olarsa? Həqiqətən də, bu halda, bu rəqəm ən yaxın tam ədədlər arasında tam ortadadır. Java-da rəqəmlərin çıxışını formatlayın - 3Bu zaman əvvəlki rəqəm nəzərə alınır. Əvvəlki nömrə cütdürsə, yuvarlaqlaşdırma aparılır:
DecimalFormat dF = new DecimalFormat("##.###");
String result = dF.format(56.4595);
System.out.println((result));
Konsol çıxışı:
56,459
Qəribədirsə, yerinə yetirilmir:
DecimalFormat dF = new DecimalFormat("##.###");
String str = dF.format(56.4595);
System.out.println((str));
Konsol çıxışı:
56,459
String.format()DecimalFormat.format() istifadə edərək üzən nöqtəli ədədlərin formatlanması arasındakı fərq ondadır ki, birinci halda heç bir kəsr hissəsi olmasa belə, arxada sıfırlar olacaq. Misal üçün:
String firstStr = String.format("%.4f", 9.00001273);
System.out.println((firstStr));
Konsol çıxışı:
9.0000
DecimalFormat decimalFormat = new DecimalFormat("#.####");
String secondStr = decimalFormat.format(9.00001273);
System.out.println((secondStr));
Konsol çıxışı:
9
Gördüyünüz kimi, 9.00001273 rəqəmini dörd onluq dəqiqliklə formatlayarkən String sinifinin format() metodu 9.0000 dəyərini , DecimalFormatın oxşar format() metodu isə 9-u çıxaracaq .

BigDecimal və BigInteger

Java-da ədədlərin yuvarlaqlaşdırılması mövzusuna toxunduğumuz üçün gəlin belə əməliyyatlar üçün BigDecimal sinfindən necə istifadə etmək barədə danışaq . Bu sinif həqiqətən BÖYÜK ədədlərlə işləməyə yönəlib: bunun üçün maksimum ikiqatfloat dəyərləri çox kiçikdir. Bu sinifdə üzən nöqtələrin yuvarlaqlaşdırılması üçün çoxlu müxtəlif parametrlər, eləcə də hesab əməliyyatları üçün bir çox üsul var. Onun oxşar sinfi var, lakin əsas diqqət BÖYÜK tam ədədlərlə işləməyə yönəlib - BigInteger . Bu məqalədə BigDecimal BigInteger haqqında ətraflı oxuya bilərsiniz .

Tarix və Saatın Formatlanması

Yalnız yuxarıda qeyd olundu ki, String sinfinin format() funksiyasından istifadə etməklə siz həm də vaxtı və tarixi formatlaya bilərsiniz. Yaxşı, gəlin bunun necə edildiyinə nəzər salaq. Əvvəlcə sizə xatırlatmaq istərdik ki, %t format təyinedicisi tarixlər üçün istifadə olunur . İkincisi, şablonu formatlayarkən, tarixlər üçün hər bir format təyinedicisi üçün əlavə formatlaşdırma bayraqları tələb olunur. Tarixlər üçün mümkün formatlama bayraqları bunlardır:Java-da rəqəmlərin çıxışını formatlayın - 4
Bayraqlar Təsvir
%tB Ayın tam adı, məsələn, yanvar, fevral və s.
%tb Ayın qısaldılmış adı, məsələn, Yanvar, Fevral və s.
%tA Həftənin gününün tam adı, məsələn, bazar, bazar ertəsi
%ta Həftənin gününün qısaldılmış adı, məsələn, Sun, Mon və s.
%tY İl 4 rəqəmli formatda, məsələn 0000-dan 9999-a qədər
%ty İl 2 rəqəmli formatda, məsələn, 00-dan 99-a qədər
%tm Ay başlanğıcda sıfırla formatlanır, məsələn, 01-dən 12-ə qədər
%tc %ta %tb %td %tT %tZ %tY formatında tarix və vaxt, məsələn, Bazar ertəsi 17 Fevral 03:56:12 PST 2020
%tD %tm/%td/%ty formatında tarix
%td İki rəqəmli formatda ayın günü, məsələn 01-dən 31-ə qədər
%te Ayın günü 0 olmadan formatda, məsələn 1-dən 31-ə qədər
%tT 24 saat formatında vaxt, məsələn %tH:%tM:%tS
%tH Günün saatı 24 saat formatında, 00-dan 23-ə qədər
%tI 12 saat formatı üçün günün saatı, məsələn, 01-12
%tM Saatdakı dəqiqələr başlanğıc sıfırla formatlanır, məsələn, 00-dan 59-a qədər
%tS İki rəqəmdən ibarət dəqiqədə saniyələr, məsələn, 00-dan 59-a qədər
%tZ Saat qurşağının abreviaturası, məsələn, PST, UTC və s.
Bu, mümkün tarix formatlama bayraqlarının qısaldılmış siyahısıdır - hər zövqə uyğun bir çoxu var. Onların tam siyahısı və mümkün spesifikatorları bu linkdə tapa bilərsiniz . Bunun necə istifadə olunacağına baxaq. Bu dəfə biz String.format() deyil , dərhal System.out.printf() istifadə edirik .

Misal 1

Bundan əlavə, nəticənin dilini metoda ilk arqument kimi ötürməklə təyin edəcəyik:
Date date = new Date();
System.out.printf(Locale.ENGLISH,"%tB %te, %tY",date,date,date);
Konsol çıxışı:
11 oktyabr 2020-ci il
Dil göstərilmədən standart dil istifadə olunacaq (məsələn, məndə rus dili var).

Misal 2

Daha tam tarixi göstərək:
Date date = new Date();
System.out.printf("%td %tB %tY of %n%tH:%tM:%tS",date,date,date,date,date,date,date);
Və konsolda çıxış:
11 oktyabr 2020 13:43:22
Eyni Date obyektini arqument kimi dəfələrlə ötürmək... Çox yaxşı görünmür, elə deyilmi? İstifadə etmək istədiyimiz arqumenti müəyyən etmək üçün $ daxili alt çoxluqdan istifadə edək :
System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
Konsolumuzdakı çıxış dəyişməyəcək. Tarixləri formatlaşdırmağın digər eyni dərəcədə maraqlı yolları da var. Bu materialda onlar haqqında və Java-da vaxt və tarix haqqında bir az daha çox oxuya bilərsiniz . Bu günə qədər bu qədərdi, diqqətinizə görə təşəkkürlər!Java-da rəqəmlərin çıxışını formatlayın - 5
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION