IFormatProvider ne yapar?


Yanıtlar:


62

Ian Boyd'un cevabına ek olarak:

Ayrıca CultureInfobu arayüzü uygular ve sizin durumunuzda kullanılabilir. Örneğin, bir Fransız tarih dizesini ayrıştırabilirsiniz; kullanabilirsin

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

2
NET Framework 4.6'da artık örneğinize uyan bir aşırı yük yok gibi görünüyor. Sen kullanmalıdır DateTime.ParseExact(string, string, IFormatProvider)yerine, inanıyorum - örneğin: DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
James Kral

1
.NET Framework 4.6.2'de işaret ettiğinizde hiçbir girdi parametresi yoktur. Sadece iki tane kullanıyorum ve iyi çalışıyor DateTime dt = DateTime.Parse(yourDateInputString, ci);Lütfen cevabınızı revize edin.
DmitryBoyko

1
Üzgünüm çocuklar, cevabım için gecikmiş bir güncelleme yapıldı.
Andrei Rînea

49

IFormatProviderArayüzü normal bir tarafından sizin için uygulanan CultureInfosınıf, örneğin:

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

Arabirim, bir işlevin bir kültürden kültüre özgü bir dizi veri alması için bir ağ geçididir. IFormatProviderSorgulanabilecek yaygın olarak bulunan iki kültür nesnesi şunlardır:

Normalde çalışma şekli, IFormatProvidersize bir DateTimeFormatInfonesne vermenizi istemenizdir :

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

Ayrıca, herhangi bir IFormatProviderarayüzün büyük olasılıkla inen CultureInfoveya alçalan bir sınıf tarafından uygulandığına dair içeriden bilgi vardır DateTimeFormatInfo, böylece arayüzü doğrudan çevirebilirsiniz:

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);

Ama bunu yapma

Tüm bu sıkı çalışmalar sizin için çoktan yazıldı:

Bir'den bir almak DateTimeFormatInfoiçinIFormatProvider :

DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);

Bir'den bir almak NumberFormatInfoiçinIFormatProvider :

NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);

Değeri, IFormatProviderkendi kültür nesnelerinizi yaratmanızdır. Onlar uyguladıkları IFormatProviderve istenen nesneleri geri verdikleri sürece, yerleşik kültürleri atlayabilirsiniz.

Ayrıca IFormatProvider, rastgele kültür nesnelerini iletmenin bir yolu olarak da kullanabilirsiniz - IFormatProvider. Örneğin, farklı kültürlerdeki tanrının adı

  • Tanrı
  • Tanrı
  • Jehova
  • Yahwe
  • יהוה
  • אהיה אשר אהיה

Bu, özel LordsNameFormatInfosınıfınızın bir içinde IFormatProvidersürmesini sağlar ve deyimi koruyabilirsiniz.

Gerçekte asla kendi GetFormatyönteminizi aramanıza gerek kalmayacak IFormatProvider.

Ne zaman ihtiyacınız IFormatProviderolursa bir CultureInfonesneyi iletebilirsiniz :

DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

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

Not : Herhangi bir kod kamu malı olarak yayınlanır. Herhangi bir atıf gerekmez.


18

IFormatProviderBunu yapmanın doğru yolu olmadığından null geçmek . Kullanıcının bilgisayarında özel bir tarih / saat biçimi varsa, ayrıştırma ve dizeye dönüştürme konusunda sorunlar yaşarsınız. Birisinin dizeye dönüştürürken IFormatProvider olarak null geçtiği bir hatayı düzelttim.

Bunun yerine kullanmalısın CultureInfo.InvariantCulture

Yanlış:

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

Doğru:

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

2
CultureInfo.InvariantCultureBunun yerine kullanmamız gereken herhangi bir sebep var mı CultureInfo.CurrentCulture?
Stephen Booher

5
InvariantCulture, herhangi bir makinede her zaman var olması garanti edilen ve her zaman aynı değerleri dönüştürüp yeniden ayrıştıran özel bir kültürdür. CurrentCulture, geçerli iş parçacığının kültürüdür. Bu değişebilir ve dizeye dönüştürmek ve ayrıştırmak için aynı kültürü kullanmazsanız, biçim hataları alırsınız ...
Tim

5
@StephenBooher geçişi nullvarsayılan olarak olacaktır CultureInfo.CurrentCulture. Referans kaynağındaki çağrıya bakın , eğer çağrı zincirini takip ederseniz, null sonunda DateTimeFormatInfo.CurrentInfohangi CultureInfo.CurrentCultureçıktılara eşdeğer olan ile değiştirilir .
Scott Chamberlain

InvariantCulture, aradığım şeydi. Teşekkürler
Chicowitz

5

IFormatProvider , söz konusu yönteme kültür bilgisi sağlar. DateTimeFormatInfo , IFormatProvider'ı uygular ve tarih / saatinizin görüntülenmesini istediğiniz formatı belirlemenize olanak tanır. Örnekler ilgili MSDN sayfalarında bulunabilir.




2

by MSDN

.NET Framework, sayısal ve tarih ve saat değerlerini biçimlendirmede veya ayrıştırmada kullanılan kültüre özgü bilgileri sağlamak için aşağıdaki önceden tanımlanmış üç IFormatProvider uygulamasını içerir :

  1. NumberFormatInfoBelirli bir kültür için, para birimi gibi biçim numaraları, binlerce ayırıcı ve ondalık ayırıcı semboller için kullanılan bilgiler sağlar sınıfı. Bir NumberFormatInfonesne tarafından tanınan ve sayısal biçimlendirme işlemlerinde kullanılan önceden tanımlanmış biçim dizeleri hakkında bilgi için bkz. Standart Sayısal Biçim Dizeleri ve Özel Sayısal Biçim Dizeleri.
  2. DateTimeFormatInfoÖrneğin belirli bir kültür veya bir buluşmamız yıl, ay ve gün bileşenlerinin düzeni ve biçimi için tarih ve saat ayırıcı sembolleri olarak biçim tarihleri ve saatleri, için kullanılan bilgiler sağlar sınıfı. Bir DateTimeFormatInfonesne tarafından tanınan ve sayısal biçimlendirme işlemlerinde kullanılan önceden tanımlanmış biçim dizeleri hakkında bilgi için bkz. Standart Tarih ve Saat Biçimi Dizeleri ve Özel Tarih ve Saat Biçimi Dizeleri.
  3. CultureInfoBelirli bir kültürü temsil sınıfı. Onun GetFormatyöntemi bir kültür-özgü döndüren NumberFormatInfoveya DateTimeFormatInfoolmamasına bağlı olarak, nesneyi CultureInfonesne numaraları veya tarih ve saatleri içeren bir biçimlendirme veya ayrıştırma işleminde kullanılır.

.NET Framework ayrıca özel biçimlendirmeyi de destekler. Bu genellikle hem IFormatProvider hem de ICustomFormatter uygulayan bir formatlama sınıfının oluşturulmasını içerir. Daha sonra bu sınıfın bir örneği String.Format(IFormatProvider, String, Object[]),.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.