מדריך מעשי ל- DecimalFormat

1. סקירה כללית

במאמר זה, אנו הולכים לחקור את פורמט עשרוני בכיתה יחד עם השימושים המעשיים שלה.

זו תת-מחלקה של מספר פורמט, המאפשר עיצוב מספרים עשרוניים ' חוּט ייצוג תוך שימוש בתבניות מוגדרות מראש.

ניתן להשתמש בו גם באופן הפוך, לניתוח מיתרים למספרים.

2. איך זה עובד?

על מנת לעצב מספר עלינו להגדיר תבנית שהיא רצף של תווים מיוחדים העלולים להיות מעורבים בטקסט.

ישנם 11 תווים מיוחדים, אך החשובים ביותר הם:

  • 0 - מדפיס ספרה אם מסופק, 0 אחרת
  • # - מדפיס ספרה אם היא מסופקת, שום דבר אחר
  • . - ציין היכן לשים את המפריד העשרוני
  • , - ציין היכן לשים את מפריד הקיבוץ

כאשר הדפוס מוחל על מספר, כללי העיצוב שלו מבוצעים והתוצאה מודפסת בהתאם ל DecimalFormatSymbol של ה- JVM שלנו אזור אלא אם כן ספציפי אזור מוגדר.

הפלטים של הדוגמאות הבאות הם מ- JVM הפועל באנגלית אזור.

3. עיצוב בסיסי

בואו עכשיו נראה אילו תפוקות מיוצרים בעת עיצוב אותו מספר עם הדפוסים הבאים.

3.1. עשרוניות פשוטות

כפול d = 1234567.89; assertThat (חדש DecimalFormat ("#. ##"). פורמט (ד)). isEqualTo ("1234567.89"); assertThat (חדש DecimalFormat ("0.00"). פורמט (ד)). isEqualTo ("1234567.89"); 

כפי שאנו רואים, החלק השלם לעולם אינו מושלך, לא משנה אם התבנית קטנה מהמספר.

assertThat (חדש DecimalFormat ("#########. ###"). פורמט (ד)) .isEqualTo ("1234567.89"); assertThat (חדש DecimalFormat ("000000000.000"). פורמט (ד)) .isEqualTo ("001234567.890"); 

אם התבנית במקום זאת גדולה מהמספר, אפסים מתווספים ואילו hashes יורדים, הן במספר השלם והן בחלקים העשרוניים.

3.2. עיגול

אם החלק העשרוני של התבנית אינו יכול להכיל את כל הדיוק של מספר הקלט, הוא מעוגל.

הנה, החלק של .89 מעוגל ל- .90, ואז ה- 0 הושמט:

assertThat (חדש DecimalFormat ("#. #"). פורמט (ד)) .isEqualTo ("1234567.9"); 

כאן, חלק ה- .89 מעוגל ל -1.00, ואז ה -00 הושמט וה -1 סוכם ל -7:

assertThat (חדש DecimalFormat ("#"). פורמט (ד)) .isEqualTo ("1234568"); 

מצב העיגול המוגדר כברירת מחדל הוא HALF_EVEN, אבל זה יכול להיות מותאם אישית דרך setRoundingMode שיטה.

3.3. הַקבָּצָה

מפריד הקיבוץ משמש כדי לציין תבנית משנה אשר חוזרת על עצמה באופן אוטומטי:

assertThat (חדש DecimalFormat ("#, ###. #"). פורמט (ד)) .isEqualTo ("1,234,567.9"); assertThat (חדש DecimalFormat ("#, ###"). פורמט (ד)) .isEqualTo ("1,234,568"); 

3.4. דפוסי קיבוץ מרובים

במדינות מסוימות יש מספר משתנה של דפוסי קיבוץ במערכות המספור שלהן.

מערכת המספור ההודית משתמשת בפורמט #, ##, ###. ##, בו רק מפריד הקיבוץ הראשון מחזיק שלושה מספרים, בעוד שכל האחרים מחזיקים בשני מספרים.

זה לא אפשרי להשיג באמצעות פורמט עשרוני class, השומר רק על התבנית האחרונה שנתקלה משמאל לימין, ומחיל אותה על המספר השלם, תוך התעלמות מדפוסי הקיבוץ הקודמים.

ניסיון להשתמש בתבנית #, ##, ##, ##, ### יביא להתארגנות מחדש ל- #######, ### ולסיים בחלוקה מחדש ל- #, ###, # ##, ###.

כדי להשיג התאמה מרובה של דפוסי קיבוץ, יש צורך לכתוב משלנו חוּט קוד מניפולציה, או לחלופין לנסות את Icu4J פורמט עשרוני, המאפשר זאת.

3.5. ערבוב ספרות מיתרים

אפשר לערבב חוּט מילוליות בתבנית:

assertThat (DecimalFormat חדש ("המספר #"). פורמט (d)) .isEqualTo ("המספר 1234568"); 

אפשר גם להשתמש בתווים מיוחדים כמו חוּט מילוליות, דרך בריחה:

assertThat (DecimalFormat חדש ("המספר '#' #"). פורמט (d)) .isEqualTo ("המספר # 1234568"); 

