अग्रणी शून्य के साथ जावा स्ट्रिंग को कैसे प्रारूपित करें?


191

यहाँ स्ट्रिंग है, उदाहरण के लिए:

"Apple"

और मैं 8 वर्णों में भरने के लिए शून्य जोड़ना चाहूंगा:

"000Apple"

ऐसा मैं किस प्रकार करूं?

जवाबों:


287

यदि आपको पुस्तकालय की मदद के बिना यह करना है:

("00000000" + "Apple").substring("Apple".length())

(कार्य करता है, जब तक कि आपका स्ट्रिंग 8 वर्णों से अधिक लंबा नहीं है।)


21
यह बहुत चालाक है - लेकिन मुझे "इसे प्राप्त करने" में लगभग 30 सेकंड लगे। मुझे लगता है कि अधिक पठनीय समाधान बेहतर होगा।
एमी बी

2
जब आप बहुत जगह के बिना कुछ पर सॉफ्टवेयर एम्बेड कर रहे हैं और अतिरिक्त पुस्तकालयों एक विकल्प नहीं हैं, तो यह एक -सक्रिय-समाधान है। धन्यवाद!!
केसी मरे

यह संस्करण तेजी से पागल है! मुझे यह पसंद है।
१०:

2
@ माथु ईमानदारी से जिसे समझना मुश्किल नहीं है। दो तारों को सम्‍मिलित किया जाता है (एक साथ मिलाया जाता है) और पहले 5 अक्षरों को इसमें से निकाला जाता है। कोई जादू नहीं। इस मामले में बहुत समझदार नहीं है (निश्चित स्ट्रिंग एप्पल के लिए) लेकिन समझने में आसान है। ("0000" + theString).substring(theString.length())अधिक यथार्थवादी है। theStringअग्रणी शून्य के साथ यह पैड । क्षमा करें इस टिप्पणी को जोड़ने का विरोध नहीं कर सकता :)
HankCa

1
इस समाधान में एक छोटा वाक्यविन्यास है लेकिन यह "पागल तेज़" नहीं है। यदि आप भाग्यशाली हैं कि संकलक इसे ऑप्टिमाइज़ करेंगे लेकिन अनिवार्य रूप से ऐसा करने के लिए वास्तविक "तेज़" तरीका एक का उपयोग कर रहा है StringBuilder, और इसे भरने के लिए लूप लेता है। यदि आवश्यकता वास्तव में केवल 8 वर्णों के तारों को काट देने की है तो यह ठीक है, हालांकि यह एक बहुत ही संकीर्ण उपयोग-मामला है, लेकिन इस समाधान को कभी भी तेज नहीं कहा जा सकता है। यह अभी छोटा है।
डेसी

320
public class LeadingZerosExample {
    public static void main(String[] args) {
       int number = 1500;

       // String format below will add leading zeros (the %0 syntax) 
       // to the number above. 
       // The length of the formatted string will be 7 characters.

       String formatted = String.format("%07d", number);

       System.out.println("Number with leading zeros: " + formatted);
    }
}

14
लेकिन मैं इंट के बजाय एक स्ट्रिंग से पहले अग्रणी शून्य जोड़ना चाहूंगा।
रॉय

1
आप जावा 1.4 और उसके नीचे के स्ट्रींग यूटिल्स या डेसीमलफार्मेट का उपयोग कर सकते हैं। यहाँ देखें javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

3
@ वेरिएग उपयोग के %07s बजाय %07d, आपको मिलेगा FormatFlagsConversionMismatchException। आप इसे आज़मा सकते हैं।
Z fp

127
 StringUtils.leftPad(yourString, 8, '0');

यह कॉमन्स-लैंग से हैजावदोक देखें


3
कॉमन्स-लैंग का उपयोग क्यों नहीं करते? इसमें उपयोगी अतिरिक्त की लूट है।
बूझो

7
यहां तक ​​कि अगर आप कॉमन-लैंग का उपयोग करने में सक्षम नहीं हैं, तो आप अपने स्वयं के फ़ंक्शन को बनाने के लिए आसानी से StringUtils से स्रोत की प्रतिलिपि बना सकते हैं। यह चयनित उत्तर की तुलना में बेहतर सामान्य समाधान होगा। docjar.com/html/api/org/apache/commons/lang/…
कालियाचेट

3
क्या होगा यदि पुस्तकालय के लिए उपयोग की जाने वाली एकमात्र विधि होगी? शायद जोड़ा गया पुस्तकालय उस ऐप से भी कई गुना बड़ा है जिसका उपयोग किया जाता है। मैं एक आवेदन में कॉमन्स लाइब्रेरी नहीं जोड़ने के लिए कुछ कारणों की कल्पना कर सकता हूं । मुझे गलत न समझें: मैं मानता हूं, इसमें बहुत उपयोगी चीजें शामिल हैं, लेकिन मैं बाहरी जेएआर से भरा एक ऐप भरवाने के लिए अनिच्छा को समझता हूं अगर लाभ को केवल एक (या एक जोड़े) तरीकों को लिखने की आवश्यकता नहीं है।
बार्ट कीर्स

