JavaRush /Java блогы /Random-KK /Java тіліндегі сандар шығысын пішімдеу

Java тіліндегі сандар шығысын пішімдеу

Топта жарияланған
Бәріңе сәлем! Көбінесе біздің әдістеріміз қандай да бір арнайы форматта көрсетілуі қажет сандармен бірге келеді. Бұл кішкентай нәрсе сияқты, бірақ сіз бұл тапсырманы қалай жүзеге асырар едіңіз? Java тіліндегі сандар шығысын пішімдеңіз - 1Бүгін осы туралы аздап ойлануға шақырамыз. Алдымен, Java тіліндегі сандарды пішімдеуге кірісу үшін String класының пішім әдісін еске түсірейік : public static String format(String format, Object... args) - қалған args аргументтерін пайдаланып пішім жолынан пішімделген жолды қайтарады . Және бір ғана мысал:
String str = String.format("Hi - %s! How are you %s?", "Sasha", "At work");
System.out.println(str);
Нәтижесінде біз консольдегі нәтижені аламыз:
Сәлем Саша! Жұмысың қалай?

printf және формат әдістері

String.format() жолды пішімдеудің жалғыз әдісі емес. Оның аналогтары System.out.printf() және System.out.format(); . Осылайша, біз алдыңғы codeты келесімен ауыстыра аламыз:
System.out.printf("Hi - %s! How are you %s?", "Sasha", "At work");
немесе
System.out.format("Hi - %s! How are you %s?", "Sasha", "At work");
Консольдегі шығыс өзгеріссіз қалады. Жалғыз айырмашылық мынада, бұл әдістер String.format() сияқты мәнді бірден консольде көрсетеді . Бірақ маған String.format() ұнайды, өйткені біз әрқашан нәтижені консольде көрсетудің қажеті жоқ, сондықтан біз бұл әдісті әрі қарай қолданамыз. Біздің мысалға оралайық. Біз не көріп тұрмыз? Және факт, таңбалар болған жерлерде - %s , жолдар - «Саша» және «жұмыс үстінде» енгізілген . Бұл дамуымызға қалай көмектеседі? Сізде үлкен үлгі мәтіні бар деп елестетіп көріңіз, бірақ кейбір жерлерде әртүрлі болуы мүмкін және сырттан дәлел ретінде келетін мәндерді енгізу керек. Бұл пішімдеу ыңғайлы жерде. Пішім спецификаторлары пайыз белгісімен, % басталады және пішімделетін аргумент түрін көрсететін таңбамен аяқталады. Және, сіз түсінгендей, %s нысандарды - жолдарды кірістіру үшін пайдаланылады. Бірақ, мысалы, жол нысаны тіркелген жерге қосарлы мәнді енгізуге тырыссақ :
String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
бұл да жұмыс істейді. double жолға шығарылады және біз мынаны аламыз:
Сәлем - 55,6! Жұмысың қалай?
Жолдар мен өзгермелі нүкте сандарынан басқа Java-да басқа түрлері бар, солай емес пе? Сонымен, бүкіл арсеналды қарастырайық:
Пішімдеу үшін мән түрі Мысал
%s Жолға шығарылатын кез келген түр
String.format("Hi %s!","world")
Нәтиже:
Сәлем Әлем!
%b Логикалық түрге шығарылатын кез келген түр : шын - мән нөл емес болса, жалған - бос болса
String.format("Hi %b!",null)
Нәтиже:
Сәлем жалған
%сағ hashCode() әдісінен он алтылық мән жолына шығарылатын кез келген нысанды беруге болады.
String.format("Hi %h!","world")
Нәтиже:
Сәлем 106c44!
%c Юниcode таңбасын ( таңба ) көрсету үшін пайдаланылады
String.format("Hello m%cr!",'And')
Нәтиже:
Сәлем Әлем!
%d Бүтін сан көрсетілген ( int. byte, қысқа, int, ұзын, BigInteger )
String.format("I'm already %d!",20)
Нәтиже:
Мен қазірдің өзінде 20-дамын!
%f Жылжымалы нүкте нөмірін көрсету үшін пайдаланылады
String.format("PI is - %f!", 3.14159)
Нәтиже:
PI нөмірі - 3.141590!
% e Ғылыми белгілердегі өзгермелі нүкте сандары
String.format("PI is - %e!", 3.14159);
Нәтиже:
PI нөмірі - 3.141590e+00!
%a Жылжымалы нүкте сандары он алтылық жүйеде көрсетіледі
String.format("PI is - %a!", 3.14159)
Нәтиже:
PI нөмірі - 0x1.921f9f01b866ep1!
%x Бүтін сан жіберілді ( int. byte, short, int, long, BigInteger ), пішімдеу нәтижесі ASCII кестесінде берілген саны бар таңба болады.
String.format("I'm already %x!",25)
Нәтиже:
Мен қазірдің өзінде 19-дамын!
%o Бүтін сан ( int. byte, қысқа, int, ұзын, BigInteger ) қабылданады және сегіздік сан ретінде көрсетіледі.
String.format("I already %o!",25);
Нәтиже:
Мен қазірдің өзінде 31-демін!
%t Күн мен уақытты түрлендіруге арналған префикс. Пішімдеу үшін қосымша жалаушалар қажет
String.format("Today is %tA",new Date())
Нәтиже:
Бүгін сенбі
%n Платформаға тән сызық бөлгіш. Аналогтық\n
String.format("Hello %n Hello")
Нәтиже:
Сәлем Сәлем
double үшін қолайлы пішімді қолданайық:
String str = String.format("The distance from Kyiv to Odessa is %f. Not so short, is it?", 475.4d);
System.out.println(str);
Консоль шығысы:
Киевтен Одессаға дейінгі қашықтық - 475,400000. Аз емес, солай ма?
Сіз түсінгеніңіздей, %f Java тіліндегі double және float сияқты деректер түрлерін қамтитын қалқымалы нүкте сандары үшін неғұрлым қолайлы спецификатор болар еді . Бұл спецификатордың көмегімен біз өзгермелі нүкте нөмірін пішімдей аламыз:
String str = String.format("The distance from Kyiv to Odessa is %.2f. Not so short, is it?", 475.4d);
Осы спецификаторға .2 енгізу ондық таңбалардың санын екіге дейін қысқартады және бізге нәтиже береді:
Киевтен Одессаға дейінгі қашықтық 475,40. Аз емес, солай ма?
.2 спецификаторларға арналған жалғыз түзету емес. Бұл ішкі параметрлердің комбинациясы нұсқаулық деп аталады . НұсқаулықтыңJava - 2 тіліндегі сандар шығысын пішімдеңіз жалпы нысаны келесідей:
%[argument_index][flags][width][.precision]түр спецификаторы
Енді барлығын ретімен шешіп көрейік:
  • [аргумент_индекс] — аргумент тізіміндегі орынды көрсететін бүтін сан. Мысалы, бірінші аргументке сілтеме $1, екінші аргументке сілтеме $2 және т.б. Егер орын көрсетілмесе, аргументтер пішім жолында сілтеме жасалған ретпен бірдей болуы керек.
  • [жалаушалар] пішімдеуге арналған арнайы таңбалар. Мысалы:
    • + жалауша, егер сандық мән оң болса, онда + белгісі болуы керек
    • - нәтижені солға туралауды білдіреді
    • , бүтін сандар үшін мыңдық бөлгішті орнатады
  • [ені] - шығарылатын таңбалардың ең аз санын көрсететін оң ондық бүтін сан. Егер осы санның алдында 0 болса, онда жетіспейтін таңбалар 0-мен, 0 болмаса, бос орындармен толтырылады.
  • [.accuracy] — алдында нүкте қойылған теріс емес бүтін сан. Әдетте таңбалар санын шектеу үшін қолданылады. Арнайы әрекет спецификатордың нақты түріне байланысты.
