JavaRush /בלוג Java /Random-HE /עיצוב פלט של מספרים ב-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(); . אז נוכל להחליף את הקוד הקודם ב:
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");
זה גם יעבוד. כפול יוטל על מיתר ונקבל:
שלום - 55.6! איך הולך בעבודה?
מלבד מחרוזות ומספרי נקודה צפה, ישנם סוגים נוספים בג'אווה, נכון? אז בואו נסתכל על כל הארסנל:
סוג הערך לעיצוב דוגמא
%s כל סוג שיוצק למחרוזת
String.format("Hi %s!","world")
תוֹצָאָה:
שלום עולם!
%b כל סוג שיועבר לבוליאנית : true - אם הערך אינו null, false - אם null
String.format("Hi %b!",null)
תוֹצָאָה:
שלום שקר
%h אתה יכול להעביר כל אובייקט, שיוזר למחרוזת ערך הקסדצימלי משיטת hashCode()
String.format("Hi %h!","world")
תוֹצָאָה:
שלום 106c44!
%c משמש לציון תו Unicode ( char )
String.format("Hello m%cr!",'And')
תוֹצָאָה:
שלום עולם!
%d צוין מספר שלם ( int. byte, short, int, long, 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!
מספרי נקודה צפה יוצגו בהקסדצימליים
String.format("PI is - %a!", 3.14159)
תוֹצָאָה:
מספר ה-PI הוא - 0x1.921f9f01b866ep1!
%איקס מועבר מספר שלם ( int. byte, short, int, long, BigInteger ), תוצאת העיצוב תהיה התו עם המספר הנתון בטבלת ASCII
String.format("I'm already %x!",25)
תוֹצָאָה:
אני כבר בן 19!
%o מספר שלם ( int. byte, short, int, long, BigInteger ) מתקבל והוא יוצג כמספר אוקטלי
String.format("I already %o!",25);
תוֹצָאָה:
אני כבר בן 31!
%t קידומת להמרות תאריך ושעה. נדרשים דגלים נוספים לעיצוב
String.format("Today is %tA",new Date())
תוֹצָאָה:
היום יום שבת
%n מפריד קווים ספציפי לפלטפורמה. אנלוגי\n
String.format("Hello %n Hello")
תוֹצָאָה:
היי היי
בואו נשתמש בפורמט מתאים יותר עבור כפול :
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. עם מפרט זה נוכל לעצב מספר נקודה צפה:
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]מפרט סוג
עכשיו בואו נפענח הכל לפי הסדר:
  • [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 , באפשרותך לציין תבנית לעיצוב מספרים נכנסים ישירות בבנאי. כך תיראה הדוגמה שלנו באמצעות DecimalFormat :
DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
פלט מסוף:
72,224
השורה #.### היא תבנית המציינת שאנו מעצבים את הערך המועבר ל-3 מקומות עשרוניים. אילו סמלים נוספים זמינים עבור דפוסים? הנה כמה מהם:
  • # - ספרה, אפסים מובילים מושמטים;
  • 0 - הספרה מוצגת תמיד, גם אם למספר יש פחות ספרות (במקרה זה, 0 מוצג);
  • . - סימן מפריד עשרוני;
  • , - סימן קיבוץ מפריד (לדוגמה, מפריד אלפים);
  • ; - מפריד בין פורמטים;
  • - - מסמן את הקידומת של מספר שלילי;
  • % - מכפיל ב-100 ומציג את המספר באחוזים;
  • ? - מכפיל ב-1000 ומציג את המספר בעמודים לדקה;
  • 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 בדיוק של ארבעה מקומות עשרוניים, שיטת format() של המחלקה String תוציא את הערך 9.0000 , בעוד ששיטת ה-format() הדומה של DecimalFormat תוציא 9 .

BigDecimal ו-BigInteger

מאז נגענו בנושא של עיגול מספרים ב-Java, בואו נדבר על איך להשתמש במחלקה BigDecimal עבור פעולות כאלה . שיעור זה מתמקד בעבודה עם מספרים גדולים באמת: עבורו, ערכי הכפול והצף המרביים קטנים מדי. למחלקה זו יש הגדרות רבות ושונות לעיגול נקודה צפה, כמו גם שיטות רבות לפעולות אריתמטיות. יש לו מחלקה דומה, אך התמקדה בעבודה עם מספרים שלמים גדולים - BigInteger . אתה יכול לקרוא עוד על BigDecimal ו- BigInteger במאמר זה .

עיצוב תאריך ושעה

רק הוזכר לעיל שבאמצעות format() של המחלקה String אתה יכול גם לעצב זמן ותאריך. עצב את הפלט של מספרים ב-Java - 4ובכן, בואו נסתכל איך זה נעשה. ראשית, ברצוננו להזכיר לך שמפרט הפורמט %t משמש עבור תאריכים . שנית, בעת עיצוב תבנית, נדרשים דגלי עיצוב נוספים עבור כל מפרט פורמט לתאריכים. להלן דגלי העיצוב האפשריים לתאריכים:
דגלים תיאור
%שַׁחֶפֶת שם מלא של החודש, למשל, ינואר, פברואר וכו'.
%שַׁחֶפֶת שם החודש המקוצר, למשל, ינואר, פברואר וכו'.
%tA השם המלא של היום בשבוע, למשל, ראשון, שני
%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

בנוסף, נגדיר את שפת התוצאה על ידי העברתה כארגומנט הראשון לשיטה:
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
להעביר את אותו אובייקט דייט כטיעון כל כך הרבה פעמים... זה לא נראה טוב במיוחד, נכון? בואו נשתמש בתת -הקבוצה הפנימית $ כדי לציין את הארגומנט שבו נרצה להשתמש:
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