আইফর্ম্যাটপ্রোভিডার কী করে?


95

আমি ডেটটাইম.পার্সেক্স্যাক্ট পদ্ধতিটি নিয়ে খেলছিলাম এবং এটি আইফর্ম্যাটপ্রোভাইডার চায় ...

এটি নালকে ইনপুট দেওয়ার কাজ করে তবে এটি ঠিক কী করে?


4
ডেটটাইম.পারসিএক্স্যাক্টের (স্ট্রিং, স্ট্রিং, আইফোর্মেটপ্রোভিডার) কেন সম্ভাব্য সদৃশ ? । আমি একটি নতুনের সাথে বন্ধ করার জন্য ভোট দিচ্ছি কারণ এটি আরও ভাল শব্দযুক্ত, এবং এর আরও ভাল উত্তর রয়েছে।
নওফাল

উত্তর:


62

আয়ান বয়েডের উত্তরের অনুরোধে:

এছাড়াও CultureInfoএই ইন্টারফেস প্রয়োগ করে এবং আপনার ক্ষেত্রে ব্যবহার করা যেতে পারে। সুতরাং আপনি উদাহরণস্বরূপ কোনও ফরাসি তারিখের স্ট্রিং পার্স করতে পারেন; আপনি ব্যবহার করতে পারেন

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

4
NET ফ্রেমওয়ার্ক ৪. in-তে আপনার উদাহরণের সাথে আর কোনও ওভারলোড মনে হচ্ছে না। DateTime.ParseExact(string, string, IFormatProvider)পরিবর্তে আপনার অবশ্যই ব্যবহার করা উচিত , আমি বিশ্বাস করি - যেমন: DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
জেমস কিং

4
.NET ফ্রেমওয়ার্ক ৪.6.২ এ আপনার পয়েন্ট হিসাবে কোনও ইনপুট প্যারামিটার নেই। আমি মাত্র দুটি ব্যবহার করি এবং এটি দুর্দান্ত কাজ DateTime dt = DateTime.Parse(yourDateInputString, ci);করে আপনার উত্তরটি সংশোধন করুন।
দিমিত্রিভাইকো

4
দুঃখিত বন্ধুরা, আমার উত্তরে একটি দীর্ঘ ছাড়ের আপডেট করা হয়েছে।
আন্দ্রে রেনিয়া

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। যেমন বিভিন্ন সংস্কৃতিতে ofশ্বরের নাম

  • সৃষ্টিকর্তা
  • সৃষ্টিকর্তা
  • যাহোভা
  • ইয়াহু
  • יהוה
  • אהיה אשר אהיה

এটি আপনার কাস্টম LordsNameFormatInfoক্লাসটির অভ্যন্তরে প্রবেশ IFormatProviderকরতে দেয় এবং আপনি প্রতিমাটি সংরক্ষণ করতে পারেন।

বাস্তবে আপনাকে নিজের GetFormatপদ্ধতিটি কখনও কল করতে হবে না IFormatProvider

যখনই আপনার প্রয়োজন হবে IFormatProviderআপনি কোনও CultureInfoবস্তুটি পাস করতে পারেন :

DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

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

দ্রষ্টব্য : যে কোনও কোড পাবলিক ডোমেনে প্রকাশিত হয়। কোনও অ্যাট্রিবিউশনের প্রয়োজন নেই।


18

নাল হিসাবে পাস করা এটি 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);

4
এর CultureInfo.InvariantCultureপরিবর্তে আমাদের ব্যবহার করার কোনও কারণ আছে CultureInfo.CurrentCulture?
স্টিফেন বোহর

4
ইনভেরেন্টকালচার একটি বিশেষ সংস্কৃতি যা সর্বদা যে কোনও মেশিনে উপস্থিত থাকার গ্যারান্টিযুক্ত এবং সর্বদা রূপান্তরিত এবং একই মানগুলিতে ফিরে বিশ্লেষণ করবে। কারেন্টকালচার হ'ল বর্তমান থ্রেডের সংস্কৃতি। এটি পরিবর্তিত হতে পারে এবং যদি আপনি একই সংস্কৃতিটি স্ট্রিং এবং পার্সে রূপান্তর করতে ব্যবহার না করেন তবে আপনি ফর্ম্যাট ত্রুটি পাবেন ...
টিম

4
@ স্টেফেনবুহের পাসিং এ nullডিফল্ট হবে CultureInfo.CurrentCultureরেফারেন্স উত্সে কলটি দেখুন , আপনি যদি কলগুলির শৃঙ্খলাটি বরাবর অনুসরণ করেন, অবশেষে নালটি প্রতিস্থাপন হয়ে যায় DateTimeFormatInfo.CurrentInfoযা কোন CultureInfo.CurrentCultureফলাফলের সমান ।
স্কট চেম্বারলাইন