Сондай-ақ, нұсқаулардың жоғарыда аталған барлық элементтерінің міндетті емес екенін және оларсыз бәрі жұмыс істейтінін атап өткім келеді. Ішкі параметрлерді пайдаланудың мысалы ретінде бізге Pi санының белгілі бір шығысы қажет деп елестетейік:
String str = String.format("%1$+09.5f", 3.1415926535897);
System.out.print(str);
Тиісінше, консольдегі шығыс:
+03.14159
Оңай сияқты, иә? Бірақ нөмірді пішімдеуге келгенде, DecimalFormat параметрін елемеуге болмайды . Бұл нені білдіретінін анықтайық.

Ондық формат

DecimalFormat — Java тіліндегі кез келген санды пішімдеуге арналған класс, ол бүтін немесе өзгермелі нүктелі сан болсын. DecimalFormat нысаны жасалғанда , сіз тікелей конструкторда кіріс сандарды пішімдеуге арналған үлгіні көрсете аласыз. DecimalFormat пайдалану арқылы біздің мысал осылай көрінеді :
DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
Консоль шығысы:
72 224
#.### жолы - берілген мәнді 3 ондық таңбаға пішімдеп жатқанымызды көрсететін үлгі. Үлгілер үшін тағы қандай белгілер бар? Мұнда олардың кейбіреулері бар:
  • # — цифр, алдыңғы нөлдер түсірілген;
  • 0 — санда цифрлар аз болса да, цифр әрқашан көрсетіледі (бұл жағдайда 0 көрсетіледі);
  • . — ондық бөлгіш белгісі;
  • , — бөлгіш топтау белгісі (мысалы, мыңдық бөлгіш);
  • ; — пішімдерді ажыратады;
  • - — теріс санның префиксін белгілейді;
  • % - 100-ге көбейтеді және санды пайызбен көрсетеді;
  • ? — 1000-ға көбейтіледі және санды ppm түрінде көрсетеді;
  • E - ғылыми белгілеу үшін мантисса мен көрсеткішті бөледі.