4. עיצוב מקומי

מדינות רבות אינן משתמשות בסמלים באנגלית ומשתמשות בפסיק כמפריד עשרוני ובנקודה כמפריד קיבוץ.

מריץ את התבנית #, ###. ## ב- JVM עם איטלקית אזור, למשל, יפיק 1.234.567,89.

אמנם זו עשויה להיות תכונה שימושית של i18n במקרים מסוימים, אך במקרים אחרים אולי נרצה לאכוף פורמט ספציפי, שאינו תלוי ב- JVM.

כך נוכל לעשות זאת:

assertThat (DecimalFormat חדש ("#, ###. ##", DecimalFormatSymbols חדש (Locale.ENGLISH)). פורמט (ד)) .isEqualTo ("1,234,567.89"); assertThat (DecimalFormat חדש ("#, ###. ##", DecimalFormatSymbols חדש (Locale.ITALIAN)). פורמט (ד)) .isEqualTo ("1.234.567,89"); 

אם ה אזור שאנו מעוניינים בהם אינו נמנה עם אלה המכוסים על ידי DecimalFormatSymbols אנו יכולים לציין זאת באמצעות ה- getInstance שיטה:

Locale customLocale = אזור חדש ("it", "IT"); assertThat (DecimalFormat חדש ("#, ###. ##", DecimalFormatSymbols.getInstance (customLocale)). פורמט (ד)) .isEqualTo ("1.234.567,89");

5. הודעות מדעיות

הסימון המדעי מייצג תוצר של מנטיסה ומעריך של עשרה. המספר 1234567.89 יכול להיות מיוצג גם כ- 12.3456789 * 10 ^ 5 (הנקודה מוסטת על ידי 5 עמדות).

5.1. ה-סִמוּן

אפשר לבטא מספר בסימון מדעי באמצעות ה- ה דמות תבנית המייצגת את אקספוננט העשרה:

assertThat (חדש DecimalFormat ("00. ######## E0"). פורמט (ד)) .isEqualTo ("12.3456789E5"); assertThat (חדש DecimalFormat ("000.000000E0"). פורמט (ד)) .isEqualTo ("123.456789E4"); 

עלינו לזכור שמספר התווים לאחר המעריך רלוונטי, כך שאם אנו צריכים להביע 10 ^ 12, אנו זקוקים E00 ולא E0.

5.2. סימון הנדסי

מקובל להשתמש בצורה מסוימת של סימון מדעי הנקרא Notation Notation, המתאים תוצאות כדי לבוא לידי ביטוי כמכפיל משלוש, למשל כאשר משתמשים ביחידות מדידה כמו קילו (10 ^ 3), מגה (10 ^ 6), גיגה ( 10 ^ 9), וכן הלאה.

אנו יכולים לאכוף סוג זה של סימון על ידי התאמת המספר המרבי של הספרות השלמות (התווים המובעים עם ה- # ובצד שמאל של המפריד העשרוני) כך שיהיה גבוה מהמספר המינימלי (זה המובע עם ה- 0) וגבוה מ 1.

זה מאלץ את המעריך להיות מכפיל של המספר המרבי, ולכן במקרה השימוש הזה אנו רוצים שהמספר המרבי יהיה שלושה:

assertThat (חדש DecimalFormat ("## 0. ###### E0"). פורמט (ד)). isEqualTo ("1.23456789E6"); assertThat (חדש DecimalFormat ("###. 000000E0"). פורמט (ד)). isEqualTo ("1.23456789E6"); 

6. ניתוח

בואו נראה איך אפשר לנתח א חוּט לתוך מספר בשיטת הניתוח:

assertThat (חדש DecimalFormat ("", DecimalFormatSymbols חדש (Locale.ENGLISH)) .parse ("1234567.89")) .isEqualTo (1234567.89); assertThat (חדש DecimalFormat ("", DecimalFormatSymbols חדש (Locale.ITALIAN)) .parse ("1.234.567,89")) .isEqualTo (1234567.89);

מכיוון שהערך המוחזר אינו מסיק על ידי נוכחות של מפריד עשרוני, אנו יכולים להשתמש בשיטות כמו .doubleValue (), .longValue () של המוחזר מספר התנגד לאכיפת פרימיטיבי ספציפי בתפוקה.

אנחנו יכולים גם להשיג א BigDecimal כדלהלן:

NumberFormat nf = new DecimalFormat ("", DecimalFormatSymbols new (Locale.ENGLISH)); ((DecimalFormat) nf) .setParseBigDecimal (true); assertThat (nf.parse ("1234567.89")) .isEqualTo (BigDecimal.valueOf (1234567.89)); 

7. חוט-בטיחות

פורמט עשרוני אינו בטוח בחוטיםלכן עלינו לשים לב במיוחד כאשר אנו חולקים את אותו מופע בין האשכולות.

8. מסקנה

ראינו את השימושים העיקריים של פורמט עשרוני בכיתה, יחד עם נקודות החוזק והחולשה שלה.

כמו תמיד, קוד המקור המלא זמין ב- Github.


$config[zx-auto] not found$config[zx-overlay] not found