ইনভারিয়েন্টকালচার আমি যা খুঁজছিলাম। ধন্যবাদ
চিকোভিটজ

5

আইফর্ম্যাটপ্রোভাডার প্রশ্নযুক্ত পদ্ধতিতে সংস্কৃতি সম্পর্কিত তথ্য সরবরাহ করে। DateTimeFormatInfo কার্যকরী IFormatProvider, এবং আপনি বিন্যাস যদি আপনি চান আপনার তারিখ / সময় প্রদর্শিত হবে নির্দিষ্ট করার অনুমতি দেয়। উদাহরণ প্রাসঙ্গিক দুটিই MSDN পাতায় পাওয়া যেতে পারে।




2

এমএসডিএন দ্বারা

.NET ফ্রেমওয়ার্কে সংস্কৃতি-নির্দিষ্ট তথ্য প্রদানের জন্য নিম্নলিখিত তিনটি পূর্বনির্ধারিত আইফর্ম্যাটপ্রোভাডার বাস্তবায়ন অন্তর্ভুক্ত রয়েছে যা সংখ্যার এবং তারিখ এবং সময় মানগুলি বিন্যাস বা পার্সিংয়ে ব্যবহৃত হয়:

  1. NumberFormatInfoবর্গ, যা তথ্য একটি নির্দিষ্ট সংস্কৃতির জন্য মুদ্রার মতো বিন্যাস নম্বর,, সহস্র বিভাজক, এবং দশমিক বিভাজক চিহ্ন ব্যবহার করা হয় প্রদান করে। কোনও NumberFormatInfoঅবজেক্টের দ্বারা স্বীকৃত এবং সংখ্যাসূচক ফর্ম্যাটিং ক্রিয়াকলাপে ব্যবহৃত পূর্বনির্ধারিত ফর্ম্যাট স্ট্রিং সম্পর্কে তথ্যের জন্য , স্ট্যান্ডার্ড সংখ্যাসূচক ফর্ম্যাট স্ট্রিংস এবং কাস্টম সংখ্যাসূচক ফর্ম্যাট স্ট্রিংগুলি দেখুন।
  2. DateTimeFormatInfoবর্গ, কোন তথ্য যে এই ধরনের একটি নির্দিষ্ট সংস্কৃতি বা অর্ডার ও একটি তারিখ এর বছর, মাস, দিন উপাদান বিন্যাসের তারিখ এবং সময় বিভাজক চিহ্ন হিসাবে ফর্ম্যাট তারিখ ও সময়, এর ব্যবহার করা হয় প্রদান করে। কোনও DateTimeFormatInfoঅবজেক্টের দ্বারা স্বীকৃত এবং সংখ্যাসূচক ফর্ম্যাটিং ক্রিয়াকলাপে ব্যবহৃত পূর্বনির্ধারিত ফর্ম্যাট স্ট্রিং সম্পর্কে তথ্যের জন্য , স্ট্যান্ডার্ড তারিখ এবং সময় ফর্ম্যাট স্ট্রিংস এবং কাস্টম তারিখ এবং সময় ফর্ম্যাট স্ট্রিংগুলি দেখুন।
  3. CultureInfoবর্গ, যা একটি নির্দিষ্ট সংস্কৃতি প্রতিনিধিত্ব করে। এর GetFormatপদ্ধতিটি কোনও সংস্কৃতি-নির্দিষ্ট NumberFormatInfoবা DateTimeFormatInfoঅবজেক্টকে প্রত্যাবর্তন করে , যা CultureInfoকোনও সংখ্যা বা তারিখ এবং সময়গুলিতে জড়িত কোনও ফর্ম্যাটিং বা পার্সিং অপারেশনে ব্যবহৃত হয় কিনা তার উপর নির্ভর করে ।

.NET ফ্রেমওয়ার্ক কাস্টম বিন্যাসকে সমর্থন করে। এটি সাধারণত একটি ফর্ম্যাটিং ক্লাস তৈরির সাথে জড়িত যা আইফর্ম্যাটপ্রোভিডার এবং আইসিস্টম ফোর্ম্যাটর উভয়ই প্রয়োগ করে। এরপরে এই শ্রেণীর একটি উদাহরণ প্যারামিটার হিসাবে কোনও পদ্ধতিতে পাস করা হয় যা একটি কাস্টম বিন্যাস অপারেশন সম্পাদন করে, যেমন String.Format(IFormatProvider, String, Object[])


1

DateTimeFormatInfo বর্গ কার্যকরী এই ইন্টারফেস, তাই এটি আপনি আপনার তারিখসময় স্ট্রিং বিন্যাস নিয়ন্ত্রণ করতে দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.