Бірнеше мысалды қарастырайық:
System.out.println(new DecimalFormat( "###,###.##" ).format(74554542.224463));
Консоль шығысы:
74 554 542,22
System.out.println(new DecimalFormat( "%###.##" ).format(0.723456));
Консоль шығысы:
% 72,35
System.out.println(new DecimalFormat( "000.###" ).format(42.224463));
Консоль шығысы:
042.224
Жаңа үлгіні анықтау үшін әр уақытта жаңа DecimalFormat нысанын жасау қажет емес. Оның applyPattern және applyLocalizedPattern әдістерін пайдалану жеткілікті болады :
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
Біз өзгермелі нүктелі нөмірді пішімдеу туралы айтқанда, біз дөңгелектеуді қатты қызықтырамыз, солай емес пе? Сонымен, көрсетілген үлгіден жоғары ондық таңбалары бар санды кесу кезінде DecimalFormat соңғы кесілген сан 5-тен үлкен болса, санды жоғары дөңгелектейді. Соңғы кесілген сан 5 болса ше? Шынында да, бұл жағдайда бұл сан ең жақын бүтін сандар арасында дәл ортасында болады. Java - 3 тілінде сандар шығысын пішімдеңізБұл жағдайда алдыңғы сан есепке алынады. Алдыңғы сан жұп болса, дөңгелектеу орындалады:
DecimalFormat dF = new DecimalFormat("##.###");
String result = dF.format(56.4595);
System.out.println((result));
Консоль шығысы:
56 459
Егер тақ болса, ол орындалмайды:
DecimalFormat dF = new DecimalFormat("##.###");
String str = dF.format(56.4595);
System.out.println((str));
Консоль шығысы:
56 459
String.format() және DecimalFormat.format() көмегімен өзгермелі нүкте сандарын пішімдеудің айырмашылығы бірінші жағдайда бөлшек бөлігі болмаса да, соңынан нөлдер болады. Мысалы:
String firstStr = String.format("%.4f", 9.00001273);
System.out.println((firstStr));
Консоль шығысы:
9.0000
DecimalFormat decimalFormat = new DecimalFormat("#.####");
String secondStr = decimalFormat.format(9.00001273);
System.out.println((secondStr));
Консоль шығысы:
9
Көріп отырғаныңыздай, 9.00001273 санын төрт ондық таңба дәлдігімен пішімдеу кезінде String класының format() әдісі 9.0000 мәнін шығарады , ал DecimalFormat ұқсас format() әдісі 9 мәнін шығарады .

BigDecimal және BigInteger

Біз Java-да сандарды дөңгелектеу тақырыбын қозғағандықтан, мұндай операциялар үшін BigDecimal класын қалай пайдалану керектігі туралы сөйлесейік . Бұл сынып шын мәнінде ҮЛКЕН сандармен жұмыс істеуге бағытталған: ол үшін максималды қос және қалқымалы мәндер тым аз. Бұл сыныпта өзгермелі нүктелерді дөңгелектеуге арналған көптеген әртүрлі параметрлер, сондай-ақ арифметикалық амалдар үшін көптеген әдістер бар. Оның ұқсас класы бар, бірақ үлкен бүтін сандармен жұмыс істеуге бағытталған - BigInteger . BigDecimal және BigInteger туралы толығырақ осы мақаладан оқи аласыз .

