72 votes

Analyse du nombre en virgule flottante: existe-t-il un algorithme de type Catch All?

L'une des pièces amusantes de multi-programmation culturelle est les formats de nombre.

  • Les américains utilisent de 10 000.50
  • Les allemands utilisent 10.000,50
  • Français 10 000,50

Ma première approche serait de prendre de la chaîne, de l'analyser en arrière, jusqu'à ce que je rencontre un séparateur et de l'utiliser comme mon séparateur décimal. Il y a un défaut évident avec qui: 10.000 serait interprété comme 10.

Une autre approche: si la chaîne contient 2 différents caractères non numériques, utiliser le dernier comme séparateur décimal et rejeter les autres. Si j'ai seulement un, vérifier si elle se produit plus d'une fois et jeter si elle n'. Si elle n'apparaît qu'une fois, vérifier si elle a 3 chiffres après elle. Si oui, jetez-il, sinon l'utiliser comme séparateur décimal.

L'évidence de la "meilleure solution" serait de détecter la culture de l'Utilisateur ou le Navigateur, mais cela ne fonctionne pas si vous avez un Français à l'aide d'un fr-fr/Windows Navigateur.

L' .net Framework contient certains mythique de la magie noire virgule flottante analyseur c'est mieux que d' Double.(Try)Parse() , en essayant de détecter automatiquement le format de nombre?

32voto

Ryan Fox Points 5181

Je pense que le mieux que vous puissiez faire dans ce cas-ci est de prendre leur avis et de leur montrer ensuite ce que vous pensez qu'ils voulaient dire. S'ils ne sont pas d'accord, montrez-leur le format auquel vous vous attendez et demandez-leur de le saisir à nouveau.

28voto

huseyint Points 8196

Je ne sais pas la ASP.NET côté du problème, mais .NET est un très puissant de la classe: Système.De la mondialisation.CultureInfo. Vous pouvez utiliser le code suivant pour analyser une chaîne de caractères contenant une valeur de type double:

double d = double.Parse("100.20", CultureInfo.CurrentCulture);

Si ASP.NET d'une certaine manière (par exemple en utilisant les en-têtes de la Requête HTTP) passe de l'utilisateur actuel CultureInfo soit CultureInfo.CurrentCulture ou CultureInfo.CurrentUICulture, ces fonctionnera très bien.

13voto

Chris Marasti-Georg Points 17023

Vous ne pouvez pas plaire à tout le monde. Si j'entre dix comme 10 000, et quelqu'un entre dix mille, 10 000, vous ne pouvez pas gérer cela sans une certaine connaissance de la culture de l'entrée. Détectez la culture d'une manière ou d'une autre (navigateur, configuration du système - quel est le cas d'utilisation? ASP? Application interne ou ouverte sur le monde?), Ou fournissez un exemple de la mise en forme attendue et utilisez l'analyseur le plus indulgent possible. Probablement quelque chose comme:

  double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture); 

10voto

Michiel de Mare Points 15888

La différence entre 12,345 en français et en anglais est un facteur de 1000. Si vous fournissez une plage attendue où max <1000 * min, vous pouvez facilement le deviner.

Prenons l'exemple de la taille d'une personne (y compris les bébés et les enfants) en mm.

En utilisant une plage de 200 à 3000, une entrée de 1 800 ou 1 800 peut être interprétée sans ambiguïté comme étant égale à 1 mètre et à 80 centimètres, tandis qu'une entrée de 912 300 ou 912 300 peut être interprétée sans ambiguïté à 91 centimètres et 2,3 millimètres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X