Question

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

  • Les Américains utilisent 10 000,50
  • Les Allemands en 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 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 supprimez les autres.Si je n'en ai qu'un, vérifiez s'il se produit plus d'une fois et supprimez-le 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.

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/navigateur en-US.

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

Était-ce utile?

La solution

Je pense que le mieux que vous puissiez faire dans ce cas est de prendre en compte 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 que 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 a une classe assez puissante : Système.Globalisation.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à l'aide des en-têtes de requête HTTP) transmet CultureInfo de l'utilisateur actuel à CultureInfo.CurrentCulture ou CultureInfo.CurrentUICulture, ceux-ci fonctionneront correctement.

On ne peut 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étecter la culture d'une manière ou d'une autre (navigateur, paramètres du système – quel est le cas d'utilisation ?ASPIC?Application interne, ou ouverte sur le monde ?), ou fournissez un exemple du formatage attendu, 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 1000.Si vous fournissez une plage attendue où max < 1 000*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 à 3 000, 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, tandis 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.

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