2015-06-26 4 views
5

मैं MessageFormat कक्षा का उपयोग कर जावा में स्ट्रिंग को प्रारूपित करने का प्रयास कर रहा हूं। स्ट्रिंग में स्थितित्मक क्षेत्र होता है लेकिन यह केवल तभी काम करता है जब मैं फ़ील्ड नंबर प्रदान करता हूं। के लिए उदाहरण,स्ट्रिंग स्वरूपण में स्वचालित फ़ील्ड नंबरिंग

MessageFormat.format("{0} {1}", "Hi", "Java") काम करता है लेकिन

MessageFormat.format("{} {}", "Hi", "Java")

Exception in thread "main" java.lang.IllegalArgumentException: can't parse argument number: 
    at java.text.MessageFormat.makeFormat(MessageFormat.java:1429) 
    at java.text.MessageFormat.applyPattern(MessageFormat.java:479) 
    at java.text.MessageFormat.<init>(MessageFormat.java:362) 
    at java.text.MessageFormat.format(MessageFormat.java:840) 
    at controller.App.main(App.java:11) 
Caused by: java.lang.NumberFormatException: For input string: "" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:592) 
    at java.lang.Integer.parseInt(Integer.java:615) 
    at java.text.MessageFormat.makeFormat(MessageFormat.java:1427) 

वहाँ एक रास्ता (किसी अन्य वर्ग या पुस्तकालय) अजगर की तरह है कि यह दोनों स्वचालित और मैन्युअल क्षेत्र नंबर कुछ संभाल कर सकते हैं है देता है?

In [3]: print "{} {}".format("Hi", "Java") 
Hi Java 

In [4]: print "{0} {1}".format("Hi", "Java") 
Hi Java 
+0

आप सूचकांक प्रदान करने के लिए नहीं करना चाहते हैं, तो 'String.format' का उपयोग करने के बजाय। – Tom

+0

हां मैं ऐसा कर सकता था लेकिन एक उपयोग केस है जहां मैं इंडेक्स के साथ या बिना स्ट्रिंग प्राप्त कर सकता हूं – barunsthakur

उत्तर

1

@JohnH जवाब देने के लिए जोड़ा जा रहा है, String.Format सकता है स्ट्रिंग स्वरूपण के लिए स्वचालित और मैन्युअल फ़ील्ड इंडेक्स करें।

String.format("%s %s", "Hi", "Java") 
String.format("%1$s %2$s %1$s", "Hi", "Java") 

Reference Doc

यह "{1} {2}" से ergonomic नहीं है, लेकिन काम किया हो जाता है।

2

String.format() जैसा लगता है कि आप क्या देख रहे हैं।

String foo = String.format("%s %s", "Hi", "Java") 
StringBuffer bar = new StringBuffer(foo); 
3

आप निम्न हैक कर सकते हैं:

String.format("{} {}".replace("{}", "%s"), new String[]{"Hi", "Java"})); 

यह पहली बार बदलता है %s साथ {}, तो स्ट्रिंग सरणी आप format विधि के लिए एक तर्क के रूप प्रदान से संबंधित मान के साथ प्रत्येक %s बदलें।

ध्यान दें कि जब से format दूसरा तर्क के रूप में Object... args स्वीकार करता है, तो आप लिख सकते हैं:

String.format("{} {}".replace("{}", "%s"), "Hi", "Java"); 
+0

हां यह काम करेगा लेकिन मैं जो चाहता हूं वह नहीं। इसके अलावा यह तर्कों के स्थितिगत सूचकांक में मदद नहीं करेगा। – barunsthakur

+0

@barunsthakur आपको यह जांचना होगा कि आपको किस संस्करण का उपयोग करने की आवश्यकता है। इसके लिए एक regex आज़माएं। – Tom

0

मैं प्रवेश के लिए slf4j, जो आप तो इस तरह की स्ट्रिंग लॉग इन करने के लिए सक्षम बनाता है का उपयोग करें:

LoggerFactory.getLogger("name").debug("{} {}", "Hello", "World"); 

बस यह देखने के लिए स्रोत कोड पर एक नज़र डालें कि यह स्ट्रिंग को प्रारूपित करने के लिए क्या उपयोग किया जाता है, और यह इस वर्ग का उपयोग करता है:

org.slf4j.helpers.MessageFormatter 

यहां 3 तरीके उपलब्ध हैं।

MessageFormatter.format(String message, Object arg); 

एक 2 वस्तुओं स्थानापन्न करने:: 1 एक वस्तु प्रतिस्थापन के लिए

MessageFormatter.format(String message, Object arg1, Object arg2); 

और एक ऑब्जेक्ट की श्रृंखला से प्रतिस्थापित करने का:

MessageFormatter.arrayFormat(String message, Object[] argArray); 

इन सभी प्रकार के एक ऑब्जेक्ट FormattingTuple। वस्तु से स्वरूपित स्ट्रिंग पाने के लिए आपको फोन FormattingTuple.getMessage();

इस के साथ मैनुअल क्षेत्र नंबर का उपयोग करने के चाहिए, नीचे दी गई विधि पर एक नज़र डालें:

public String formatString(String original, Object... replacements) { 
    String stringToReturn = original; 
    for (int i = 0; i < replacements.length; i++) { 
     stringToReturn = stringToReturn.replaceAll("\\{" + i + "\\}", replacements[i].toString()); 
    } 
    return MessageFormatter.arrayFormat(stringToReturn, replacements).getMessage(); 
} 
+1

'System.out.println (MessageFormatter.format (" {1} {2} {1} "," हाय "," जावा ")। GetMessage()); 'आउटपुट' {1} {2} {1} '। – barunsthakur

+0

आपका प्रश्न इंगित करता है कि आप स्थितित्मक फ़ील्ड निर्दिष्ट किए बिना ऐसा करना चाहते हैं। 'System.out.println (MessageFormatter.format (" {} {} "," हाय "," जावा ")। GetMessage());' आउटपुट 'हाय जावा' –

+0

नहीं "यह स्वचालित और संभाल सकता है मैन्युअल फ़ील्ड नंबरिंग " – barunsthakur

1

मैं मारुन मारौन द्वारा पोस्ट किए गए पैटर्न का उपयोग करता हूं अगर मैं बरनस्थकुर जैसे मानक पुस्तकालयों तक ही सीमित था।

बेन ग्रीन्स चालाक विचार अनुक्रमित तर्कों के साथ मैन्युअल रूप से स्ट्रिंग तैयार करने के अलावा गैर अनुक्रमित तर्कों के साथ लॉग इन करते समय sfl4j का उपयोग करने वाले सभी के लिए उपयोगी है।

वहाँ मेरे लिए एक नुकसान यह था: मैं दोनों अनुक्रमित और अब गैर अनुक्रमित तर्क है, लेकिन मैं java.text.MessageFormat.format(), उदा से FormatType और FormatStyle विकल्पों का उपयोग करने में सक्षम नहीं कर रहा हूँ का उपयोग कर सकते {0, संख्या, मुद्रा}।

इसलिए मैंने बेन के समाधान का विस्तारित संस्करण बनाया, जो सभी 3 प्रकारों का उपयोग करता है।

import org.slf4j.helpers.MessageFormatter; 
import java.text.MessageFormat; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public static String format(String original, Object... replacements) 
{ 
    if (Pattern.matches(".*\\{\\d+,.+,.+\\}.*", original)) 
    { 
     return MessageFormat.format(original, replacements); 
    } 
    else 
    { 
     String r = "\\{\\d\\}"; 

     if(original.matches(".*" + r + ".*")) 
     { 
      Pattern p = Pattern.compile(r); 
      Matcher m = p.matcher(original); 
      StringBuffer b = null; 
      int i = 0; 

      while(m.find()) 
      { 
       if(b == null) b = new StringBuffer(); 
       m.appendReplacement(b, replacements[i].toString()); 
       i++; 
      } 
      m.appendTail(b); 
      return (i > 0) ? b.toString() : null; 
     } 
     else 
     { 
      return MessageFormatter.arrayFormat(original, replacements).getMessage(); 
     } 
    } 
} 

यूनिट टेस्ट:

String expected = "pink is a disgusting color"; 
String actual = StringHelpers.format("{0} is a disgusting {1}", "pink", "color"); 
assertEquals(expected, actual); 

expected = "01-02-2017 was a rather meh day"; 
actual = StringHelpers.format("{0,date,MM-dd-YYYY} was a rather {1} day", new Date(117,0,2), "meh"); 
assertEquals(expected, actual); 

expected = "One Person expects the danish inquisition"; 
actual = StringHelpers.format("{} expects the {} inquisition", "One Person", "danish"); 
assertEquals(expected, actual); 
संबंधित मुद्दे