เหตุใดรูปแบบ 33333.## จึงดูแปลกเมื่อเราใช้เมธอด DecimalFormat .format()

เมื่อวานฉันพยายามสำรวจด้วยตัวเองถึงพฤติกรรมของวิธี DecimalFormat .format() กับตัวยึดตำแหน่งทั้งหมดและสิ่งที่พวกเขาทำ
ดังนั้นฉันจึงเขียนตัวเลขสองตัวและลองใช้รูปแบบที่แตกต่างกัน ด้วย "#.##" เลขศูนย์ที่ไม่มีนัยสำคัญทั้งหมดถูกตัดออก และด้วย "0000.00" วิธีการจะเพิ่มเลขศูนย์นำหน้าตัวเลข ไม่เป็นไร แต่แล้วฉันก็ลองใช้รูปแบบแปลกๆ เพื่อดูว่าจะเกิดอะไรขึ้น
ด้วยรูปแบบ "33333.##" ผลลัพธ์สุดท้ายจึงแปลกมาก คุณสามารถเห็นรหัสของฉันด้านล่าง:

DecimalFormat df = new DecimalFormat("33332.##");
double a= 222.46705219;
double b=-102.000;

System.out.println(df.format(a));
System.out.println(df.format(b));

และผลลัพธ์ของมันคือ:

 33332222,47
-33332102,0   

อินพุตเหมือนกับตัวเลขแต่ใช้รูปแบบ "33033.##" ให้ผลลัพธ์:

33222,4732
33102

ฉันเข้าใจว่าโปรแกรมเพิ่มตัวเลขที่จัดรูปแบบไว้ที่ตำแหน่ง 0 แต่ทำไมเมื่อศูนย์ไม่แสดงเป็นตัวยึดตำแหน่ง วิธีการยังคงปัดเศษตัวเลขตัวแรกและ (ชัดเจน) ตัวเลขที่สอง
ทำไมตัวเลขแรกของฉันจึงถูกปัดเศษเป็นตัวเลขที่สอง หลักตามที่ควรจะเป็น แต่ตัวเลขตัวที่สอง (b) ถูกพิมพ์โดยมีเลขศูนย์ต่อท้าย?
และทำไมเมื่อตัวยึดตำแหน่ง 0 แสดงอยู่ตรงกลางของ "33033.##" โปรแกรมจึงแทรกตัวเลขที่จัดรูปแบบแล้ว a แทนที่ แต่ไม่พิมพ์ "33" ต่อท้ายหมายเลข b?
ฉันไม่รู้จะอธิบายพฤติกรรมนี้อย่างไร


person Savina Dimitrova    schedule 30.09.2017    source แหล่งที่มา


คำตอบ (1)


เอกสารประกอบเน้นไวยากรณ์ที่ชัดเจนสำหรับ รูปแบบที่คุณควรจะตั้ง รูปแบบของคุณทั้งสองขัดต่อไวยากรณ์ที่กำหนด ดังนั้นการค้นพบของคุณจึงไม่ควรถูกมองว่าเชื่อถือได้ และอาจมีการเปลี่ยนแปลงในเวอร์ชันต่อๆ ไป พูดตามตรง ฉันรู้สึกประหลาดใจที่ตัวสร้างไม่มีข้อยกเว้นกับรูปแบบเหล่านี้

33332.##: 33332 จะถูกมองว่าเป็นคำนำหน้า และส่วนที่เหลือ .## นั้นไม่ถูกต้อง เนื่องจากต้องใช้ 0 หรือ # ก่อนจุดทศนิยม

33033.##: 33 ถูกมองว่าเป็นคำนำหน้า ออกจาก 033.## เนื่องจาก 0, . และ # ไม่สามารถเป็นส่วนหนึ่งของคำนำหน้าหรือส่วนต่อท้ายใดๆ ได้ และ 3 สามารถเป็นส่วนหนึ่งของคำนำหน้าหรือส่วนต่อท้ายเท่านั้น รูปแบบนี้จึงไม่ถูกต้อง

person Joe C    schedule 30.09.2017
comment
ใช่ ฉันรู้ว่ามันไม่ถูกต้อง แต่นั่นไม่ได้อธิบายว่าทำไมทุกรูปแบบจึงปฏิบัติกับตัวเลข a ในวิธีที่แตกต่างจากตัวเลข b ดูตัวอย่าง - เหตุใดรูปแบบ 33332.## จึงพิมพ์รูปแบบที่จัดรูปแบบเป็นตัวเลขตัวที่สองหลังตัวคั่นทศนิยม แต่ b ถูกจัดรูปแบบเป็นตัวเลขตัวแรก - person Savina Dimitrova; 30.09.2017
comment
สิ่งที่ฉันพยายามจะพูดก็คือ เนื่องจากมันไม่ถูกต้อง ผลลัพธ์จึงคาดเดาไม่ได้ อาจมีสาเหตุหลายประการ และไม่มีเหตุผลที่จะเชื่อได้ว่าจะไม่เปลี่ยนแปลงโดยไม่มีการเตือนล่วงหน้า - person Joe C; 30.09.2017