Pergunta

Eu tenho uma caixa de texto aceitar a entrada do usuário; Eu estou tentando usar essa entrada do usuário para preencher esse membro de um dos meus objetos de negócios:

public System.Decimal? ExchangeRate

A aplicação é localizada - Eu preciso de apoio para as mesmas culturas tempo que aceitam estes como entradas válidas: "1.5" e "1.5"

O código que eu tenho agora é:

var culture = Thread.CurrentThread.CurrentUICulture;

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

entity.ExchangeRate = exchangeRate;

Quando a cultura usuário é definido como uma cultura que espera que o formato de "1,5" (a vírgula como separador decimal) - por exemplo "ro-ro", eu quero que o valor que fica armazenado em entity.ExchangeRate ser 1,5; no entanto, ao executar o código acima, ele é convertido para 15 em vez.

Todas as sugestões sobre como converter esses vários formatos para que os dados que são armazenados na minha entidade empresarial é "1.5" (ponto como separador decimal)?

Graças.


Vocês tinham razão -. Fazia sentido usar Thread.CurrentThread.CurrentCulture vez de Thread.CurrentThread.CurrentUICulture e decimal.TryParse vez de int.TryParse

Mas essas mudanças ainda não resolveria o meu problema. E depois de brincar com o código um pouco mais, agora eu posso simplificar o problema para isso:

Eu estou usando um telerik RadNumericTextBox controle que fazer valer os usuários a usar o formato correto com base na sua cultura. Assim, quando Thread.CurrentThread.CurrentCulture é definido como "ro-ro", ele só irá aceitar o formato de "1,5", e quando ele é definido como "en-GB", ele só irá aceitar o formato "1.5".

Aqui está o código que estou usando agora:

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

Caso 1:. Cultura atual é "en-GB" - entrada aceita é "1.5", ExchangeRate está definido para 1,5 - tudo funciona bem

Caso 2: cultura atual é "ro-ro" - entrada aceita é "1,5", mas depois de executar o decimal.TryParse ... linha, ExchangeRate está definido para 15 - errada , obviamente. Gostaria também de mencionar que, neste caso, o valor de txtExchangeRate.Text também é mostrado como "1,5" em minha janela Watch.

Assim, parece que decimal.TryParse levará em consideração a cultura atual, mas não consigo encontrar uma maneira de realmente fazê-lo funcionar corretamente para mim. Alguma sugestão?

Foi útil?

Solução

OK, aqui está o código que parece funcionar em ambos os casos que eu descrevi no meu acima pós (1. cultura "ro-ro", a vírgula como separador decimal e 2. cultura "en-GB", ponto como separador decimal) :

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

Outras dicas

  1. Obviamente, int não pode segurar 1.5! :-) Use ponto flutuante.

  2. Use CurrentCulture vez de CurrentUICulture. A minha cultura é fr-BE (portanto aceita 1,5 mas meu UI do Windows é o Inglês, o que não faz).

  3. Gostaria de fazer o teste float.Parse () com ambas CurrentCulture E InvariantCulture: No momento em que alguns programas aprendi a aceitar "1,5", todo mundo foi usado para digitar "1.5". Não há nada que me incomoda mais do Excel exigindo que eu digite 1,5 quando digo 1.5! Além disso, aqui na Bélgica, a 1ª governo no ano lançou a declaração de imposto baseado na web, o site obrigaram a usar vírgulas em vez de períodos como pontos decimais. Todo mundo estava se perguntando por que os valores inscritos foram recusados! Então, ser agradável para seus usuários e aceitar ambos.

FYI Eu sei que este não é o seu problema, mas o seu ponteiro de um para outras pessoas que possam estar fazendo isso:

Quando você define a sua cultura, você não pode ter sua aplicação ser capaz de manipular a entrada de diferentes culturas. Deve ser do tipo que você especificou.

Portanto, se você definir ro-RO como a cultura, não vai entender tanto 1,5 e 1,5 como a mesma coisa.

Você provavelmente deve estar usando CurrentCulture (em oposição a CurrentUICulture) para a localização (por exemplo, data / número de formatação).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top