2012-05-09 12 views
76

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

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

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

तो मेरी प्रश्न हैं:

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

आप इस http://www.codeproject.com/Articles/6533/Custom-String-Formatting-in-NET – V4Vendetta

उत्तर

79

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 का उपयोग भी किया जा सकता है जिसका उपयोग बुनियादी स्वरूपण मानकों/डिफ़ॉल्ट आदि को कैप्चर करने के लिए किया जा सकता है उदाहरण उदाहरण here और here

तो क्रम में अपने प्रश्नों के उत्तर:

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

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

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

+9

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

+0

अच्छा जवाब है लेकिन क्या आप मुझे बता सकते हैं कि मैं प्रत्येक कक्षा के लिए कहां मिल सकता हूं जो 'IFormattable' लागू करता है, जहां मुझे अनुमत प्रारूप SRtrs मिल सकता है। उदाहरण के लिए डेटटाइम (मेरे सिर के शीर्ष पर) का समर्थन करता है 'वाई एम डी एच एम एस' और अधिक। न्यूमेरिक प्रकार मुद्रा से 'सी' का समर्थन करते हैं, लेकिन माइक्रोसॉफ्ट दस्तावेज को देखकर मैं खोज के आसपास से नहीं जानता हूं। – hwcverwe

+0

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

0

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

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

+0

-1 पर देख सकते हैं - ओपी 'डेटटाइम' स्वरूपण से अधिक के बारे में पूछ रहा है। और सिर्फ एक लिंक एक जवाब नहीं है। – Oded

+1

बहुत कठोर। डेटटाइम पहलुओं में से एक है और जब आप नीचे आते हैं तो मैं अपना जवाब बढ़ा रहा था। –

+6

उत्तर _then post_ का विस्तार करें, और आप डाउनवॉट नहीं होंगे। – Oded

16

मेरी समझ से, आपको इसका समर्थन करने के लिए अपनी कक्षा में 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()) 
0

दिनांकों प्रलेखन यहां पाया जा सकता: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

है कि आप को बताना चाहिए एम.एम. तरह तिथि स्वरूपण के सभी वर्ण वास्तव में क्या मतलब है।

आप को बदलने का तरीका एक स्ट्रिंग एक कस्टम वर्ग के लिए उत्पादन होता है चाहते हैं, आप 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() की तरह कुछ कर सकते हैं और आउटपुट आपको मिल निर्दिष्ट।

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

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

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

0

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

3

स्ट्रिंग कवर के तहत।स्वरूप कुछ इस प्रकार है,

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

अपने प्रश्नों के लिए,

  1. कैसे एक स्ट्रिंग परिणाम के लिए अतिरिक्त जानकारी एम एम/dd/yyyy नक्शा String.Format करता है?

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

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

    IFormattable लागू करने वाली कुछ भी करता है। String.Format("{0:MyCustomFormat}, new MyOwnClass())

    अनिवार्य रूप से यदि आप अपने स्वयं वस्तु आप IFormattable लागू प्रदान की प्रारूप के साथ कुछ करना चाहता हूँ:

  3. यह संभव इस तरह कुछ करने के लिए है।

वहाँ सुनिश्चित करने के लिए वर्गों और प्रगणक समर्थन की एक बड़ी संख्या है, हालांकि उस प्रारूप तार काफी हद तक मिलते-जुलते हैं। More here

संबंधित मुद्दे