c# - Analyse des nombres à virgule flottante: existe-t-il un algorithme Catch All?

Translate

L'une des parties amusantes de la programmation multiculturelle est le format numérique.

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

Ma première approche serait de prendre la chaîne, de l'analyser à l'envers jusqu'à ce que je rencontre un séparateur et de l'utiliser comme séparateur décimal. Il y a un défaut évident à cela: 10.000 seraient interprétés 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 supprimez les autres. Si je n'en ai qu'un, vérifiez si cela se produit plus d'une fois et le rejette si c'est le cas. S'il n'apparaît qu'une seule fois, vérifiez s'il comporte 3 chiffres après. Si oui, supprimez-le, sinon utilisez-le comme séparateur décimal.

La "meilleure solution" évidente serait de détecter la culture ou le navigateur de l'utilisateur, mais cela ne fonctionne pas si vous avez un Français utilisant un Windows / Browser en-US.

Le .net Framework contient-il un analyseur mythique à virgule flottante de magie noire qui est meilleur queDouble.(Try)Parse()en essayant de détecter automatiquement le format des nombres?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

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

La source
Translate

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

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

Si ASP.NET d'une manière ou d'une autre (c'est-à-dire en utilisant les en-têtes de requête HTTP) transmet CultureInfo de l'utilisateur actuel à CultureInfo.CurrentCulture ou CultureInfo.CurrentUICulture, cela fonctionnera correctement.

La source
Translate

Vous ne pouvez pas plaire à tout le monde. Si j'entre dix comme 10 000 et que quelqu'un entre dix mille comme 10 000, vous ne pouvez pas gérer cela sans une certaine connaissance de la culture de l'entrée. Détectez d'une manière ou d'une autre la culture (navigateur, paramètres système - quel est le cas d'utilisation? ASP? Application interne ou ouverte sur le monde?), Ou fournissez un exemple de 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 source
Translate

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 deviner.

Prenons par exemple 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 1 mètre et 80 centimètres, alors qu'une entrée de 912.300 ou 912.300 peut être interprétée sans ambiguïté comme 91 centimètres et 2,3 millimètres.

La source