Domanda

Ho una casella di testo che accetta l'input dell'utente; Sto cercando di utilizzare questo input dell'utente per popolare a questo utente di uno dei miei oggetti di business:

public System.Decimal? ExchangeRate

L'applicazione è localizzata - ho bisogno di sostenere allo stesso tempo culture che accettano questi ingressi validi: "1,5" e "1.5"

Il codice che ho ora è:

var culture = Thread.CurrentThread.CurrentUICulture;

int exchangeRate;
int.TryParse(txtExchangeRate.Text, NumberStyles.Number, culture, 
    out exchangeRate);

entity.ExchangeRate = exchangeRate;

Quando la cultura dell'utente è impostata su una cultura che si aspetta che il formato "da 1,5" (la virgola come separatore decimale) - per esempio "ro-ro", voglio che il valore che viene memorizzato in entity.ExchangeRate essere 1,5; Tuttavia, quando si esegue il codice precedente, esso viene convertito in 15 invece.

Qualche suggerimento su come convertire questi vari formati in modo che i dati che viene memorizzato nel mio ente commerciale è "1.5" (punto come separatore decimale)?

Grazie.


ragazzi avevano ragione -. Aveva senso utilizzare Thread.CurrentThread.CurrentCulture invece di Thread.CurrentThread.CurrentUICulture e decimal.TryParse invece di int.TryParse

Ma questi cambiamenti non sarebbero ancora risolvere il mio problema. E dopo aver giocato con il codice un po ', ora posso semplificare il problema a questo:

Sto usando un controllo RadNumericTextBox Telerik che impongono agli utenti di utilizzare il formato corretto in base alla loro cultura. Così, quando Thread.CurrentThread.CurrentCulture è impostato su "ro-ro", accetterà solo il formato "da 1,5", e quando è impostato su "it-IT", accetterà solo il formato "1.5".

Ecco il codice che sto usando ora:

decimal exchangeRate;
decimal.TryParse(txtExchangeRate.Text, out exchangeRate);
entity.ExchangeRate = exchangeRate;

Caso 1: la cultura attuale è "it-IT" - ingresso accettata è "1.5", dei tassi di cambio è impostato a 1,5 - tutto funziona bene

.

Caso 2: la cultura attuale è "ro-ro" - ingresso accettata è "1,5", ma dopo l'esecuzione del decimal.TryParse ... linea, ExchangeRate è impostato su 15 - sbagliato , ovviamente. Vorrei anche ricordare che in questo caso, il valore di txtExchangeRate.Text viene anche indicato come "1.5" nella mia finestra di controllo.

Quindi, sembra che decimal.TryParse prenderà in considerazione la cultura corrente, ma non riesco a trovare un modo per farlo funzionare correttamente per me. Eventuali suggerimenti?

È stato utile?

Soluzione

OK, ecco il codice che sembra funzionare in entrambi i casi che ho descritto nel mio post sopra (1. cultura "ro-ro", come separatore virgola decimale e 2. la cultura "it-IT", punto come separatore decimale) :

decimal exchangeRate;
decimal.TryParse(txtExchangeRate.Text, NumberStyles.Any, 
       CultureInfo.InvariantCulture, out exchangeRate);
entity.ExchangeRate = exchangeRate;

Altri suggerimenti

  1. Ovviamente, int non può tenere 1.5! :-) Usa galleggiare invece.

  2. L'uso CurrentCulture invece di CurrentUICulture. La mia cultura è fr-BE (accetta quindi 1,5 ma la mia interfaccia utente di Windows è l'inglese, il che non fa).

  3. Vorrei fare il test float.Parse () sia con CurrentCulture E InvariantCulture: Con il tempo alcuni programmi hanno imparato ad accettare "1.5", ognuno è stato utilizzato per digitare "1.5". Non c'è niente che mi preoccupa più di Excel richiede di digitare mi 1,5 quando dico 1.5! Inoltre, qui in Belgio, il primo governo anno ha lanciato la dichiarazione dei redditi basata sul web, il sito ti ha costretto a usare le virgole invece dei periodi di punti decimali. Ognuno si chiedeva il motivo per cui gli importi previsti sono stati rifiutati! Quindi, essere piacevole per gli utenti e accettare sia.

FYI So che questo non è il tuo problema, ma è un puntatore per le altre persone che potrebbero fare questo:

Quando si imposta la vostra cultura, non si può avere l'applicazione in grado di gestire l'input di culture diverse. Deve essere del tipo che hai specificato.

Di conseguenza, se si imposta ro-ro come la cultura, non sarà capire sia 1,5 e 1,5 come la stessa cosa.

Probabilmente si dovrebbe utilizzare CurrentCulture (al contrario di CurrentUICulture) per la localizzazione (per esempio la formattazione di data / numero).

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