Non mi piace il fatto che String.Format
usi la cultura corrente . Ciò significa che l'output dipende dal sistema dell'utente. Ad esempio, se codice questo rapidamente senza pensare alle culture:
var now = DateTime.Now;
string json = String.Format("{{ 'Date': \"{0}\" }}", now);
Posso verificarlo e funziona perfettamente sul mio sistema.
{ 'Date': "9-11-2013 13:37:00" }
E dopo un po 'mi dimentico di questo piccolo frammento di codice e finisce nel mio prodotto. Poi un utente in Arabia Saudita usa il programma e tutto fallisce da quando ha prodotto:
{ 'Date': "06/01/35 01:37:00 ?" }
Per prevenire tali bug voglio String.Format
usare la cultura invariante di default, e se voglio usare una cultura specifica posso specificare esplicitamente la cultura. Ciò impedirà tutti questi bug.
In C # 6 è possibile utilizzare interpolazione stringa per eseguire la formattazione delle stringhe. Tuttavia è ancora specifico per la cultura.
string json = $"{{ 'Date': \"{now}\" }}";
Fortunatamente esiste un modo per renderlo invariante alla cultura. Importa in modo statico lo spazio dei nomi System.FormattableString
e utilizza il metodo Invariant
, in questo modo:
using static System.FormattableString;
string json = Invariant($"{{ 'Date': \"{now}\" }}");
Per C # 5 e precedenti, mi sono scritto un insieme di metodi di estensione per farlo per me. Nel processo, fornisce anche una sintassi molto più bella.
public static string FormatInvariant(this string format, params object[] args)
{
if (format == null) throw new NullReferenceException("format");
if (args == null) throw new NullReferenceException("args");
return FormatWith(format, CultureInfo.InvariantCulture, args);
}
public static string FormatCurrentCulture(this string format, params object[] args)
{
if (format == null) throw new NullReferenceException("format");
if (args == null) throw new NullReferenceException("args");
return FormatWith(format, CultureInfo.CurrentCulture, args);
}
public static string FormatWith(this string format, IFormatProvider provider, params object[] args)
{
if (format == null) throw new NullReferenceException("format");
if (provider == null) throw new NullReferenceException("provider");
if (args == null) throw new NullReferenceException("args");
return String.Format(provider, format, args);
}
(Ottieni il codice sorgente completo con commenti e Contratti di codice.)
Esempio di utilizzo:
string json = "{{ 'Date': \"{0}\" }}".FormatInvariant(now);