Analyse du nombre de points flottants: Existe-t-il un algorithme Catch All?

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, l'analyser en arrière, jusqu'à ce que je rencontre 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.

Une 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 j'en ai seulement un, vérifiez s'il se produit plus d'une fois et jetez-le si c'est le cas. Si elle n'apparaît qu'une seule fois, vérifiez si elle comporte 3 chiffres après. Si oui, jetez-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.

Est-ce que le .net Framework contient un analyseur de points flottants mythique de magie noire meilleur que Double. (Essayez) Parse() pour essayer de détecter automatiquement le format numérique?

0
ajouté édité
Vues: 2

4 Réponses

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 double valeur:

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

Si ASP.NET en quelque sorte (c'est-à-dire en utilisant les en-têtes HTTP Request) passe CultureInfo de l'utilisateur actuel à CultureInfo.CurrentCulture ou à CultureInfo.CurrentUICulture, ceux-ci fonctionneront correctement.

0
ajouté

Tu ne peux pas plaire à tout le monde. Si j'entre dix comme 10.000, et 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étecter la culture en quelque sorte (navigateur, paramètre du système - quel est le cas d'utilisation? ASP? Application interne, ou ouverte sur le monde?), Ou fournir un exemple de la mise en forme attendue, et utiliser l'analyseur le plus clément possible. Probablement quelque chose comme:

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

The difference between 12.345 in French and English is a factor of 1000. If you supply an expected range where max < 1000*min, you can easily guess.

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

En utilisant une gamme 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.

0
ajouté

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

0
ajouté