Número de ponto flutuante de análise: Existe um Catch All algoritmo?

votos
52

Uma das partes divertidas de programação multi-cultural é formatos de número.

  • Os americanos usam 10,000.50
  • Alemães usam 10.000,50
  • utilização Francês 10 000,50

Minha primeira abordagem seria a de tomar a corda, analisá-lo para trás, até que eu encontrar um separador e usar isso como meu separador decimal. Há uma falha óbvia com isso: 10.000 seria interpretado como 10.

Outra abordagem: se a cadeia contém 2 caracteres não-numéricos diferentes, use o último como separador decimal e descartar os outros. Se eu tiver apenas um, verifique se ele ocorre mais de uma vez e descartá-lo se ele faz. Se ele só aparece uma vez, verificar se ele tem 3 dígitos depois dele. Se sim, descartá-lo, caso contrário, usá-lo como separador decimal.

O óbvio melhor solução seria para detectar a cultura do usuário ou do navegador, mas que não funciona se você tiver um francês usando um en-US Windows / navegador.

O .NET Framework contêm algum analisador ponto mítico magia negra flutuante que é melhor do que Double.(Try)Parse()em tentar detectar automaticamente-o formato de número?

Publicado 01/08/2008 em 20:23
fonte usuário
Em outras línguas...                            


4 respostas

votos
26

Eu acho que o melhor que você pode fazer neste caso é tomar sua entrada e, em seguida, mostrar-lhes o que você pensa que elas significavam. Se eles não concordam, mostrar-lhes o formato que você está esperando e levá-los para inseri-lo novamente.

Respondeu 02/08/2008 em 00:17
fonte usuário

votos
26

Eu não sei o lado ASP.NET do problema, mas .NET tem uma classe muito poderosa: System.Globalization.CultureInfo . Você pode usar o seguinte código para analisar uma string contendo um valor duplo:

double d = double.Parse("100.20", CultureInfo.CurrentCulture);
//  -- OR --
double d = double.Parse("100.20", CultureInfo.CurrentUICulture);

Se ASP.NET de alguma forma (ou seja, usando cabeçalhos de solicitação HTTP) passa CultureInfo do usuário atual a qualquer CultureInfo.CurrentCulture ou CultureInfo.CurrentUICulture, estes irão funcionar bem.

Respondeu 01/08/2008 em 21:02
fonte usuário

votos
11

Você não pode agradar a todos. Se eu entrar dez como 10.000, e alguém entra dez mil em 10.000, você não pode lidar com isso sem algum conhecimento da cultura da entrada. Detectar a cultura de alguma forma (navegador, configuração do sistema -??? O que é o caso de uso ASP aplicativo interno ou aberto ao mundo), ou fornecer um exemplo da formatação esperada, e usar o analisador mais branda possível. Provavelmente algo como:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
Respondeu 01/08/2008 em 21:05
fonte usuário

votos
9

A diferença entre 12.345 em Francês e Inglês é um fator de 1000. Se você fornecer uma faixa esperada onde max <1000 * min, você pode facilmente adivinhar.

Tomemos por exemplo a altura de uma pessoa (incluindo bebés e crianças) em mm.

Ao utilizar uma gama de 200-3000, uma entrada de 1.800 ou 1.800 pode ser interpretada como sem ambiguidade um metro e 80 centímetros, enquanto que uma entrada de 912,300 912,300 ou pode ser interpretada como sem ambiguidade 91 centímetros e 2,3 milímetros.

Respondeu 02/08/2008 em 13:28
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more