2
"क्यों नहीं कॉमन्स-लैंग का उपयोग करें?" इसका उत्तर देने के लिए, इसमें उपयोगी अतिरिक्त की लूट है। एक ठोस उदाहरण के साथ सवाल। ज़ियाओमी अपने एंड्रॉइड डिवाइस पर कॉमन्स-लैंग का पुराना संस्करण पेश करता है। आपके ऐप में एक नया संस्करण शामिल करने से क्लास लोडर संघर्ष होता है, इसलिए कॉमन्स-लैंग का उपयोग अब किसी भी एंड्रॉइड प्रोजेक्ट में नहीं किया जा सकता है।
नाची

1
@ पुरानी भले ही StringUtils.leftPad मौजूद होनी चाहिए
मार्टिनेज

29

यह वही है जो वह वास्तव में मेरे लिए पूछ रहा था:

String.format("%0"+ (8 - "Apple".length() )+"d%s",0 ,"Apple"); 

उत्पादन:

000Apple

सामान्य मामले के लिए काम नहीं करता है; यदि आप "Apple" को 8 वर्णों की स्ट्रिंग के साथ प्रतिस्थापित करते हैं (जो कि ओपी के मामले में संभव है) तो यह एक DuplicateFormatFlagsException( 00प्रारूप में स्ट्रिंग के कारण ) फेंकता है । यदि आप 8 वर्णों से अधिक लंबा स्ट्रिंग करते हैं, तो यह IllegalFormatFlagsException(नकारात्मक संख्या के कारण) फेंकता है ।
नोबोक

आप सही हैं, लेकिन इसके बाद क्या String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); :। अब आपके पास यह अपवाद नहीं है।
अभिनव पुरी

बस जोड़ना String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);गलत है, यह होना चाहिए String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9);

@ user4231709 महान समाधान! +1
user1697575

25

0 के एक स्ट्रिंग उत्पन्न करने के लिए दूसरे उत्तर में String.format विधि का उपयोग कर सकते हैं,

String.format("%0"+length+"d",0)

इसे प्रारूप 0 में अग्रणी 0 की संख्या को गतिशील रूप से समायोजित करके आपकी समस्या पर लागू किया जा सकता है:

public String leadingZeros(String s, int length) {
     if (s.length() >= length) return s;
     else return String.format("%0" + (length-s.length()) + "d%s", 0, s);
}

यह अभी भी एक गन्दा समाधान है, लेकिन इसका लाभ यह है कि आप पूर्णांक तर्क का उपयोग करके परिणामी स्ट्रिंग की कुल लंबाई निर्दिष्ट कर सकते हैं।



15

आप इसका उपयोग कर सकते हैं:

org.apache.commons.lang.StringUtils.leftPad("Apple", 8, "0")

अब तक का सबसे अच्छा जवाब। अपाचे कॉमन्स StringUtils एक सरल अभी तक अत्यंत उपयोगी पुस्तकालय है।
Zoidberg

इसने बहुत समय बचाया और यह साफ और स्वच्छ भी है।
अभिषेक

9

मैं एक समान स्थिति में रहा हूं और मैंने इसका उपयोग किया है; यह काफी संक्षिप्त है और आपको लंबाई या किसी अन्य लाइब्रेरी से निपटने की आवश्यकता नहीं है।

String str = String.format("%8s","Apple");
str = str.replace(' ','0');

सरल और साफ। स्ट्रिंग प्रारूप " Apple"शून्य के साथ अंतरिक्ष की जगह के बाद रिटर्न करता है, यह वांछित परिणाम देता है।


फिर आप पहले स्ट्रिंग को विभाजित करना चाह सकते हैं, पहले विभाजन मूल्य के ऊपर ऑपरेशन को लागू कर सकते हैं, शेष विभाजन मानों को अलग कर सकते हैं।
एर्डी Erज़गी

6
String input = "Apple";
StringBuffer buf = new StringBuffer(input);

while (buf.length() < 8) {
  buf.insert(0, '0');
}

String output = buf.toString();


1
public class PaddingLeft {
    public static void main(String[] args) {
        String input = "Apple";
        String result = "00000000" + input;
        int length = result.length();
        result = result.substring(length - 8, length);
        System.out.println(result);
    }
}

1

आपको edgecase का ध्यान रखना पड़ सकता है। यह एक सामान्य विधि है।

public class Test {
    public static void main(String[] args){
        System.out.println(padCharacter("0",8,"hello"));
    }
    public static String padCharacter(String c, int num, String str){
        for(int i=0;i<=num-str.length()+1;i++){str = c+str;}
        return str;
    }
}

