Virgule flottante Numéro parsing: Y at-il un fourre-tout algorithme?

voix
52

Une des parties amusantes de programmation multi-culturelle est des formats numériques.

  • Les Américains utilisent 10,000.50
  • Allemands utilisent 10.000,50
  • utilisation 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 mon séparateur décimal. Il y a un défaut évident avec ce qui suit: 10.000 serait interprété comme 10.

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

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

Est -ce que le .NET Framework contient un certain analyseur point mythique flottant magie noire qui est mieux que Double.(Try)Parse()d'essayer de détecter automatiquement le format numérique?

Créé 01/08/2008 à 20:23
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
26

Je pense que le mieux que vous pouvez faire dans ce cas est de prendre leur entrée et leur montrer ce que vous pensez qu'ils voulaient dire. En cas de désaccord, leur montrer le format que vous vous attendez et les amener à entrer à nouveau.

Créé 02/08/2008 à 00:17
source utilisateur

voix
26

Je ne sais pas du 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 (à savoir en utilisant les en-têtes de Les requêtes HTTP) passe CultureInfo de l'utilisateur actuel soit CultureInfo.CurrentCulture ou CultureInfo.CurrentUICulture, ceux-ci fonctionnera bien.

Créé 01/08/2008 à 21:02
source utilisateur

voix
11

Vous ne pouvez 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, réglage du système -? Quel est le cas d'utilisation ASP application interne ou ouvert au monde), ou donner un exemple de la mise en forme attendue, et utiliser l'analyseur la plus clémente possible. Probablement quelque chose comme:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
Créé 01/08/2008 à 21:05
source utilisateur

voix
9

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 hauteur 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 1800 peut clairement être interprété comme 1 mètre et 80 centimètres, tandis qu'une entrée de 912,300 ou 912 300 peut clairement être interprétée comme 91 centimètres et 2,3 millimètres.

Créé 02/08/2008 à 13:28
source utilisateur

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