ฉันต้องการสร้างสตริงที่มีความยาวคงที่เพื่อสร้างไฟล์ตามตำแหน่งอักขระ อักขระที่หายไปต้องเติมด้วยอักขระเว้นวรรค
ตัวอย่างเช่นช่อง CITY มีความยาวคงที่ 15 อักขระ สำหรับอินพุต "Chicago" และ "Rio de Janeiro" เอาต์พุตคือ
"ชิคาโก" “ ริโอเดจาเนโร”.
ฉันต้องการสร้างสตริงที่มีความยาวคงที่เพื่อสร้างไฟล์ตามตำแหน่งอักขระ อักขระที่หายไปต้องเติมด้วยอักขระเว้นวรรค
ตัวอย่างเช่นช่อง CITY มีความยาวคงที่ 15 อักขระ สำหรับอินพุต "Chicago" และ "Rio de Janeiro" เอาต์พุตคือ
"ชิคาโก" “ ริโอเดจาเนโร”.
คำตอบ:
ตั้งแต่ Java 1.5 เราสามารถใช้เมธอดjava.lang.String.format (String, Object ... )และใช้ printf เหมือนกับรูปแบบ
สตริงรูปแบบ"%1$15s"
ทำงาน โดยที่1$
ระบุดัชนีอาร์กิวเมนต์s
บ่งชี้ว่าอาร์กิวเมนต์เป็น String และ15
แสดงถึงความกว้างขั้นต่ำของ String รวมทั้งหมดเข้าด้วยกัน: "%1$15s"
.
สำหรับวิธีการทั่วไปเรามี:
public static String fixedLengthString(String string, int length) {
return String.format("%1$"+length+ "s", string);
}
อาจมีคนแนะนำสตริงรูปแบบอื่นเพื่อเติมช่องว่างด้วยอักขระเฉพาะ?
Maybe someone can suggest another format string to fill the empty spaces with an specific character?
- ดูคำตอบที่ฉันให้
1$
หมายถึงดัชนีการโต้แย้งและ15
ความกว้าง
ใช้String.format
ช่องว่างของช่องว่างและแทนที่ด้วยอักขระที่ต้องการ
String toPad = "Apple";
String padded = String.format("%8s", toPad).replace(' ', '0');
System.out.println(padded);
000Apple
พิมพ์
อัปเดตเวอร์ชันที่มีประสิทธิภาพมากขึ้น (เนื่องจากไม่ต้องพึ่งพาString.format
) ซึ่งไม่มีปัญหากับช่องว่าง (ขอคำแนะนำจาก Rafael Borja)
int width = 10;
char fill = '0';
String toPad = "New York";
String padded = new String(new char[width - toPad.length()]).replace('\0', fill) + toPad;
System.out.println(padded);
00New York
พิมพ์
แต่จำเป็นต้องเพิ่มการตรวจสอบเพื่อป้องกันความพยายามในการสร้างอาร์เรย์ถ่านที่มีความยาวเป็นลบ
รหัสนี้จะมีอักขระตามจำนวนที่กำหนด เต็มไปด้วยช่องว่างหรือถูกตัดทอนทางด้านขวา:
private String leftpad(String text, int length) {
return String.format("%" + length + "." + length + "s", text);
}
private String rightpad(String text, int length) {
return String.format("%-" + length + "." + length + "s", text);
}
สำหรับแผ่นด้านขวาที่คุณต้องการ String.format("%0$-15s", str)
เช่น-
เครื่องหมายจะแป้น "ขวา" และไม่มี-
เครื่องหมายจะ "ซ้าย" แผ่น
ดูตัวอย่างของฉัน:
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("================================");
for(int i=0;i<3;i++)
{
String s1=sc.nextLine();
Scanner line = new Scanner( s1);
line=line.useDelimiter(" ");
String language = line.next();
int mark = line.nextInt();;
System.out.printf("%s%03d\n",String.format("%0$-15s", language),mark);
}
System.out.println("================================");
}
}
อินพุตต้องเป็นสตริงและตัวเลข
ตัวอย่างการป้อนข้อมูล: Google 1
คุณยังสามารถเขียนวิธีง่ายๆดังต่อไปนี้
public static String padString(String str, int leng) {
for (int i = str.length(); i <= leng; i++)
str += " ";
return str;
}
import org.apache.commons.lang3.StringUtils;
String stringToPad = "10";
int maxPadLength = 10;
String paddingCharacter = " ";
StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)
ดีกว่า Guava imo ไม่เคยเห็นโปรเจ็กต์ Java ขององค์กรเดียวที่ใช้ Guava แต่ Apache String Utils เป็นเรื่องธรรมดาอย่างไม่น่าเชื่อ
ห้องสมุดฝรั่งมีStrings.padStartที่ไม่ตรงกับสิ่งที่คุณต้องการพร้อมด้วยสาธารณูปโภคที่มีประโยชน์อื่น ๆ อีกมากมาย
นี่คือเคล็ดลับที่เรียบร้อย:
// E.g pad("sss","00000000"); should deliver "00000sss".
public static String pad(String string, String pad) {
/*
* Add the pad to the left of string then take as many characters from the right
* that is the same length as the pad.
* This would normally mean starting my substring at
* pad.length() + string.length() - pad.length() but obviously the pad.length()'s
* cancel.
*
* 00000000sss
* ^ ----- Cut before this character - pos = 8 + 3 - 8 = 3
*/
return (pad + string).substring(string.length());
}
public static void main(String[] args) throws InterruptedException {
try {
System.out.println("Pad 'Hello' with ' ' produces: '"+pad("Hello"," ")+"'");
// Prints: Pad 'Hello' with ' ' produces: ' Hello'
} catch (Exception e) {
e.printStackTrace();
}
}
String.format("%15s",s) // pads right
String.format("%-15s",s) // pads left
บทสรุปที่ยอดเยี่ยมที่นี่
นี่คือรหัสพร้อมกรณีการทดสอบ;):
@Test
public void testNullStringShouldReturnStringWithSpaces() throws Exception {
String fixedString = writeAtFixedLength(null, 5);
assertEquals(fixedString, " ");
}
@Test
public void testEmptyStringReturnStringWithSpaces() throws Exception {
String fixedString = writeAtFixedLength("", 5);
assertEquals(fixedString, " ");
}
@Test
public void testShortString_ReturnSameStringPlusSpaces() throws Exception {
String fixedString = writeAtFixedLength("aa", 5);
assertEquals(fixedString, "aa ");
}
@Test
public void testLongStringShouldBeCut() throws Exception {
String fixedString = writeAtFixedLength("aaaaaaaaaa", 5);
assertEquals(fixedString, "aaaaa");
}
private String writeAtFixedLength(String pString, int lenght) {
if (pString != null && !pString.isEmpty()){
return getStringAtFixedLength(pString, lenght);
}else{
return completeWithWhiteSpaces("", lenght);
}
}
private String getStringAtFixedLength(String pString, int lenght) {
if(lenght < pString.length()){
return pString.substring(0, lenght);
}else{
return completeWithWhiteSpaces(pString, lenght - pString.length());
}
}
private String completeWithWhiteSpaces(String pString, int lenght) {
for (int i=0; i<lenght; i++)
pString += " ";
return pString;
}
ฉันชอบ TDD;)
public static String padString(String word, int length) {
String newWord = word;
for(int count = word.length(); count < length; count++) {
newWord = " " + newWord;
}
return newWord;
}
ฟังก์ชั่นง่ายๆนี้เหมาะสำหรับฉัน:
public static String leftPad(String string, int length, String pad) {
return pad.repeat(length - string.length()) + string;
}
การร้องขอ:
String s = leftPad(myString, 10, "0");