1
public static void main(String[] args)
{
    String stringForTest = "Apple";
    int requiredLengthAfterPadding = 8;
    int inputStringLengh = stringForTest.length();
    int diff = requiredLengthAfterPadding - inputStringLengh;
    if (inputStringLengh < requiredLengthAfterPadding)
    {
        stringForTest = new String(new char[diff]).replace("\0", "0")+ stringForTest;
    }
    System.out.println(stringForTest);
}

1
public static String lpad(String str, int requiredLength, char padChar) {
    if (str.length() > requiredLength) {
        return str;
    } else {
        return new String(new char[requiredLength - str.length()]).replace('\0', padChar) + str;
    }
}

जब भी यह कोड स्निपेट स्वागत योग्य है, और कुछ मदद प्रदान कर सकता है, तो यह बहुत ही बेहतर होगा यदि इसमें एक स्पष्टीकरण शामिल है कि यह प्रश्न को कैसे संबोधित करता है। इसके बिना, आपके उत्तर का शैक्षिक मूल्य बहुत कम है - याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, न कि केवल पूछने वाले व्यक्ति के लिए! कृपया स्पष्टीकरण जोड़ने के लिए अपना उत्तर संपादित करें, और इस बात का संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
टोबे स्पाइट

1

जावा में:

String zeroes="00000000";
String apple="apple";

String result=zeroes.substring(apple.length(),zeroes.length())+apple;

स्काला में:

"Apple".foldLeft("00000000"){(ac,e)=>ac.tail+e}

आप जावा 8 में इसे स्ट्रीम और कम करने के तरीके का भी पता लगा सकते हैं (उसी तरह जैसे मैंने स्काला के साथ किया था)। यह सभी अन्य समाधानों के लिए थोड़ा अलग है और मुझे यह विशेष रूप से बहुत पसंद है।


0

यह तेजी से है और जो भी लंबाई के लिए काम करता है।

public static String prefixZeros(String value, int len) {
    char[] t = new char[len];
    int l = value.length();
    int k = len-l;
    for(int i=0;i<k;i++) { t[i]='0'; }
    value.getChars(0, l, t, k);
    return new String(t);
}

0

तेजी से तब हो सकता है जब क्रिस लेचर जवाब देते हैं जब स्ट्रिंग में ज्यादातर 8 चर होते हैं

int length = in.length();
return length == 8 ? in : ("00000000" + in).substring(length);

मेरे मामले में मेरी मशीन 1/8 पर तेजी से।


0

यहां एक स्ट्रिंग को प्री-पेड करने के लिए मैं सरल एपीआई-कम "पठनीय स्क्रिप्ट" संस्करण का उपयोग करता हूं। (सरल, पठनीय और एडजस्टेबल)।

while(str.length() < desired_length)
  str = '0'+str;

0

क्या किसी ने इस शुद्ध जावा समाधान (स्प्रिंगटाइल के बिना) की कोशिश की:

//decimal to hex string 1=> 01, 10=>0A,..
String.format("%1$2s", Integer.toString(1,16) ).replace(" ","0");
//reply to original question, string with leading zeros. 
//first generates a 10 char long string with leading spaces, and then spaces are
//replaced by a zero string. 
String.format("%1$10s", "mystring" ).replace(" ","0");

दुर्भाग्य से यह समाधान केवल तभी काम करता है जब आपके पास स्ट्रिंग में रिक्त स्थान न हों।


0

यदि आप प्रोग्राम को शुद्ध जावा में लिखना चाहते हैं तो आप नीचे दी गई विधि का अनुसरण कर सकते हैं या अधिक उन्नत सुविधाओं के साथ बेहतर बनाने में आपकी सहायता करने के लिए कई स्ट्रिंग यूटिल्स हैं।

एक सरल स्थिर विधि का उपयोग करके आप इसे नीचे के रूप में प्राप्त कर सकते हैं।

public static String addLeadingText(int length, String pad, String value) {
    String text = value;
    for (int x = 0; x < length - value.length(); x++) text = pad + text;
    return text;
}

आप उपरोक्त विधि का उपयोग कर सकते हैं addLeadingText(length, padding text, your text)

addLeadingText(8, "0", "Apple");

आउटपुट 000Apple होगा


-3

यह सुंदर नहीं है, लेकिन यह काम करता है। यदि आपके पास अपाचे कॉमन्स हैं, तो मेरा सुझाव है कि इसका उपयोग करें

if (val.length() < 8) {
  for (int i = 0; i < val - 8; i++) {
    val = "0" + val;
  }
}

2
-1 शायद इसलिए है क्योंकि यह इतना अच्छा उदाहरण नहीं है: आप "मैजिक नंबरों" का उपयोग कर रहे हैं और स्ट्रिंग्स को समेट रहे हैं, कुछ ऐसा जिसे स्ट्रिंगरबर्ल या स्ट्रिंगरबफर का उपयोग करके प्रतिस्थापित किया जाना चाहिए।
बार्ट कीर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.