สวัสดีทุกคน! บ่อยครั้งที่วิธีการของเรามาพร้อมกับตัวเลขที่ต้องแสดงในรูปแบบพิเศษบางอย่าง ดูเหมือนเป็นเรื่องเล็กน้อย แต่คุณจะปฏิบัติภารกิจนี้อย่างไร?
เราขอเชิญคุณคิดเกี่ยวกับเรื่องนี้สักหน่อยในวันนี้ ก่อนอื่น เพื่อที่จะเจาะลึกเรื่องการจัดรูปแบบตัวเลขใน Java เรามาจำ วิธี การจัดรูปแบบ ของ คลาสString กันดีกว่า : public static String format(String format, Object... args) - ส่งคืนสตริงที่จัดรูปแบบจากสตริงรูปแบบ โดยใช้อาร์กิวเมนต์ argsที่เหลือ และเป็นเพียงตัวอย่าง:
ลองใช้ รูปแบบที่เหมาะสมกว่า สำหรับdouble :
รูปแบบคำสั่ง ทั่วไป มีดังนี้:
ในกรณีนี้จะพิจารณาหมายเลขก่อนหน้าด้วย หากตัวเลขก่อนหน้าเป็นเลขคู่ การปัดเศษจะเสร็จสิ้น:
เอาล่ะ มาดูกันว่าทำอย่างไร อันดับแรก เราขอเตือนคุณว่า ตัวระบุรูปแบบ %t ใช้สำหรับวัน ที่ ประการที่สอง เมื่อจัดรูปแบบเทมเพลต จำเป็นต้องมีแฟล็กการจัดรูปแบบเพิ่มเติมสำหรับตัวระบุรูปแบบสำหรับวันที่แต่ละตัว ต่อไปนี้คือแฟล็กการจัดรูปแบบที่เป็นไปได้สำหรับวันที่:
นี่คือรายการย่อของแฟล็กการจัดรูปแบบวันที่ที่เป็นไปได้ - มีมากมายสำหรับทุกรสนิยม สามารถดูรายการทั้งหมดและตัวระบุที่เป็นไปได้ได้ที่ลิงค์นี้ มาดูวิธีการใช้งานกัน ครั้ง นี้เราไม่ได้ใช้String.format()แต่ใช้ทันทีSystem.out.printf()
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บรรทัด - "Sasha"และ"ที่ทำงาน" จะถูกแทรก . สิ่งนี้จะช่วยเราในการพัฒนาได้อย่างไร? ลองนึกภาพว่าคุณมีข้อความเทมเพลตขนาดใหญ่ แต่ในบางสถานที่คุณต้องแทรกค่าที่อาจแตกต่างและมาเป็นข้อโต้แย้งจากภายนอก นี่คือจุดที่การจัดรูปแบบนี้มีประโยชน์ ตัวระบุรูปแบบเริ่มต้นด้วยเครื่องหมายเปอร์เซ็นต์ % และลงท้ายด้วยอักขระที่ระบุประเภทของอาร์กิวเมนต์ที่จะจัดรูปแบบ และอย่างที่คุณอาจเข้าใจ%sใช้เพื่อแทรกวัตถุ - สตริง แต่ถ้าเราพยายามแทรกdoubleเข้าไปในตำแหน่งที่อ็อบเจ็กต์สตริงถูกลงทะเบียน:
String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
สิ่งนี้ก็จะได้ผลเช่นกัน doubleจะถูกร่ายไปที่สตริงและเราจะได้:
สวัสดี - 55.6! สิ่งต่างๆในที่ทำงานเป็นอย่างไรบ้าง?
นอกจากสตริงและตัวเลขทศนิยมแล้ว Java ยังมีประเภทอื่นอีกใช่ไหม? มาดูคลังแสงทั้งหมดกันดีกว่า:
ประเภทของค่าที่จะจัดรูปแบบ | ตัวอย่าง | |
---|---|---|
%s | ประเภทใดๆ ก็ตามที่จะถูกแปลงเป็นสตริง |
ผลลัพธ์:
สวัสดีชาวโลก!
|
%ข | ประเภทใดๆ ที่จะถูกแปลงเป็นบูลีน : true - หากค่าไม่เป็นโมฆะ, เท็จ - หากเป็นโมฆะ |
ผลลัพธ์:
สวัสดีเท็จ
|
%ชม | คุณสามารถส่งผ่านวัตถุใด ๆ ซึ่งจะถูกแปลงเป็นสตริงค่าเลขฐานสิบหกจาก เมธอด hashCode() |
ผลลัพธ์:
สวัสดี 106c44!
|
%ค | ใช้เพื่อระบุอักขระ Unicode ( char ) |
ผลลัพธ์:
สวัสดีชาวโลก!
|
%d | มีการระบุจำนวนเต็ม ( int. byte, short, int, long, BigInteger ) |
ผลลัพธ์:
ฉันอายุ 20 แล้ว!
|
%ฉ | ใช้เพื่อระบุจำนวนจุดลอยตัว |
ผลลัพธ์:
หมายเลข PI คือ - 3.141590!
|
%อี | ตัวเลขทศนิยมในสัญกรณ์วิทยาศาสตร์ |
ผลลัพธ์:
หมายเลข PI คือ - 3.141590e+00!
|
%ก | ตัวเลขทศนิยมจะแสดงเป็นเลขฐานสิบหก |
ผลลัพธ์:
หมายเลข PI คือ - 0x1.921f9f01b866ep1!
|
%x | จำนวนเต็มถูกส่งผ่าน ( int. byte, short, int, long, BigInteger ) ผลลัพธ์การจัดรูปแบบจะเป็นอักขระที่มีหมายเลขที่กำหนดในตาราง ASCII |
ผลลัพธ์:
ฉันอายุ 19 แล้ว!
|
%o | ยอมรับ จำนวนเต็ม ( int. byte, short, int, long, BigInteger ) และจะแสดงเป็นเลขฐานแปด |
ผลลัพธ์:
ฉันอายุ 31 แล้ว!
|
%t | คำนำหน้าสำหรับการแปลงวันที่และเวลา จำเป็นต้องมีแฟล็กเพิ่มเติมเพื่อการจัดรูปแบบ |
ผลลัพธ์:
วันนี้คือวันเสาร์
|
%n | ตัวแยกบรรทัดเฉพาะแพลตฟอร์ม อนาล็อก\n |
ผลลัพธ์:
สวัสดี สวัสดี
|
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น่าจะเป็นตัวระบุที่เหมาะสมกว่าสำหรับตัวเลขทศนิยม ซึ่งรวมถึงประเภทข้อมูลเช่นdoubleและfloatใน Java ด้วยตัวระบุนี้ เราสามารถจัดรูปแบบตัวเลขทศนิยมได้:
String str = String.format("The distance from Kyiv to Odessa is %.2f. Not so short, is it?", 475.4d);
การแทรก.2ลงในตัวระบุนี้จะตัดจำนวนตำแหน่งทศนิยมให้เหลือสองตำแหน่ง ทำให้ได้ผลลัพธ์ดังนี้
ระยะทางจากเคียฟไปโอเดสซาคือ 475.40 ไม่น้อยเลยใช่ไหม?
.2ไม่ใช่เพียงการปรับแต่งตัวระบุเท่านั้น การรวมกันของการตั้งค่าย่อยเหล่านี้เรียกว่าคำสั่ง 
%[argument_index][flags][width][.precision]ตัวระบุประเภท
ตอนนี้เรามาถอดรหัสทุกอย่างตามลำดับ:
- [argument_index]เป็นจำนวนเต็มที่ระบุตำแหน่งในรายการอาร์กิวเมนต์ ตัวอย่างเช่น ลิงก์ไปยังอาร์กิวเมนต์แรกคือ $1 ลิงก์ไปยังอาร์กิวเมนต์ที่สองคือ $2 เป็นต้น หากไม่ได้ระบุตำแหน่ง อาร์กิวเมนต์จะต้องอยู่ในลำดับเดียวกับที่อ้างอิงในสตริงรูปแบบ
- [ธง]เป็นอักขระพิเศษสำหรับการจัดรูปแบบ ตัวอย่างเช่น:
- แฟล็ก +ระบุว่าหากค่าตัวเลขเป็นบวก จะต้องมีเครื่องหมาย +
- -หมายถึง จัดผลลัพธ์ให้ชิดซ้าย
- ตั้งค่าตัวคั่นหลักพันสำหรับจำนวนเต็ม
- [width]เป็นจำนวนเต็มทศนิยมบวกที่ระบุจำนวนอักขระขั้นต่ำที่จะส่งออก หากมี 0 นำหน้าตัวเลขนี้ อักขระที่หายไปจะถูกเติมด้วย 0 หากไม่มี 0 ให้เว้นวรรค
- [.accuracy]เป็นจำนวนเต็มที่ไม่เป็นลบซึ่งนำหน้าด้วยจุด โดยทั่วไปใช้เพื่อจำกัดจำนวนอักขระ ลักษณะการทำงานเฉพาะขึ้นอยู่กับประเภทของตัวระบุเฉพาะ
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 และแสดงตัวเลขเป็นเปอร์เซ็นต์
- ? — คูณด้วย 1,000 และแสดงตัวเลขเป็น 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? อันที่จริง ในกรณีนี้ จำนวนนี้อยู่ตรงกลางระหว่างจำนวนเต็มที่ใกล้ที่สุดพอดี 
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ช่วยให้คุณสามารถจัดรูปแบบเวลาและวันที่ได้
ธง | คำอธิบาย |
---|---|
%tB | ชื่อเต็มของเดือน เช่น มกราคม กุมภาพันธ์ เป็นต้น |
%TB | ชื่อย่อของเดือน เช่น ม.ค. ก.พ. เป็นต้น |
%ทีเอ | ชื่อเต็มของวันในสัปดาห์ เช่น วันอาทิตย์ วันจันทร์ |
%ตา | ชื่อย่อของวันในสัปดาห์ เช่น อาทิตย์ จันทร์ เป็นต้น |
%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 |
%เต | วันของเดือนในรูปแบบที่ไม่มี 0 นำหน้า เช่น 1 ถึง 31 |
%tT | เวลาในรูปแบบ 24 ชั่วโมง เช่น %tH:%tM:%tS |
%ไทย | ชั่วโมงของวันในรูปแบบ 24 ชั่วโมง ตั้งแต่ 00 ถึง 23 |
%Ti | ชั่วโมงของวันในรูปแบบ 12 ชั่วโมง เช่น 01 ถึง 12 |
%tM | นาทีในชั่วโมงจะมีรูปแบบเป็นศูนย์นำหน้า เช่น 00 ถึง 59 |
%tS | วินาทีในหนึ่งนาที ประกอบด้วยตัวเลขสองหลัก เช่น จาก 00 ถึง 59 |
%tZ | ตัวย่อเขตเวลา เช่น PST, UTC เป็นต้น |
ตัวอย่างที่ 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 ตุลาคม 2563 13:43:22 น
การส่งต่อวัตถุ Date เดียวกันเป็นอาร์กิวเมนต์หลายครั้ง... มันดูไม่ดีนักใช่ไหม? ลองใช้$ เซตย่อยภายใน เพื่อระบุอาร์กิวเมนต์ที่เราต้องการใช้:
System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
ผลลัพธ์ในคอนโซลของเราจะไม่เปลี่ยนแปลง มีวิธีอื่นที่น่าสนใจไม่แพ้กันในการจัดรูปแบบวันที่ คุณสามารถอ่านเกี่ยวกับพวกเขาและข้อมูลเพิ่มเติมเกี่ยวกับเวลาและวันที่ใน Java ได้ในเนื้อหานี้ นั่นคือทั้งหมดสำหรับวันนี้ ขอบคุณสำหรับความสนใจของคุณ!
GO TO FULL VERSION