JavaRush /จาวาบล็อก /Random-TH /จัดรูปแบบผลลัพธ์ของตัวเลขใน 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บรรทัด - "Sasha"และ"ที่ทำงาน" จะถูกแทรก . สิ่งนี้จะช่วยเราในการพัฒนาได้อย่างไร? ลองนึกภาพว่าคุณมีข้อความเทมเพลตขนาดใหญ่ แต่ในบางสถานที่คุณต้องแทรกค่าที่อาจแตกต่างและมาเป็นข้อโต้แย้งจากภายนอก นี่คือจุดที่การจัดรูปแบบนี้มีประโยชน์ ตัวระบุรูปแบบเริ่มต้นด้วยเครื่องหมายเปอร์เซ็นต์ % และลงท้ายด้วยอักขระที่ระบุประเภทของอาร์กิวเมนต์ที่จะจัดรูปแบบ และอย่างที่คุณอาจเข้าใจ%sใช้เพื่อแทรกวัตถุ - สตริง แต่ถ้าเราพยายามแทรกdoubleเข้าไปในตำแหน่งที่อ็อบเจ็กต์สตริงถูกลงทะเบียน:
String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
สิ่งนี้ก็จะได้ผลเช่นกัน doubleจะถูกร่ายไปที่สตริงและเราจะได้:
สวัสดี - 55.6! สิ่งต่างๆในที่ทำงานเป็นอย่างไรบ้าง?
นอกจากสตริงและตัวเลขทศนิยมแล้ว Java ยังมีประเภทอื่นอีกใช่ไหม? มาดูคลังแสงทั้งหมดกันดีกว่า:
ประเภทของค่าที่จะจัดรูปแบบ ตัวอย่าง
%s ประเภทใดๆ ก็ตามที่จะถูกแปลงเป็นสตริง
String.format("Hi %s!","world")
ผลลัพธ์:
สวัสดีชาวโลก!
%ข ประเภทใดๆ ที่จะถูกแปลงเป็นบูลีน : true - หากค่าไม่เป็นโมฆะ, เท็จ - หากเป็นโมฆะ
String.format("Hi %b!",null)
ผลลัพธ์:
สวัสดีเท็จ
%ชม คุณสามารถส่งผ่านวัตถุใด ๆ ซึ่งจะถูกแปลงเป็นสตริงค่าเลขฐานสิบหกจาก เมธอด hashCode()
String.format("Hi %h!","world")
ผลลัพธ์:
สวัสดี 106c44!
%ค ใช้เพื่อระบุอักขระ Unicode ( char )
String.format("Hello m%cr!",'And')
ผลลัพธ์:
สวัสดีชาวโลก!
%d มีการระบุจำนวนเต็ม ( int. byte, short, int, long, BigInteger )
String.format("I'm already %d!",20)
ผลลัพธ์:
ฉันอายุ 20 แล้ว!
%ฉ ใช้เพื่อระบุจำนวนจุดลอยตัว
String.format("PI is - %f!", 3.14159)
ผลลัพธ์:
หมายเลข PI คือ - 3.141590!
%อี ตัวเลขทศนิยมในสัญกรณ์วิทยาศาสตร์
String.format("PI is - %e!", 3.14159);
ผลลัพธ์:
หมายเลข PI คือ - 3.141590e+00!
%ก ตัวเลขทศนิยมจะแสดงเป็นเลขฐานสิบหก
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, 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")
ผลลัพธ์:
สวัสดี สวัสดี
ลองใช้ รูปแบบที่เหมาะสมกว่า สำหรับ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น่าจะเป็นตัวระบุที่เหมาะสมกว่าสำหรับตัวเลขทศนิยม ซึ่งรวมถึงประเภทข้อมูลเช่น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ไม่ใช่เพียงการปรับแต่งตัวระบุเท่านั้น การรวมกันของการตั้งค่าย่อยเหล่านี้เรียกว่าคำสั่ง จัดรูปแบบผลลัพธ์ของตัวเลขใน Java - 2รูปแบบคำสั่ง ทั่วไป มีดังนี้:
%[argument_index][flags][width][.precision]ตัวระบุประเภท
ตอนนี้เรามาถอดรหัสทุกอย่างตามลำดับ:
  • [argument_index]เป็นจำนวนเต็มที่ระบุตำแหน่งในรายการอาร์กิวเมนต์ ตัวอย่างเช่น ลิงก์ไปยังอาร์กิวเมนต์แรกคือ $1 ลิงก์ไปยังอาร์กิวเมนต์ที่สองคือ $2 เป็นต้น หากไม่ได้ระบุตำแหน่ง อาร์กิวเมนต์จะต้องอยู่ในลำดับเดียวกับที่อ้างอิงในสตริงรูปแบบ
  • [ธง]เป็นอักขระพิเศษสำหรับการจัดรูปแบบ ตัวอย่างเช่น:
    • แฟล็ก +ระบุว่าหากค่าตัวเลขเป็นบวก จะต้องมีเครื่องหมาย +
    • -หมายถึง จัดผลลัพธ์ให้ชิดซ้าย
    • ตั้งค่าตัวคั่นหลักพันสำหรับจำนวนเต็ม
  • [width]เป็นจำนวนเต็มทศนิยมบวกที่ระบุจำนวนอักขระขั้นต่ำที่จะส่งออก หากมี 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 และแสดงตัวเลขเป็นเปอร์เซ็นต์
  • ? — คูณด้วย 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? อันที่จริง ในกรณีนี้ จำนวนนี้อยู่ตรงกลางระหว่างจำนวนเต็มที่ใกล้ที่สุดพอดี จัดรูปแบบผลลัพธ์ของตัวเลขใน 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 ใช้สำหรับวัน ที่ ประการที่สอง เมื่อจัดรูปแบบเทมเพลต จำเป็นต้องมีแฟล็กการจัดรูปแบบเพิ่มเติมสำหรับตัวระบุรูปแบบสำหรับวันที่แต่ละตัว ต่อไปนี้คือแฟล็กการจัดรูปแบบที่เป็นไปได้สำหรับวันที่:
ธง คำอธิบาย
%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 เป็นต้น
นี่คือรายการย่อของแฟล็กการจัดรูปแบบวันที่ที่เป็นไปได้ - มีมากมายสำหรับทุกรสนิยม สามารถดูรายการทั้งหมดและตัวระบุที่เป็นไปได้ได้ที่ลิงค์นี้ มาดูวิธีการใช้งานกัน ครั้ง นี้เราไม่ได้ใช้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 ตุลาคม 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 ได้ในเนื้อหานี้ นั่นคือทั้งหมดสำหรับวันนี้ ขอบคุณสำหรับความสนใจของคุณ!จัดรูปแบบผลลัพธ์ของตัวเลขใน Java - 5
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION