ใช้พารามิเตอร์ใน String.format ซ้ำหรือไม่


140
String hello = "Hello";

String.format("%s %s %s %s %s %s", hello, hello, hello, hello, hello, hello);

hello hello hello hello hello hello 

ตัวแปร hello จำเป็นต้องทำซ้ำหลายครั้งในการเรียกใช้วิธีการจัดรูปแบบหรือมีเวอร์ชันชวเลขที่ให้คุณระบุอาร์กิวเมนต์หนึ่งครั้งเพื่อใช้กับ%sโทเค็นทั้งหมดหรือไม่

คำตอบ:


268

จากเอกสาร :

  • ตัวระบุรูปแบบสำหรับประเภททั่วไปอักขระและตัวเลขมีไวยากรณ์ต่อไปนี้:

        %[argument_index$][flags][width][.precision]conversion
    

    อาร์กิวเมนต์ที่เป็นทางเลือกคือจำนวนเต็มทศนิยมที่ระบุตำแหน่งของอาร์กิวเมนต์ในรายการอาร์กิวเมนต์ อาร์กิวเมนต์แรกอ้างอิงโดย"1$"ที่สองโดย"2$"ฯลฯ

String.format("%1$s %1$s %1$s %1$s %1$s %1$s", hello);

65

อีกทางเลือกหนึ่งคือการใช้การจัดทำดัชนีสัมพัทธ์ : ตัวระบุรูปแบบอ้างอิงอาร์กิวเมนต์เดียวกับตัวระบุรูปแบบสุดท้าย

ตัวอย่างเช่น:

String.format("%s %<s %<s %<s", "hello")

ผลลัพธ์ในhello hello hello hello.




4

กรณีทั่วไปอย่างหนึ่งสำหรับการใช้อาร์กิวเมนต์ซ้ำString.formatคือการใช้ตัวคั่น (เช่น";"สำหรับ CSV หรือแท็บสำหรับคอนโซล)

System.out.println(String.format("%s %2$s %s %2$s %s %n", "a", ";", "b", "c"));
// "a ; ; ; b"

นี่ไม่ใช่ผลลัพธ์ที่ต้องการ "c"ไม่ปรากฏที่ใด

คุณต้องใช้ตัวคั่นก่อน (ด้วย%s) และใช้เฉพาะดัชนีอาร์กิวเมนต์ ( %2$s) สำหรับเหตุการณ์ต่อไปนี้:

System.out.println(String.format("%s %s %s %2$s %s %n", "a", ";", "b", "c"));
//  "a ; b ; c"

มีการเพิ่มช่องว่างสำหรับการอ่านและการดีบัก เมื่อรูปแบบดูเหมือนถูกต้องคุณสามารถลบช่องว่างในโปรแกรมแก้ไขข้อความ:

System.out.println(String.format("%s%s%s%2$s%s%n", "a", ";", "b", "c"));
// "a;b;c"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.