2014-04-17 19 views
16

Sto scrivendo una stringa personalizzata nel validatore decimale che deve utilizzare Decimal.TryParse che ignora la cultura (cioè non interessa se l'input contiene "." O "," come punto decimale separatore). Questo è il metodo suggerito:Culture invariant Decimal.TryParse()

public static bool TryParse(
    string s, 
    NumberStyles style, 
    IFormatProvider provider, 
    out decimal result 
) 

io non riesco a capire cosa usare come il terzo parametro. Gli esempi che ho visto assomigliano a questo:

culture = CultureInfo.CreateSpecificCulture("en-GB"); 
Decimal.TryParse(value, style, culture, out number) 

in modo da creare una cultura specifica. CultureInfo non ha un metodo "CreateInvariantCulture" e CultureInfo.InvariantCulture non è del tipo richiesto. Qual è l'uso corretto?

risposta

28

Avere provare in questo modo:

decimal value; 
bool b = Decimal.TryParse("0.1", NumberStyles.Any, new CultureInfo("en-US"), out value); 

Il modo migliore sarebbe probabilmente quella di utilizzare il metodo Decimal.Parse() come si farebbe con qualsiasi tradizionalmente valori di stringa decimali.

È possibile utilizzare NumberStyles.Currency per specificare che i valori vanno letti come valuta, che si prenderà cura di tutti i valori di valuta legati (è necessario aggiungere un riferimento a System.Globalalization utilizzare questo:

using System.Globalization; 

Decimal.Parse accetta anche un terzo parametro, che vi permetterà di impostare in modo esplicito la IFormatProvider se lo si vuole e si desidera una cultura specifica:

decimal value = Decimal.Parse(currency, NumberStyles.Currency, CultureInfo.InvariantCulture); //yields 15.55 
1

infatti CultureInfo.InvariantCulture può essere utilizzato qui. Il parametro expe cts IFormatProvider, un'interfaccia che implementa gli strumenti CultureInfo. Ma InvariantCulture è invariante, nel senso che non varia con le impostazioni dell'utente.

Infatti, non esiste alcuna cultura che accetta né ,. come separatore decimale: sono tutti uno o l'altro. Dovrai trovare un altro modo per gestire i dati che possono utilizzare uno di questi separatori decimali.

1

Non riesco a capire cosa usare come terzo parametro.

Perché tutte le culture NumberDecimalSeparator o NumberGroupSeparator ecc. Non sono uguali.

Someones utilizza . come NumberDecimalSeparator, qualcuno utilizza , ma non c'è CultureInfo che utilizza sia come NumberDecimalSeparator.

CultureInfo interfaccia IFormatProvider. Ecco perché se specifichi il tuo CultureInfo, la tua stringa value prova ad essere analizzata su quelle regole di culture.

Sto scrivendo una stringa personalizzata in decimale che deve utilizzare il decimale decimale.TryParse che ignora la cultura

In tal caso, è possibile utilizzare per copiare CultureInfo.Clone method di cui la cultura si desidera (o InvariantCulture) ed è possibile impostare NumberDecimalSeparator e NumberGroupSeparator che stringa che si desidera.

5

I miei cattivi. Ho provato il seguente codice:

 string DutchDecimal = "1,5"; 
     string EnglishDecimal = "1.5"; 
     decimal a; 
     decimal b; 
     Console.WriteLine(decimal.TryParse(DutchDecimal, out a)); 
     Console.WriteLine(a); 
     Console.WriteLine(decimal.TryParse(EnglishDecimal, out b)); 
     Console.WriteLine(b); 
     Console.Read(); 

e analizza correttamente entrambe le stringhe. Sembra che TryParse di default sia effettivamente invariante di cultura. Supponevo che non fosse così, perché il TypeConversionValidator di default in EnterpriseLibrary dipendeva dalla cultura e presumevo che usasse semplicemente TryParse. Tuttavia, poiché questo parser predefinito è hardcoded per usare la cultura corrente.

MODIFICA: ho scoperto che "1.5" converte in 1.5 e "1,5" in 15. Questo in realtà è corretto per il comportamento invariante di cultura, quindi è così. Questa intera domanda è stata apparentemente generata dal mio fraintendimento di come funziona l'invariante di cultura.

+0

Dalla [Documentazione Microsoft] (https://msdn.microsoft.com/en-us/library/9zbda557 (v = vs.110) .aspx) sembra che .NET ritorni alle impostazioni di sistema locali se non specificare una cultura: 'I parametri vengono analizzati utilizzando le informazioni di formattazione in un oggetto NumberFormatInfo inizializzato per la cultura di sistema corrente. –

+0

L'analisi da 1,5 a 15 non è veramente corretta, vero? Se ',' è un separatore di migliaia, non dovrebbe essere consentito nella posizione 10. Penso che l'analisi di 1,5 usando l'analisi di invariant della cultura dovrebbe fallire. –