व्हॉट्सएप से भरे हुए निश्चित लंबाई के तार उत्पन्न करें


95

मुझे एक चरित्र स्थिति आधारित फ़ाइल बनाने के लिए निश्चित लंबाई स्ट्रिंग का उत्पादन करने की आवश्यकता है। लापता पात्रों को अंतरिक्ष चरित्र से भरना होगा।

एक उदाहरण के रूप में, फ़ील्ड CITY में 15 वर्णों की निश्चित लंबाई है। "शिकागो" और "रियो डी जेनेरियो" इनपुट के लिए आउटपुट हैं

"शिकागो"
" रियो डी जनेरियो"


यह सही उत्तर है stackoverflow.com/a/38110257/2642478
Xan

जवाबों:


122

जावा 1.5 के बाद से हम java.lang.String.format (स्ट्रिंग, ऑब्जेक्ट ...) विधि का उपयोग कर सकते हैं और प्रारूप जैसे प्रिंट का उपयोग कर सकते हैं ।

प्रारूप स्ट्रिंग "%1$15s"काम करते हैं। जहां 1$तर्क सूचकांक sइंगित करता है , इंगित करता है कि तर्क स्ट्रिंग है और स्ट्रिंग 15की न्यूनतम चौड़ाई का प्रतिनिधित्व करता है। यह सब एक साथ रखना "%1$15s":।

हमारे पास एक सामान्य विधि के लिए:

public static String fixedLengthString(String string, int length) {
    return String.format("%1$"+length+ "s", string);
}

हो सकता है कि कोई व्यक्ति किसी विशिष्ट वर्ण के साथ रिक्त स्थान को भरने के लिए एक और प्रारूप स्ट्रिंग का सुझाव दे सकता है?


2
Maybe someone can suggest another format string to fill the empty spaces with an specific character?- मेरे द्वारा दिए गए उत्तर पर एक नज़र डालें।
माइक

5
Docs.oracle.com/javase/tutorial/essential/io/formatting.html के अनुसार , 1$तर्क सूचकांक और 15चौड़ाई का प्रतिनिधित्व करता है
दिमित्री मिंकोवस्की

1
यह स्ट्रिंग को लंबाई तक सीमित नहीं करेगा। 15. यदि यह लंबा है, तो उत्पादित उत्पादन भी 15 से अधिक होगा
मिस्टर

1
@misterti a string.substring इसे 15 वर्णों तक सीमित करेगा। सबसे अच्छा संबंध है
राफेल बोर्जा

1
मुझे इसका उल्लेख करना चाहिए था, हाँ। लेकिन मेरी टिप्पणी का उद्देश्य वांछित से अधिक उत्पादन की संभावना के बारे में चेतावनी देना था, जो तय लंबाई के खेतों के लिए एक समस्या हो सकती है
मिस्टर

55

String.formatरिक्त स्थान के साथ गद्दी का उपयोग करें और उन्हें वांछित चार्ट के साथ बदलें।

String toPad = "Apple";
String padded = String.format("%8s", toPad).replace(' ', '0');
System.out.println(padded);

प्रिंट करता है 000Apple


अधिक प्रदर्शन करने वाले संस्करण को अपडेट करें (क्योंकि यह निर्भर नहीं करता है String.format), जिसमें रिक्त स्थान के लिए कोई समस्या नहीं है (संकेत के लिए राफेल बोर्जा के लिए thx)।

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

लेकिन नकारात्मक लंबाई के साथ एक चार सरणी बनाने के प्रयास को रोकने के लिए एक चेक को जोड़ने की आवश्यकता है।


अपडेटेड कोड बढ़िया काम करेगा। कि मुझे उम्मीद थी कि @thanks mike
सुधर्शन चन्द्रशेखरन

27

इस कोड में पात्रों की निश्चित मात्रा होगी; रिक्त स्थान से भरा हुआ या दाईं ओर छोटा:

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);
}

12

आप नीचे की तरह एक सरल विधि भी लिख सकते हैं

public static String padString(String str, int leng) {
        for (int i = str.length(); i <= leng; i++)
            str += " ";
        return str;
    }

8
यह निश्चित रूप से सबसे अधिक जवाब देने वाला उत्तर नहीं है। चूंकि तार जावा में अपरिवर्तनीय हैं, इसलिए आप अनिवार्य रूप से str.length + 1 के बराबर लंबाई के साथ स्मृति में एन नए तार उत्पन्न कर रहे हैं और इस तरह बेहद बेकार है। एक बेहतर समाधान केवल इनपुट स्ट्रिंग की लंबाई की परवाह किए बिना एक स्ट्रिंग का संघटन करेगा और लूप के लिए स्ट्रिंग conatenation के StringBuilder या कुछ अन्य अधिक कुशल तरीके का उपयोग करेगा।
अनोन 58192932

12

सही पैड के लिए आपको चाहिए String.format("%0$-15s", str)

यानी -हस्ताक्षर "दायाँ" पैड होगा और कोई -चिन्ह "बायाँ" पैड नहीं होगा

मेरा उदाहरण यहाँ देखें

http://pastebin.com/w6Z5QhnJ

इनपुट एक स्ट्रिंग और एक संख्या होनी चाहिए

उदाहरण इनपुट: Google 1


10
import org.apache.commons.lang3.StringUtils;

String stringToPad = "10";
int maxPadLength = 10;
String paddingCharacter = " ";

StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)

अमरूद इमो से बेहतर है। कभी भी एक एकल उद्यम जावा परियोजना नहीं देखी गई जो अमरूद का उपयोग करती है, लेकिन अपाचे स्ट्रिंग बर्तन का उपयोग अविश्वसनीय रूप से सामान्य है।



6

यहाँ एक साफ चाल है:

// 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();
  }
}

3

यहाँ परीक्षण मामलों के साथ कोड है;):

@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 पसंद है;)



1

यह कोड बहुत अच्छा काम करता है। अपेक्षित उत्पादन

  String ItemNameSpacing = new String(new char[10 - masterPojos.get(i).getName().length()]).replace('\0', ' ');
  printData +=  masterPojos.get(i).getName()+ "" + ItemNameSpacing + ":   " + masterPojos.get(i).getItemQty() +" "+ masterPojos.get(i).getItemMeasure() + "\n";

हैप्पी कोडिंग !!


0
public static String padString(String word, int length) {
    String newWord = word;
    for(int count = word.length(); count < length; count++) {
        newWord = " " + newWord;
    }
    return newWord;
}

0

यह सरल कार्य मेरे लिए काम करता है:

public static String leftPad(String string, int length, String pad) {
      return pad.repeat(length - string.length()) + string;
    }

मंगलाचरण:

String s = leftPad(myString, 10, "0");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.