Cosa fa IFormatProvider?
-
21-08-2019 - |
Domanda
Stavo giocando con il metodo Datetime.ParseExact e vuole un IFormatProvider...
Funziona inserendo null, ma cosa fa esattamente?
Soluzione
In aggiunta alla risposta di Ian Boyd:
Anche CultureInfo
implementa questa interfaccia e può essere utilizzato nel vostro caso. Così si potrebbe analizzare una stringa di data francese per esempio; si potrebbe usare
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
Altri suggerimenti
IL IFormatProvider
l'interfaccia è normalmente implementata per te da a CultureInfo
classe, ad esempio:
CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
L'interfaccia è un gateway per una funzione per ottenere un set di dati specifici della cultura da una cultura.I due oggetti cultura comunemente disponibili che an IFormatProvider
possono essere richiesti sono:
DateTimeFormatInfo
NumberFormatInfo
Il modo in cui funzionerebbe normalmente è chiedere a IFormatProvider
per darti un DateTimeFormatInfo
oggetto:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
C'è anche la conoscenza interna che any IFormatProvider
è probabile che l'interfaccia sia implementata da una classe che discende da CultureInfo
, o discende da DateTimeFormatInfo
, quindi puoi trasmettere direttamente l'interfaccia:
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);
Ma non farlo
Tutto quel duro lavoro è già stato scritto per te:
Prendere un DateTimeFormatInfo
da un IFormatProvider
:
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Prendere un NumberFormatInfo
da un IFormatProvider
:
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
Il valore di IFormatProvider
è che crei i tuoi oggetti culturali.Purché lo implementino IFormatProvider
, e restituire gli oggetti richiesti, è possibile ignorare le impostazioni cultura integrate.
Puoi anche usare IFormatProvider
per un modo di trasmettere oggetti culturali arbitrari - attraverso il IFormatProvider
.Per esempio.il nome di Dio nelle diverse culture
- Dio
- Dio
- Geova
- Yahweh
- יהוה
- אהיה אשר אהיה
Ciò consente la tua personalizzazione LordsNameFormatInfo
giro di classe all'interno di un IFormatProvider
, e puoi preservare l'idioma.
In realtà non avrai mai bisogno di chiamare GetFormat
metodo di IFormatProvider
te stesso.
Ogni volta che hai bisogno di un IFormatProvider
puoi passare a CultureInfo
oggetto:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Nota:Qualsiasi codice viene rilasciato nel pubblico dominio.Nessuna attribuzione richiesta.
Passando NULL come IFormatProvider
non è il modo corretto di fare questo. Se l'utente ha una data di custom / formato ora sul proprio PC avrete problemi in analisi e la conversione a stringa. Ho appena risolto un bug per cui qualcuno era passato null come IFormatProvider durante la conversione in stringa.
Invece si dovrebbe usare CultureInfo.InvariantCulture
Sbagliato:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);
corretta:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);
Si può vedere qui http://msdn.microsoft.com/ it-it / library / system.iformatprovider.aspx
vedere la sezione Osservazioni e l'esempio lì.
IFormatProvider fornisce informazioni cultura al metodo in questione. DateTimeFormatInfo implementa IFormatProvider, e ti permette di specificare il formato volete che il vostro data / ora per essere visualizzato in. gli esempi si possono trovare nelle pagine MSDN rilevanti.
Il .NET Framework include le seguenti tre implementazioni IFormatProvider predefiniti per fornire informazioni specifiche coltura che viene utilizzato nella formattazione o l'analisi numerica e valori data e ora:
- Il
NumberFormatInfo
classe, che fornisce informazioni che vengono utilizzate per formattare i numeri, come la moneta, separatore delle migliaia, e simboli separatori decimali per una particolare coltura. Per informazioni sulle stringhe di formato predefiniti riconosciuti da un oggettoDateTimeFormatInfo
e utilizzati nelle operazioni di formattazione numerico, vedere Stringhe di formato numerico standard e Stringhe di formato numerico personalizzato. - Il
CultureInfo
classe, che fornisce le informazioni che viene utilizzato per date e orari formato, come ad esempio la data e ora codici di separazione per una cultura particolare o l'ordine e il formato di componenti anno, mese e giorno di una data. Per informazioni sulle stringhe di formato predefiniti riconosciuti da un oggettoGetFormat
e utilizzati nelle operazioni di formattazione numerici, vedi formato data e ora standard stringhe e date personalizzato e stringhe Tempo formato. - Il
String.Format(IFormatProvider, String, Object[])
classe, che rappresenta una cultura particolare. Il suo metodo di <=> restituisce un <=> o <=> oggetto specifico-cultura, a seconda che l'<=> oggetto viene utilizzato in una formattazione o il funzionamento di analisi che coinvolge numeri o date e gli orari.
Il .NET Framework supporta anche la formattazione personalizzata. Questo in genere comporta la creazione di una classe di formattazione che implementa sia IFormatProvider e ICustomFormatter. Un'istanza di questa classe viene poi passato come parametro a un metodo che esegue un'operazione di formattazione personalizzata, come ad esempio <=>.
Il DateTimeFormatInfo classe implementa questa interfaccia, in modo che permette di controllare la formattazione delle corde datetime.