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

StackOverflow https://stackoverflow.com/questions/192
 Vérifié

Question

L’un des aspects amusants de la programmation multiculturelle concerne les formats numériques.

  • Les Américains utilisent 10 000,50
  • Les Allemands utilisent 10.000,50
  • Utilisation en français 10 000,50

Ma première approche consisterait à prendre la chaîne, à l’analyser en arrière jusqu’à rencontrer un séparateur et à l’utiliser comme séparateur décimal. Il y a un défaut évident à cela: 10.000 serait interprété comme 10.

Autre approche: si la chaîne contient 2 caractères non numériques différents, utilisez le dernier comme séparateur décimal et ignorez les autres. Si je n'en ai qu'un, vérifiez si cela se produit plus d'une fois et le jette si c'est le cas. S'il n'apparaît qu'une seule fois, vérifiez s'il est suivi de 3 chiffres. Si oui, jetez-le, sinon, utilisez-le comme séparateur décimal.

L’évidente " meilleure solution " serait de détecter la culture ou le navigateur de l'utilisateur, mais cela ne fonctionnera pas si vous avez un Français utilisant un navigateur / navigateur américain.

Le .net Framework contient-il un analyseur mythique en virgule flottante de magie noire qui est meilleur que Double.(Try)Parse() pour essayer de détecter automatiquement le format de nombre?

Solution

Je pense que le mieux que vous puissiez faire dans ce cas-ci est de prendre leurs commentaires 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.

Autres conseils

Je ne connais pas le côté ASP.NET du problème, mais .NET possède une classe assez puissante: System.Globalization.CultureInfo . Vous pouvez utiliser le code suivant pour analyser une chaîne contenant une double valeur:

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

Si ASP.NET (à l'aide d'en-têtes de requête HTTP, par exemple) transmet CultureInfo de l'utilisateur actuel à CultureInfo.CurrentCulture ou CultureInfo.CurrentUICulture, cela fonctionnera correctement.

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);

La différence entre 12,345 en français et en anglais est un facteur de 1000. Si vous indiquez une plage attendue où max < 1000 * min, vous pouvez facilement 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 de 1 mètre et de 80 centimètres, alors qu'une entrée de 912 300 ou 912 300 peut être interprétée de manière non équivoque de 91 centimètres et de 2,3 millimètres.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow