जावा में स्ट्रिंग्स को फॉर्मेट कैसे करें


185

आदिम प्रश्न, लेकिन मैं इस तरह से तार कैसे प्रारूपित करूं:

"स्टेप {1} ऑफ {2}"

जावा का उपयोग करके चर को प्रतिस्थापित करके? C # में यह आसान है।



जवाबों:


140

String.format के अतिरिक्त, एक बार भी देखें java.text.MessageFormat। आपके द्वारा प्रदान किए गए C # उदाहरण के लिए प्रारूप कम प्रचलित और थोड़ा सा करीब है और आप इसे पार्स करने के लिए भी उपयोग कर सकते हैं।

उदाहरण के लिए:

int someNumber = 42;
String someString = "foobar";
Object[] args = {new Long(someNumber), someString};
MessageFormat fmt = new MessageFormat("String is \"{1}\", number is {0}.");
System.out.println(fmt.format(args));

एक अच्छा उदाहरण जावा 1.5 में varargs और ऑटोबॉक्सिंग सुधार का लाभ उठाता है और ऊपर एक-लाइनर में बदल जाता है:

MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");

MessageFormatपसंद संशोधक के साथ i18nized plurals करने के लिए थोड़ा सा अच्छा है। संदेश को निर्दिष्ट करने के लिए जो एक चर 1 और बहुवचन के रूप में एकवचन रूप का सही ढंग से उपयोग करता है अन्यथा, आप ऐसा कुछ कर सकते हैं:

String formatString = "there were {0} {0,choice,0#objects|1#object|1<objects}";
MessageFormat fmt = new MessageFormat(formatString);
fmt.format(new Object[] { new Long(numberOfObjects) });

21
MessageFormat स्थानीयकरण उद्देश्यों के लिए है, इसलिए इसका उपयोग करते समय ध्यान रखें। उदाहरण के लिए, MessageFormat.format("Number {0}", 1234));डिफ़ॉल्ट लोकेल के आधार पर निम्न कोड Number 1,234इसके बजाय उत्पादन कर सकता है Number 1234
pavel_kazlou

@ataylor: नमस्ते, क्षमा करें, लेकिन मैं थोड़ा भ्रमित हूँ। मैं कुछ ऐसा चाहता हूं कि मैं क्लास ऑब्जेक्ट को पास करूं जिसमें डेटा है और {0} it ll take firstnameजब {1} then lastname, जैसे , तब । क्या ऐसा संभव है {0,choice,0.getFirstName()}या ऐसा कुछ है?
user3145373

@ user3145373 37 मुझे ऐसा नहीं लगता।
ataylor

ठीक है, मेरे पास एक .Net परियोजना है जैसे कि मैं चाहता हूं, codeproject.com/Articles/42310/… , इस परियोजना का संदर्भ लें मैं इस तरह देख रहा हूं। यदि आप इस तरह के किसी भी प्रोजेक्ट या पैकेज को जानते हैं तो कृपया मुझे बताएं। धन्यवाद
user3145373

233

String.format पर एक नज़र डालें । हालाँकि, यह नोट करता है कि यह सी के फंतासी फ़ंक्शंस के समान प्रारूप निर्दिष्ट करता है - उदाहरण के लिए:

String.format("Hello %s, %d", "world", 42);

"हैलो वर्ल्ड, 42" लौटाएगा। प्रारूप निर्दिष्टकर्ताओं के बारे में सीखते समय आपको यह मददगार लग सकता है । एंडी थॉमस-क्रैमर इस लिंक को नीचे एक टिप्पणी में छोड़ने के लिए पर्याप्त था , जो आधिकारिक कल्पना को इंगित करता है। सबसे अधिक इस्तेमाल किए जाने वाले हैं:

  • % s - एक स्ट्रिंग डालें
  • % d - एक हस्ताक्षरित पूर्णांक (दशमलव) डालें
  • % f - एक वास्तविक संख्या, मानक संकेतन डालें

यह मौलिक रूप से C # से अलग है, जो एक वैकल्पिक प्रारूप विनिर्देशक के साथ स्थितीय संदर्भों का उपयोग करता है। इसका मतलब है कि आप ऐसा नहीं कर सकते हैं:

String.format("The {0} is repeated again: {0}", "word");

... वास्तव में प्रिंटफ़ / प्रारूप में दिए गए पैरामीटर को दोहराए बिना। (नीचे द स्क्राम मिस्टर की टिप्पणी देखें)


यदि आप सीधे परिणाम प्रिंट करना चाहते हैं, तो आपको अपनी पसंद के अनुसार System.out.printf ( PrintStream.printf ) मिल सकता है ।


2
एक अन्य विकल्प java.text.MessageFormat है, जो {1} शैली प्रारूप प्रतीकों को स्वीकार करता है। String.format () का प्रारूप चिन्ह C के प्रिंटफ () प्रारूप प्रतीकों के समान हो सकता है - लेकिन भिन्न भी हो सकता है। पूर्ण सिंटैक्स के लिए download.oracle.com/javase/6/docs/api/java/util/… देखें ।
एंडी थॉमस

53
String.formatन्यूमेरिक पोजिशन भी ले सकते हैं: String.format("%2$s %1$s", "foo", "bar");आउटपुटbar foo
द स्क्रैम मिस्टर

7

यदि आप String.format का उपयोग नहीं करना चुनते हैं, तो दूसरा विकल्प + बाइनरी ऑपरेटर है

String str = "Step " + a + " of " + b;

इस के बराबर है

new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));

जो भी आप उपयोग करते हैं वह आपकी पसंद है। StringBuilder तेज है, लेकिन गति अंतर मामूली है। मैं +ऑपरेटर का उपयोग करना पसंद करता हूं (जो ए करता है StringBuilder.append(String.valueOf(X)))और पढ़ने में आसान लगता है।


5
यदि आप मुझे दोहराने जा रहे हैं, तो कृपया बताएं कि क्यों।
रेयान एमोस

11
1) स्ट्रिंग प्रारूपण पर एक प्रश्न के जवाब में, आप समझाते हैं कि +ऑपरेटर कैसे काम करता है। 2) आपका स्पष्टीकरण भी सटीक नहीं है। +उपयोग करने के बराबर है StringBuilder, नहीं String.concat(इस पर बहुत अधिक जानकारी।)
सोरेन लोर्बोर्ग

6

मैंने इसके लिए अपनी सरल विधि लिखी है:

public class SomeCommons {
    /** Message Format like 'Some String {0} / {1}' with arguments */
    public static String msgFormat(String s, Object... args) {
        return new MessageFormat(s).format(args);
    }
}

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

SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two");

5
public class StringFormat {

    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.next();
                int x=sc.nextInt();
                System.out.println(String.format("%-15s%03d",s1,x));
            }
            System.out.println("================================");

    }
}

आउटपोट "================================"
ved15space123 ved15space123 ved15space123 "=========== =====================

जावा समाधान

  • "-" का उपयोग बाएं इंडेंट के लिए किया जाता है

  • "15" स्ट्रिंग की न्यूनतम लंबाई बनाता है जो कि 15 तक होती है

  • "स्ट्रिंग" (जो% के बाद कुछ वर्ण है) को हमारे स्ट्रिंग द्वारा प्रतिस्थापित किया जाएगा
  • बाईं ओर 0s के साथ 0 पूर्णांक हमारे पूर्णांक
  • 3 बनाता है हमारे पूर्णांक 3 की न्यूनतम लंबाई है


1

इस समाधान ने मेरे लिए काम किया। मुझे एक REST ग्राहक के लिए गतिशील रूप से url बनाने की आवश्यकता थी इसलिए मैंने यह विधि बनाई, इसलिए आपको बस इस तरह से resturl पास करना होगा

/customer/{0}/user/{1}/order

और आप की जरूरत के रूप में कई params जोड़ें:

public String createURL (String restURL, Object ... params) {       
    return new MessageFormat(restURL).format(params);
}

आपको बस इस तरीके को कॉल करना है:

createURL("/customer/{0}/user/{1}/order", 123, 321);

उत्पादन

"/ ग्राहक / 123 / उपयोगकर्ता / 321 / आदेश"


0

मैंने यह फ़ंक्शन लिखा है यह सिर्फ सही काम करता है। $उसी नाम के चर के मान से शुरू होने वाले शब्द को इंटरपोल करें।

private static String interpol1(String x){
    Field[] ffield =  Main.class.getDeclaredFields();
    String[] test = x.split(" ") ;
    for (String v : test ) {
        for ( Field n: ffield ) {
            if(v.startsWith("$") && ( n.getName().equals(v.substring(1))  )){
                try {
                    x = x.replace("$" + v.substring(1), String.valueOf( n.get(null)));
                }catch (Exception e){
                    System.out.println("");
                }
            }
        }
    }
    return x;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.