JavaRush /Java блогу /Random-KY /Java тилиндеги сандарды форматтоо

Java тилиндеги сандарды форматтоо

Группада жарыяланган
Баарына салам! Көп учурда биздин ыкмалар кандайдыр бир өзгөчө форматта көрсөтүлүшү керек болгон сандар менен келет. Бул кичинекей нерседей сезилет, бирок бул тапшырманы кантип ишке ашырат элеңиз? Java тorндеги сандарды форматтоо - 1Бүгүн бул тууралуу бир аз ойлонууга чакырабыз. Биринчиден, Java'да сандарды форматтоого киришүү үчүн, String классынын формат ыкмасын эстеп көрөлү : коомдук статикалык 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 an objectтерди - саптарды киргизүү үчүн колдонулат. Бирок, мисалы, сап an objectиси катталган жерге кош коюуга аракет кылсак :
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 Логикалык түргө чыгарыла турган ар кандай тип : true - эгерде маани нөл эмес болсо, жалган - эгерде null
String.format("Hi %b!",null)
Натыйжа:
Салам жалган
% ч Сиз hashCode() ыкмасынан он алтылык маани сапына чыгарыла турган каалаган an objectти өткөрө аласыз
String.format("Hi %h!","world")
Натыйжа:
Салам 106c44!
%c Юниcode белгисин көрсөтүү үчүн колдонулат ( char )
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 tableсында берилген сан менен символ болот
String.format("I'm already %x!",25)
Натыйжа:
Мен уже 19дамын!
%o Бүтүн сан ( инт. 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 спецификаторлор үчүн бир гана Tweak эмес. Бул бөлүмчөлөрдүн айкалышы инструкция деп аталат . КөрсөтмөлөрдүнСандардын чыгышын Java - 2де форматтаңыз жалпы формасы төмөнкүдөй:
%[argument_index][flags][width][.precision]түр аныктагычы
Эми баарын ирети менен чечмелеп көрөлү:
  • [argument_index] - аргументтердин тизмесиндеги позицияны көрсөткөн бүтүн сан. Мисалы, биринчи аргументтин шилтемеси $1, экинчи аргументтин шилтемеси $2 ж.б. Эгерде позиция көрсөтүлбөсө, аргументтер формат сабында шилтеме берилген тартипте болушу керек.
  • [желектер] форматтоо үчүн атайын белгилер. Мисалы:
    • + желекчеси, эгерде сандык маани оң болсо, анда ал + белгисин камтышы керек
    • - натыйжаны солго тегиздөө дегенди билдирет
    • , бүтүн сандар үчүн миң бөлгүчтү орнотот
  • [туурасы] - чыгарыла турган белгилердин минималдуу санын көрсөткөн оң ондук бүтүн сан. Эгерде бул сандын алдында 0 болсо, анда жетишпеген символдор 0, 0 жок болсо боштуктар менен толтурулат.
  • [.accuracy] - алдында чекит коюлган терс эмес бүтүн сан. Көбүнчө символдордун санын чектөө үчүн колдонулат. Конкреттүү жүрүм-турум спецификатордун конкреттүү түрүнө жараша болот.
Ошондой эле, нускамалардын жогоруда аталган элементтеринин бардыгы милдеттүү эмес жана аларсыз бардыгы иштей тургандыгын белгилегим келет. Кошумча орнотууларды колдонуунун мисалы катары, бизге Pi санынын белгилүү бир чыгышы керек экенин элестетип көрөлү:
String str = String.format("%1$+09.5f", 3.1415926535897);
System.out.print(str);
Ошентип, консолдогу жыйынтык:
+03.14159
Оңой көрүнөт, туурабы? Ал эми санды форматтоого келгенде, DecimalFormatти этибарга албай коюуга болбойт . Келгиле, бул эмнени билдирерин карап көрөлү.

DecimalFormat

DecimalFormat - бул бүтүн же калкыма чекиттүү сан болобу, Javaдагы каалаган санды форматтоо үчүн класс. DecimalFormat an objectи түзүлгөндө , сиз түз конструктордо кирген сандарды форматтоо үчүн шаблонду көрсөтө аласыз. Биздин мисал DecimalFormat колдонууда ушундай болот :
DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
Консолдук чыгаруу:
72,224
#.### сызыгы - бул берилген маанини 3 ондук орунга форматтап жатканыбызды көрсөткөн үлгү. Үлгүлөр үчүн дагы кандай символдор бар? Бул жерде алардын кээ бирлери:
  • # — цифра, алдыңкы нөлдөр калтырылган;
  • 0 — цифра ар дайым көрсөтүлөт, ал тургай, санда азыраак цифралар болсо да (бул учурда 0 көрсөтүлөт);
  • . — ондук бөлүүчү белги;
  • , — бөлүүчү топтоо белгиси (мисалы, миңдик бөлгүч);
  • ; — форматтарды бөлөт;
  • - — терс сандын префиксин белгилейт;
  • % - 100гө көбөйтөт жана санды пайыз менен көрсөтөт;
  • ? — 1000ге көбөйөт жана санды промилледе көрсөтөт;
  • E - orмий белгилер үчүн мантисса менен көрсөткүчтү бөлөт.
Келгиле, бир нече мисалдарды карап көрөлү:
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 an objectин түзүү зарыл эмес. Анын applicationPattern жана applyLocalizedPattern ыкмаларын колдонуу жетиштүү болот :
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
Калкыма чекиттүү санды форматтоо жөнүндө сөз кылганда, биз тегеректөөгө абдан кызыкдар болобуз, туурабы? Ошентип, белгиленген үлгүдөн ашкан ондук бөлүктөрү бар санды кыркканда, DecimalFormat акыркы кыркылган сан 5тен чоң болсо, санды өйдө тегеретет. Акыркы кыркылган сан 5 болсочы? Чынында эле, бул учурда бул сан эң жакын бүтүн сандардын ортосунда так турат. Java тorндеги сандарды форматтоо - 3Бул учурда мурунку сан эске алынат. Эгерде мурунку сан жуп болсо, тегеректөө жүргүзүлөт:
DecimalFormat dF = new DecimalFormat("##.###");
String result = dF.format(56.4595);
System.out.println((result));
Консолдук чыгаруу:
56,459
Так болсо, анда ал аткарылbyte:
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тын окшош формат() ыкмасы 9ду чыгарат .

BigDecimal жана BigInteger

Биз Java тorнде сандарды тегеректөө темасын козгогондуктан, келгиле, мындай операциялар үчүн BigDecimal классын кантип колдонуу керектиги жөнүндө сүйлөшөлү . Бул класс чындап эле УЛУУ сандар менен иштөөгө багытталган: ал үчүн максималдуу кош жана калкыма маанилери өтө аз. Бул класста калкыма чекиттерди тегеректөө үчүн көптөгөн ар кандай орнотуулар, ошондой эле арифметикалык операциялар үчүн көптөгөн ыкмалар бар. Анын окшош классы бар, бирок УЛУУ бүтүн сандар менен иштөөгө багытталган - BigInteger . Бул макалада BigDecimal жана BigInteger жөнүндө көбүрөөк окуй аласыз .

Дата жана убакыт форматтоо

Жогоруда айтылгандай, String классынын format() жардамы менен сиз убакытты жана датаны форматтасаңыз болот. Келгиле, анын кантип жасалганын карап көрөлү. Биринчиден, %t формат спецификациясы даталар үчүн колдонуларын эскертебиз . Экинчиден, шаблонду форматтоодо даталардын ар бир формат спецификациясы үчүн кошумча форматтоо желектери талап кылынат. Бул жерде даталар үчүн мүмкүн болгон форматтоо желектери:Java тorндеги сандарды форматтоо - 4
Желектер Description
%тБ Айдын толук аты, мисалы, январь, февраль ж.б.
%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 Сааттагы мүнөттөр алдыңкы нөл менен форматталат, мисалы 00дөн 59га чейин
%tS Бир мүнөттөгү секундалар, эки цифрадан турат, мисалы, 00дөн 59га чейин
%tZ Убакыт алкагынын аббревиатурасы, мисалы, PST, UTC ж.б.
Бул мүмкүн болгон датаны форматтоо желектеринин кыскартылган тизмеси - ар кандай табит үчүн алардын көп саны бар. Алардын толук тизмесин жана мүмкүн болгон спецификацияларды бул шилтемеден тапса болот . Келгиле, муну кантип колдонууну карап көрөлү. Бул жолу биз String.format() колдонбойбуз , бирок дароо System.out.printf() колдонобуз .

Мисал 1

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

Мисал 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 an objectисин аргумент катары көп жолу өткөрүү... Бул анча деле жакшы эмес окшойт, туурабы? Колдонгубуз келген аргументти көрсөтүү үчүн $ ички топтомун колдонолу :
System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
Биздин консолдогу чыгарылыш өзгөрбөйт. Даталарды форматташтыруунун башка бирдей кызыктуу жолдору бар. Бул материалдан сиз алар жөнүндө жана Java тorндеги убакыт жана дата жөнүндө бир аз көбүрөөк окуй аласыз . Бүгүнкү күндө баары ушул, көңүл бурганыңыз үчүн рахмат!Сандардын чыгышын Java - 5те форматтаңыз
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION