String.Format - यह कैसे काम करता है और कस्टम स्वरूपण को कैसे लागू किया जाए


79

इसके साथ String.Format()उदाहरण के लिए DateTimeवस्तुओं को कई अलग-अलग तरीकों से प्रारूपित करना संभव है। हर बार जब मुझे एक वांछित प्रारूप की तलाश होती है, तो मुझे इंटरनेट पर खोज करने की आवश्यकता होती है। लगभग हमेशा मुझे एक उदाहरण मिलता है जिसका मैं उपयोग कर सकता हूं। उदाहरण के लिए:

String.Format("{0:MM/dd/yyyy}", DateTime.Now);          // "09/05/2012"

लेकिन मेरे पास कोई सुराग नहीं है कि यह कैसे काम करता है और कौन से वर्ग इन 'जादू' अतिरिक्त तार का समर्थन करते हैं।

तो मेरे सवाल हैं:

  1. स्ट्रिंग रिजल्ट के लिए String.Formatअतिरिक्त जानकारी MM/dd/yyyyको मैप कैसे करता है ?
  2. क्या सभी Microsoft ऑब्जेक्ट इस सुविधा का समर्थन करते हैं?
    क्या यह कहीं दस्तावेज है?
  3. क्या ऐसा कुछ करना संभव है:
    String.Format("{0:MyCustomFormat}", new MyOwnClass())

जवाबों:


88

String.Format{0}संबंधित वस्तु के खिलाफ स्ट्रिंग ( आदि) के अंदर प्रत्येक टोकन से मेल खाता है: http://msdn.microsoft.com/en-us/library/system.string.format.aspx

एक प्रारूप स्ट्रिंग वैकल्पिक रूप से प्रदान की जाती है:

{ index[,alignment][ : formatString] }

यदि formatStringप्रदान किया जाता है, तो संबंधित ऑब्जेक्ट को IFormattable और विशेष रूप से लागू की गई ToStringविधि को लागू करना चाहिए formatStringऔर जो संगत स्वरूपित स्ट्रिंग देता है: http://msdn.microsoft.com/en-us/library/system.iformattable.tostring.aspx

एक का IFormatProviderउपयोग भी किया जा सकता है जिसका उपयोग यहां और यहां बुनियादी स्वरूपण मानकों / चूक आदि के उदाहरणों को पकड़ने के लिए किया जा सकता है

तो आपके सवालों के जवाब क्रम में:

  1. यह ऑब्जेक्ट पर IFormattableइंटरफ़ेस की ToString()विधि का उपयोग करता है DateTimeऔर उस MM/dd/yyyyप्रारूप स्ट्रिंग को पास करता है । यह वह कार्यान्वयन है जो सही स्ट्रिंग लौटाता है।

  2. कोई भी वस्तु जो लागू होती IFormattableहै वह इस सुविधा का समर्थन करती है। तुम भी अपने खुद के लिख सकते हैं!

  3. हाँ, ऊपर देखें।


11
प्रलेखन से जोड़ने के लिए +1 । "इंटरनेट पर चारों ओर खोज" ठीक हो सकता है। लेकिन जब आपको गहरी समझ की आवश्यकता होती है, तो आपको मैनुअल पढ़ना चाहिए।
MarkJ

अच्छा जवाब है, लेकिन क्या आप मुझे बता सकते हैं कि मैं प्रत्येक वर्ग के लिए IFormattableकहां-कहां आवेदन कर सकता हूं, जहां मुझे अनुमति प्राप्त प्रारूप स्ट्रीट्स मिल सकती हैं। उदाहरण के लिए डेटटाइम सपोर्ट (मेरे सिर के ऊपर) y M d h m sऔर बहुत कुछ। Cन्यूमेरिक प्रकार मुद्रा से समर्थन करता है , लेकिन यह सब मुझे नहीं पता है कि मैं अर्कोड को खोज रहा हूँ और Microsoft दस्तावेज़ को देखकर नहीं।
hwcverwe

@hwcverwe - लगभग कोई भी Google खोज किसी भी ऑब्जेक्ट के लिए खोज के शीर्ष पर या उसके आसपास MSDN प्रलेखन डाल देगा। खोज को खोजें। कोई भी ऐसा पृष्ठ नहीं होगा जो प्रत्येक वस्तु के लिए ToString (...) दिखाता हो - उनमें संभावित रूप से "अनंत" राशि होती है, क्योंकि डिफ़ॉल्ट रूप से सभी ऑब्जेक्ट कम से कम ToString () को कार्यान्वित करते हैं, हालांकि जरूरी नहीं कि ToString (प्रारूप)।
विनो सैन


20

मेरी समझ से, आपको इसका समर्थन करने के लिए अपनी कक्षा में IFormattable को लागू करना होगा। इसके बाद विधि है, ToString जो आप String.Format में पारित मापदंडों लेता है।

यहाँ एक उदाहरण है।

// Define other methods and classes here
public class Sample : IFormattable
{
     public string ToString(string format, IFormatProvider provider)
     {
         return String.Concat("Your custom format was ", format);
     }
}

String.Format("{0:MyCustomFormat}", new Sample())

5
  1. आधिकारिक MSDN डॉक्स की जाँच करें, यहाँ डेटटाइम प्रारूप स्ट्रिंग की पूरी सूची है: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx । वास्तव में काफी कुछ "जादुई" तार हैं।

  2. जहां तक ​​मुझे पता है कि सभी प्रकारों में "दिलचस्प" प्रारूपण नहीं है, लेकिन सभी प्रकार का समर्थन है ToString()। यदि आपको निर्मित वस्तु को प्रारूपित करने की आवश्यकता है, तो आप इसे करने के लिए एक विस्तार विधि जोड़ सकते हैं, लेकिन आमतौर पर प्रारूपण किसी भी स्थान पर प्रदान किया जाता है, जहाँ इसकी आवश्यकता होती है (या इसे किसी अन्य तरीके से डालने के लिए, मैंने केवल अपने प्रकार के लिए कस्टम स्वरूपण लिखे हैं) ।

  3. हां, आप अपना स्वयं का लिख ​​सकते हैं और यदि आपके पास डेटा है जिसे विभिन्न तरीकों से स्वरूपित किया जा सकता है, तो आपको शायद IFormattable को लागू करके एक कस्टम फ़ॉर्मेटर लिखना चाहिए, फिर से डॉक्स यहां देखें: http://msdn.microsoft.com/en-us/ पुस्तकालय / प्रणाली । यह काफी सरल है, आप बस दिए गए तार की जांच करें और इन पर आधारित अपना डेटा लिखें, पर्दे के पीछे कोई जादू नहीं है :-)


4

कवर के तहत String.Format कुछ इस प्रकार है,

IFormattable formattable = objectToFormat as IFormattable;
if (formattable != null)
{
    formattable.ToString(objectToFormat);
}
else
{
    objectToFormat.ToString();
}

आपके सवालों के लिए,

  1. String.Format अतिरिक्त सूचना MM / dd / yyyy को एक स्ट्रिंग परिणाम पर कैसे मैप करता है?

    जैसा कि ऊपर बताया गया है, यह सिर्फ IFormattable .ToString (स्ट्रिंग प्रारूप, IFormatProvider प्रदाता) को कॉल करता है। प्रदाता अक्सर कुछ ऐसा होता है जो आपको बताता है कि संस्कृति आपके सिस्टम की क्या है। अक्सर अशक्त क्योंकि लोग इसे पास नहीं करते हैं। String.Format () जैसा कि आपने अपने मामले में किया था।

  2. क्या सभी Microsoft ऑब्जेक्ट इस सुविधा का समर्थन करते हैं? क्या यह कहीं दस्तावेज है?

    कुछ भी जो IFormattable को लागू करता है।

  3. क्या ऐसा कुछ करना संभव है: String.Format("{0:MyCustomFormat}, new MyOwnClass())

    अनिवार्य रूप से यदि आप चाहते हैं कि आपका अपना उद्देश्य आपके द्वारा लागू किए गए प्रारूप के साथ कुछ करे IFormattable

हालांकि यह सुनिश्चित करने के लिए कि प्रारूप के तार काफी हद तक समान हैं, बड़ी संख्या में सहायक वर्ग और एन्यूमरेटर हैं । यहाँ और


0

हां, यह संभव है - इसे पूरी तरह से अनुकूलित किया जा सकता है। दिनांक और समय कस्टम स्वरूपण पर इस दस्तावेज़ लिंक को देखें।

यदि आपके पास अपनी वस्तु है, तो यह आपके ऊपर निर्भर है कि आप ToString()जो भी उचित प्रतिनिधित्व करते हैं, वह विधि और आउटपुट को ओवरराइड करें । एक बार ऐसा करने के बाद आप इसका उपयोग कर सकते हैं String.Format("{0:MyCustomFormat}", new MyOwnClass())क्योंकि यह अंतर्निहित रूप से कॉल करता हैMyOwnClass.ToString()


-1 - ओपी DateTimeप्रारूपण से अधिक के बारे में पूछ रहा है । और सिर्फ एक लिंक एक जवाब नहीं है।
Oded

1
बहुत कठोर। दिनांक समय के पहलुओं में से एक है और मैंने आपके जवाब का विस्तार करते हुए आपको नीचे कर दिया।
मैकीज

6
उत्तर का विस्तार करें और फिर पोस्ट करें , और आप अस्वीकृत नहीं होंगे।
Oded

0

तारीखों के लिए दस्तावेज यहां देखे जा सकते हैं: http://msdn.microsoft.com/en-us/library/8kb3dddp.nx

आपको यह बताना चाहिए कि एमएम जैसे सभी फॉर्मेटिंग कैरेक्टर्स का मतलब क्या है।

यदि आप बदलना चाहते हैं कि कस्टम वर्ग के लिए स्ट्रिंग कैसे आउटपुट है, तो आप इस तरह से, ToString विधि को ओवरराइड कर सकते हैं:

public class User
{
     public string Name { get; set; }
     public int Age { get; set; }

     public override string ToString()
     {
         return this.Name + " is " + this.Age + " years old.";
     }
}

और फिर आप बस कुछ ऐसा कर सकते हैं myUser.ToString()और आपके द्वारा निर्दिष्ट आउटपुट प्राप्त कर सकते हैं।


0

और आपके तीसरे प्रश्न का उत्तर देने के लिए: यह इस वाक्यविन्यास के साथ संभव नहीं है, लेकिन आप ऐसे उदाहरण प्रदान कर सकते हैं IFormatProviderऔर ICustomFormatterआपके द्वारा बनाए गए प्रकार के लिए, या IFormattableअपने प्रकार के अंदर कार्यान्वित नहीं करते हैं (हालाँकि, यह मूल रूप से विस्तारित होता है ToString)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.