2015-05-22 15 views
5

Nel mio codice Mi capita spesso di usare i seguenti Converte:TryParse equivalente di Convert con InvariantCulture

Convert.ToInt32(value, Cultureinfo.InvariantCulture); 
Convert.ToDecimal(value, CultureInfo.InvariantCulture); 

io ora mi piace usare le funzioni TryParse a causa di errori recenti. Non sono completamente sicuro se sono corretto nell'usare i seguenti equivalenti in quanto non capisco completamente l'enumerazione NumberStyles.

Int64.TryParse(value, NumberStyles.Any, CultureInfo.invariantCulture, out output); 
Decimal.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out output); 

Modifica Qui di seguito dopo risposte

Il seguente codice dovrebbe quindi essere l'alternativa corretta:

Int64.TryParse(value, NumberStyles.Integer, CultureInfo.invariantCulture, out output); 
Decimal.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out output); 
+2

L'approccio è corretto – Coder1409

risposta

7

È possibile leggere circa NumberStyles nello documentation. In sostanza ti permette di specificare che tipo di testo analizzerà.

Se si desidera essere il più flessibile possibile, quindi NumberStyles.Any è l'opzione 'più ampia'.

Convert.ToInt32 equivale a utilizzare int.Parse e Convert.ToDecimal equivale a utilizzare decimal.Parse - delegare a questi metodi.

Per documentation per int.Parse, il valore predefinito è NumberStyles.Integer. E per il numero documentation per decimal.Parse, il valore predefinito è NumberStyles.Number. Se si desidera essere coerenti con il comportamento di Convert.ToInt32 e Convert.ToDecimal, è necessario utilizzare questi valori.

+0

would not 'NumberStyles.Any | NumberStyles.AllowHexSpecifier' è l'opzione più ampia rispetto a 'NumberStyles.Any', o sarebbe illegale? – stakx

+0

Ho cambiato la domanda con la tua e la risposta di dcastro tyvm – Schuere

+1

@stakx sembra che sia illegale. I documenti dicono * Gli unici flag che possono essere combinati con AllowHexSpecifier sono AllowLeadingWhite e AllowTrailingWhite. *. L'ho provato e ho ottenuto un'eccezione in tal senso. –

3

Il documentation for Int64.TryParse dice NumberStyles.Integer è il default:

Il s parametro è interpretato usando lo stile NumberStyles.Integer. Oltre alle cifre decimali, sono consentiti solo gli spazi iniziali e finali e un segno iniziale.

Per Decimal.TryParse, è NumberStyles.Number:

parametro s viene interpretato utilizzando lo stile NumberStyles.Number. Ciò significa che lo spazio bianco e i separatori di migliaia sono consentiti, ma i simboli di valuta non lo sono.

+1

Ciò non corrisponderebbe esplicitamente a 'decimal', che può avere valori fluttuanti. 'NumberStyles.Float' sarebbe più appropriato, dato i due casi di utilizzo nella domanda (o solo in genere' NumberStyles.Number) '. –

+0

@JeroenVannevel Questo è un buon punto, aggiornato la mia risposta – dcastro

+0

Ho cambiato la domanda con la tua e la risposta di charles mager tyvm – Schuere

1

Sì, il tuo approccio è corretto, entrambi gli approcci dovrebbero dare gli stessi risultati.

L'attuazione di Convert.ToInt32(string s) è la seguente:

public static int ToInt32(String value, IFormatProvider provider) 
{ 
    if (value == null) 
     return 0; 
    return Int32.Parse(value, NumberStyles.Integer, provider); 
} 

Quindi, come potete vedere internamente un metodo chiama l'altro - l'unica differenza è che con Convert non si ha il controllo sul numero di stile - è è codificato a NumberStyles.Integer. Se si desidera una funzionalità identica, è necessario specificare questo valore enum nelle chiamate a TryParse.

Il codice sorgente per la classe Convert è disponibile here.

Vorrei anche sottolineare che si sta chiamando Int64.TryParse quando se fosse sufficiente Convert.ToInt32 allora dovrebbe essere Int32.TryParse.

+0

Non ho votato meno, ma ho due suggerimenti: ** 1. ** Cita le tue fonti! (Come sei arrivato con l'implementazione di 'Convert.ToInt32'?) ** 2. ** La tua risposta suggerisce che' NumberStyles.Integer' sarebbe quello per cui andare; ma inizialmente dici che il codice attuale dell'OP è equivalente (usano 'NumberStyles.Any'). Forse potresti andare più in 'NumberStyles.Any'. – stakx

+0

Ho riflettuto in 'mscorlib' - non c'è bisogno di citarla :) –

+0

In realtà, dovresti * dirlo. Reverse-engineering di un assembly, oltre a possibili problemi legali (ma IANAL), porta a conoscenze che potrebbero essere soggette a modifiche in qualsiasi momento. Direi che si dovrebbe preferire la Reference Source (il nome dice tutto) sulla decompilazione quando si risponde su SO. Questa però è solo la mia opinione. – stakx