Күн мен уақытты пішімдеу

Жоғарыда тек String класының format() көмегімен уақыт пен күнді пішімдеуге болатыны туралы ғана айтылды . Ал, оның қалай жасалғанын қарастырайық. Біріншіден, %t пішімінің спецификаторы күндер үшін пайдаланылатынын еске салғымыз келеді . Екіншіден, үлгіні пішімдеу кезінде күндерге арналған әрбір пішім спецификаторы үшін қосымша пішімдеу жалаушалары қажет. Мұнда күндер үшін мүмкін пішімдеу жалаушалары берілген:Java - 4 тіліндегі сандар шығысын пішімдеңіз
Жалаулар Сипаттама
%тБ Айдың толық атауы, мысалы, қаңтар, ақпан, т.б.
%tb Айдың қысқартылған атауы, мысалы, қаңтар, ақпан және т.б.
%tA Аптаның күнінің толық атауы, мысалы, жексенбі, дүйсенбі
%та Апта күнінің қысқартылған атауы, мысалы, Күн, Дс, т.б.
%tY 4 таңбалы пішімдегі жыл, мысалы 0000-нан 9999-ға дейін
%ty Жыл 2-таңбалы форматта, мысалы, 00-ден 99-ға дейін
%tm Ай басында нөлмен пішімделеді, мысалы, 01-ден 12-ге дейін
%tc %ta %tb %td %tT %tZ %tY пішіміндегі күн мен уақыт, мысалы, дүйсенбі 17 ақпан 03:56:12 PST 2020 ж.
%tD %tm/%td/%ty пішіміндегі күн
%td Екі таңбалы форматтағы ай күні, мысалы 01-ден 31-ге дейін
%te Айдың күні пішімінде 0 басталмай, мысалы 1-ден 31-ге дейін
%tT 24 сағаттық пішімдегі уақыт, мысалы %tH:%tM:%tS
%tH 24 сағаттық форматтағы тәулік сағаты, 00-ден 23-ке дейін
%tI 12 сағаттық пішімдегі тәулік сағаты, мысалы, 01-ден 12-ге дейін
%tM Сағаттағы minutesтар алдыңғы нөлмен пішімделген, мысалы 00-ден 59-ға дейін
%tS Екі саннан тұратын minutesтағы секундтар, мысалы, 00-ден 59-ға дейін
%tZ Уақыт белдеуі аббревиатурасы, мысалы, PST, UTC және т.б.
Бұл мүмкін болатын күнді пішімдеу жалауларының қысқартылған тізімі - кез келген талғамға арналған олардың көпшілігі бар. Олардың толық тізімі мен ықтимал спецификаторларды мына сілтемеден табуға болады . Мұны қалай пайдалану керектігін қарастырайық. Бұл жолы біз String.format() қолданбаймыз , бірақ бірден System.out.printf() пайдаланамыз .

1-мысал

Сонымен қатар, нәтиже тілін әдіске бірінші аргумент ретінде беру арқылы орнатамыз:
Date date = new Date();
System.out.printf(Locale.ENGLISH,"%tB %te, %tY",date,date,date);
Консоль шығысы:
11 қазан, 2020 жыл
Тілді көрсетпей, әдепкі тіл пайдаланылады (мысалы, менде орыс тілі бар).

2-мысал

Толық күнді көрсетейік:
Date date = new Date();
System.out.printf("%td %tB %tY of %n%tH:%tM:%tS",date,date,date,date,date,date,date);
Ал консольдегі шығыс:
11 қазан 2020 жыл 13:43:22
Бір Date нысанын аргумент ретінде бірнеше рет беру... Бұл өте жақсы емес сияқты, солай емес пе? Пайдаланғымыз келетін аргументті көрсету үшін $ ішкі жиынын қолданайық :
System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
Біздің консольдегі шығыс өзгермейді. Күндерді пішімдеудің басқа да қызықты жолдары бар. Сіз бұл материалда олар туралы және Java тіліндегі уақыт пен күн туралы көбірек оқи аласыз . Бүгінгі күн осымен бітті, назарларыңызға рахмет!Java - 5 тіліндегі сандар шығысын пішімдеңіз
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION