Domanda

Qual è il modo migliore per analizzare un float in CSharp? Conosco TryParse, ma ciò di cui mi sto particolarmente chiedendo sono punti, virgole ecc.

Sto riscontrando problemi con il mio sito Web. Sul mio server di sviluppo, ',' è per i decimali, '.' per separatore. Sul server prod, però, è il contrario. Come posso catturarlo al meglio?

È stato utile?

Soluzione

Dipende da dove proviene l'input.

Se il tuo input proviene dall'utente, dovresti usare CultureInfo che l'utente / pagina sta usando ( Thread.CurrentThread.CurrentUICulture ).

Puoi ottenere e indicazioni sulla cultura dell'utente, guardando proprietà HttpRequest.UserLanguages ??. (Non corretto al 100%, ma l'ho trovato un'ottima prima ipotesi) Con queste informazioni, è possibile impostare Thread.CurrentThread.CurrentUICulture all'inizio della pagina.

Se l'input proviene da una fonte interna, è possibile utilizzare InvariantCulture per analizzare la stringa.

Il metodo Parse è in qualche modo più semplice da usare, se l'input proviene da una fonte controllata. Cioè, hai già convalidato la stringa. Parse genera un'eccezione (lenta) se fallisce.

Se l'input è incontrollato, (da parte dell'utente o altra fonte Internet), TryParse mi sembra migliore.

Altri suggerimenti

Sono d'accordo con la risposta di leppie; per dirla in termini di codice:

string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);

Puoi sempre utilizzare il sovraccarico di Parse che include il cultura da usare?

Ad esempio:

double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting

Se hai il controllo di tutti i tuoi dati, dovresti utilizzare " CultureInfo.InvariantCulture " in tutto il tuo codice.

Se vuoi valori persistenti (numeri, data, ora, ecc ...) per scopi interni. Usa ogni volta " InvariantCulture " per formattare & amp; analisi dei valori. & Quot; InvariantCulture " è lo stesso su tutti i computer, tutti i sistemi operativi con la cultura / lingua / etc ...

di qualsiasi utente
string strFloat = (15.789f).ToString(System.Globalization.CultureInfo.InvariantInfo);
float numFloat  = float.Parse(System.Globalization.CultureInfo.InvariantInfo, strFloat);
string strNow   = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantInfo);
DateTime now    = DateTime.Parse(System.Globalization.CultureInfo.InvariantInfo, strNow);

Usa una cultura neutrale (o quella che conosci) quando analizzi con Try / Parse.

Passa a CultureInfo o NumberFormatInfo che rappresenta la cultura in cui vuoi analizzare il float come ; controlla quali caratteri vengono usati per i decimali, i separatori di gruppi, ecc.

Ad esempio per garantire che il '.' il carattere è stato considerato come l'indicatore decimale che potresti passare in CultureInfo.InvariantCulture (questo è in genere molto utile nelle applicazioni server in cui tendi a voler che le cose siano le stesse indipendentemente dalla cultura dell'ambiente).

Cerca di evitare float.Parse, usa invece TryParse poiché funziona molto meglio ma fa lo stesso lavoro. questo vale anche per double, DateTime, ecc ...

(alcuni tipi offrono anche TryParseExact, che funziona anche meglio!)

La fonte è un input da un sito Web. Non posso fare affidamento sul fatto che sia valido. Quindi sono andato con TryParse come menzionato prima. Ma non riesco a capire come dargli l'attualeCultura.

Inoltre, questo mi darebbe la cultura del server su cui è attualmente in esecuzione, ma dal momento che è il World Wide Web, l'utente può essere ovunque ...

puoi conoscere Cuklture attuale del tuo server con una semplice dichiarazione:

System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;

Nota che esiste una proprietà CurrentUICulture, ma UICulture è usato da ResourceMeanager da applicazioni multilingua. per la formattazione dei numeri, è necessario considerare CurrentCulture.

Spero che questo ti possa aiutare

Dato che non conosci la cultura dell'utente Web, puoi fare alcune congetture. TryParse con una cultura che utilizza, per separatori e. per i decimali, AND TryParse con una cultura che utilizza. per i separatori e, per i decimali. Se entrambi riescono ma producono risposte diverse, dovrai chiedere all'utente quale intendevano. Altrimenti puoi procedere normalmente, dati i tuoi due risultati uguali o un risultato utilizzabile o nessun risultato utilizzabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top