IFormatProvider क्या करता है?


93

मैं Datetime.ParseExact विधि के साथ चारों ओर खेल रहा था, और यह एक IFormatProvider चाहता है ...

यह अशक्त इनपुट काम करता है, लेकिन यह वास्तव में क्या करता है?


3
दिनांक का संभावित डुप्लिकेट। DateTime.ParseExact (स्ट्रिंग, स्ट्रिंग, IFormatProvider) को IFormatovrovider की आवश्यकता क्यों है? । मैं एक नए के साथ मतदान कर रहा हूं क्योंकि यह बेहतर शब्द है, और इसका बेहतर जवाब है।
नवाफाल

जवाबों:


61

इयान बॉयड के उत्तर के लिए:

CultureInfoइस इंटरफ़ेस को भी लागू करता है और आपके मामले में उपयोग किया जा सकता है। तो आप उदाहरण के लिए एक फ्रांसीसी तारीख स्ट्रिंग पार्स कर सकते हैं; आप उपयोग कर सकते हैं

var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);

2
ऐसा प्रतीत नहीं होता है कि .NET फ्रेमवर्क 4.6 में अब आपके उदाहरण से मेल खाता है। आपको DateTime.ParseExact(string, string, IFormatProvider)इसके बजाय उपयोग करना चाहिए , मेरा मानना ​​है कि - जैसे: DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
जेम्स किंग

1
.NET फ्रेमवर्क 4.6.2 में आप बिंदु के रूप में कोई इनपुट पैरामीटर नहीं है। मैं केवल दो का उपयोग करता हूं और यह ठीक काम करता है DateTime dt = DateTime.Parse(yourDateInputString, ci);कृपया अपने उत्तर को संशोधित करें।
डेवलपर

1
क्षमा करें दोस्तों, मेरे उत्तर के लिए एक लंबे समय तक अद्यतन किया गया है।
आंद्रेई रोनेया

49

IFormatProviderइंटरफ़ेस सामान्य रूप से एक से आप के लिए लागू किया गया है CultureInfoवर्ग, जैसे:

  • CultureInfo.CurrentCulture
  • CultureInfo.CurrentUICulture
  • CultureInfo.InvariantCulture
  • CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)

इंटरफ़ेस एक संस्कृति से संस्कृति-विशिष्ट डेटा का एक सेट प्राप्त करने के लिए एक फ़ंक्शन के लिए एक प्रवेश द्वार है। दो आमतौर पर उपलब्ध संस्कृति की वस्तुओं को जिनके बारे में IFormatProviderसमझा जा सकता है:

जिस तरह से यह आम तौर पर काम करेगा IFormatProviderआप एक DateTimeFormatInfoवस्तु देने के लिए कहेंगे :

DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
   DoStuffWithDatesOrTimes(format);

ज्ञान के अंदर यह भी है कि किसी भी IFormatProviderइंटरफ़ेस को संभवतः उस वर्ग द्वारा कार्यान्वित किया जा रहा है जो नीचे से आता है CultureInfo, या इससे नीचे उतरता है DateTimeFormatInfo, इसलिए आप सीधे इंटरफ़ेस डाल सकते हैं:

CultureInfo info = provider as CultureInfo;
if (info != null)
   format = info.DateTimeInfo;
else
{
   DateTimeFormatInfo dtfi = provider as DateTimeFormatInfo;
   if (dtfi != null)
       format = dtfi;
   else
       format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
}

if (format != null)
   DoStuffWithDatesOrTimes(format);

लेकिन ऐसा मत करो

वह सारी मेहनत आपके लिए पहले ही लिखी जा चुकी है:

एक DateTimeFormatInfoसे प्राप्त करने के लिएIFormatProvider :

DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);

एक NumberFormatInfoसे प्राप्त करने के लिएIFormatProvider :

NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);

इसका मूल्य IFormatProviderयह है कि आप अपनी संस्कृति की वस्तुएं बनाते हैं। जब तक वे लागू होते हैं IFormatProvider, और उन वस्तुओं को वापस करते हैं जिन्हें वे मांगते हैं, आप अंतर्निहित संस्कृतियों को बायपास कर सकते हैं।

आप IFormatProviderमनमानी संस्कृति वस्तुओं को पारित करने के तरीके के लिए भी उपयोग कर सकते हैं - के माध्यम से IFormatProvider। जैसे विभिन्न संस्कृतियों में भगवान का नाम

  • परमेश्वर
  • परमेश्वर
  • Jehova
  • Yahwe
  • יהוה
  • אהיה אהר אהיה

यह आपके कस्टम LordsNameFormatInfoवर्ग को एक के अंदर सवारी करने देता है IFormatProvider, और आप मुहावरे को संरक्षित कर सकते हैं।

वास्तव में आपको खुद को कभी भी कॉल GetFormatकरने की आवश्यकता नहीं होगी IFormatProvider

जब भी आपको आवश्यकता हो IFormatProviderआप एक CultureInfoवस्तु पास कर सकते हैं :

DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));

नोट : कोई भी कोड सार्वजनिक डोमेन में जारी किया जाता है। कोई एट्रिब्यूशन की आवश्यकता नहीं है।


18

अशक्त गुजरना IFormatProviderऐसा करने का सही तरीका नहीं है। यदि उपयोगकर्ता के पास अपने पीसी पर एक कस्टम दिनांक / समय प्रारूप है, तो आपको पार्स करने और स्ट्रिंग में परिवर्तित करने में समस्याएँ होंगी। मैंने अभी एक बग तय किया है जहां किसी ने स्ट्रिंग में परिवर्तित होने पर IFormatProvider के रूप में शून्य पारित किया था।

इसके बजाय आपको उपयोग करना चाहिए CultureInfo.InvariantCulture

गलत:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);

सही बात:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);

2
क्या कोई ऐसा कारण है जिसके CultureInfo.InvariantCultureबदले हमें उपयोग करना चाहिए CultureInfo.CurrentCulture?
स्टीफन बोहेर

5
InvariantCulture एक विशेष संस्कृति है जो किसी भी मशीन पर हमेशा मौजूद रहने की गारंटी है और हमेशा उसी मानों में परिवर्तित और पार्स होगी। करंट कल्चर वर्तमान धागे की संस्कृति है। यह अलग-अलग हो सकता है और यदि आप स्ट्रिंग और पार्स में बदलने के लिए एक ही संस्कृति का उपयोग नहीं करते हैं, तो आपको प्रारूप त्रुटियां मिलेंगी ...
टिम

5
@StephenBooher nullडिफ़ॉल्ट रूप से पास हो जाएगा CultureInfo.CurrentCulture। कॉल को संदर्भ स्रोत में देखें , यदि आप कॉल की श्रृंखला का अनुसरण करते हैं, तो अंत में नल को बदल दिया जाता DateTimeFormatInfo.CurrentInfoहै, जो CultureInfo.CurrentCultureआउटपुट के बराबर है ।
स्कॉट चैंबरलेन

InvariantCulture वही है जिसकी मुझे तलाश थी। धन्यवाद
Chicowitz

5

IFormatProvider संस्कृति की जानकारी प्रश्न में विधि को प्रदान करता है। DateTimeFormatInfo IFormatProvider को लागू करता है, और आपको वह प्रारूप निर्दिष्ट करने की अनुमति देता है जिसे आप अपनी तिथि / समय दिखाना चाहते हैं। उदाहरण MSDN पृष्ठों पर देखे जा सकते हैं।




2

MSDN द्वारा

.NET फ्रेमवर्क में संस्कृति-विशिष्ट जानकारी प्रदान करने के लिए निम्नलिखित तीन पूर्वनिर्धारित IFormatProvider कार्यान्वयन शामिल हैं जो संख्यात्मक और दिनांक और समय मानों को स्वरूपित करने या पार्स करने में उपयोग किए जाते हैं:

  1. वह NumberFormatInfoवर्ग, जो जानकारी प्रदान करता है, जिसका उपयोग किसी विशेष संस्कृति के लिए मुद्रा, हजारों विभाजक और दशमलव विभाजक जैसे संख्याओं को प्रारूपित करने के लिए किया जाता है। किसी NumberFormatInfoऑब्जेक्ट द्वारा पहचाने गए पूर्वनिर्धारित स्वरूप स्ट्रिंग के बारे में जानकारी के लिए और संख्यात्मक स्वरूपण कार्यों में उपयोग किया जाता है, मानक संख्यात्मक प्रारूप स्ट्रिंग और कस्टम संख्यात्मक प्रारूप स्ट्रिंग देखें।
  2. वह DateTimeFormatInfoवर्ग, जो जानकारी प्रदान करता है, जिसका उपयोग दिनांक और समय को प्रारूपित करने के लिए किया जाता है, जैसे किसी विशेष संस्कृति के लिए दिनांक और समय विभाजक प्रतीक या किसी तिथि के वर्ष, महीने और दिन के घटकों के क्रम और स्वरूप। किसी DateTimeFormatInfoऑब्जेक्ट द्वारा पहचाने गए पूर्वनिर्धारित प्रारूप स्ट्रिंग के बारे में जानकारी के लिए और संख्यात्मक स्वरूपण कार्यों में उपयोग किया जाता है, मानक दिनांक और समय प्रारूप स्ट्रिंग और कस्टम दिनांक और समय प्रारूप स्ट्रिंग देखें।
  3. CultureInfoवर्ग है, जो एक विशेष संस्कृति का प्रतिनिधित्व करता है। इसका GetFormatतरीका एक संस्कृति-विशिष्ट NumberFormatInfoया DateTimeFormatInfoऑब्जेक्ट देता है, जो इस बात पर निर्भर करता है कि CultureInfoऑब्जेक्ट का उपयोग फॉर्मेटिंग या पार्सिंग ऑपरेशन में किया जाता है जिसमें नंबर या दिनांक और समय शामिल होते हैं।

.NET फ्रेमवर्क भी कस्टम स्वरूपण का समर्थन करता है। इसमें आमतौर पर एक प्रारूपण वर्ग का निर्माण शामिल होता है जो IFormatProvider और ICustomFormatter दोनों को लागू करता है। इस वर्ग का एक उदाहरण फिर एक पैरामीटर के रूप में पारित किया जाता है जो एक कस्टम स्वरूपण ऑपरेशन करता है, जैसे कि String.Format(IFormatProvider, String, Object[])


1

DateTimeFormatInfo वर्ग लागू इस इंटरफेस, तो यह आप अपने दिनांक समय तार के स्वरूपण नियंत्रित करने के लिए अनुमति देता है।

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