Question

Quel est le meilleur moyen d’analyser un float dans CSharp? Je connais TryParse, mais je m'interroge tout particulièrement sur les points, les virgules, etc.

J'ai des problèmes avec mon site web. Sur mon serveur de développement, le "," correspond aux décimales, le "." pour séparateur. Sur le serveur de prod, cependant, c'est l'inverse. Comment puis-je mieux capturer cela?

Était-ce utile?

La solution

Dépend d'où provient l'entrée.

Si votre entrée provient de l'utilisateur, vous devez utiliser le CultureInfo que l'utilisateur / la page utilise ( Thread.CurrentThread.CurrentUICulture ).

Vous pouvez obtenir une indication de la culture de l'utilisateur en consultant le HttpRequest.UserLanguages ??. (Non correct à 100%, mais je trouve que c'est une très bonne première hypothèse.) Avec cette information, vous pouvez définir le Thread.CurrentThread.CurrentUICulture au début de la page.

Si votre entrée provient d'une source interne, vous pouvez utiliser InvariantCulture pour analyser la chaîne.

La méthode Parse est un peu plus facile à utiliser si votre entrée provient d’une source contrôlée. C'est-à-dire que vous avez déjà validé la chaîne. Parse lève une exception (lente) en cas d'échec.

Si l'entrée est incontrôlée (de l'utilisateur ou d'une autre source Internet), le TryParse me convient mieux.

Autres conseils

Je suis d'accord avec la réponse de Leppie. pour le mettre en termes de code:

string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);

Vous pouvez toujours utiliser la surcharge de Parse , qui inclut le culture à utiliser?

Par exemple:

double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting

Si vous avez le contrôle de toutes vos données, vous devez utiliser " CultureInfo.InvariantCulture " dans tout votre code.

Si vous souhaitez conserver des valeurs persistantes (chiffres, date, heure, etc.) à des fins internes. À chaque fois, utilisez " InvariantCulture " pour formater & amp; l'analyse des valeurs. "InvariantCulture" est identique sur chaque ordinateur, chaque système d'exploitation avec la culture / langue / etc de n'importe quel utilisateur

string strFloat = (15.789f).ToString(System.Globalization.CultureInfo.InvariantInfo);
float numFloat  = float.Parse(System.Globalization.CultureInfo.InvariantInfo, strFloat);
string strNow   = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantInfo);
DateTime now    = DateTime.Parse(System.Globalization.CultureInfo.InvariantInfo, strNow);

Utilisez une culture neutre (ou une culture que vous connaissez) lors de l'analyse syntaxique avec Try / Parse.

Transmettez un CultureInfo ou NumberFormatInfo qui représente la culture avec laquelle vous souhaitez analyser le flottant ; ceci contrôle quels caractères sont utilisés pour les décimales, les séparateurs de groupe, etc.

Par exemple, pour vous assurer que le '.' Le caractère a été traité comme l'indicateur décimal que vous pouvez transmettre dans CultureInfo.InvariantCulture (celui-ci est généralement très utile dans les applications serveur où vous avez tendance à vouloir que les choses soient identiques quelle que soit la culture de l'environnement).

Essayez d’éviter float.Parse, utilisez plutôt TryParse car il fonctionne beaucoup mieux mais fait le même travail. cela s’applique également à double, DateTime, etc ...

(certains types proposent également TryParseExact, qui fonctionne encore mieux!)

La source est une entrée d'un site Web. Je ne peux pas compter sur sa validité. Donc je suis allé avec TryParse comme mentionné précédemment. Mais je n'arrive pas à comprendre comment lui donner la currentCulture.

De plus, cela me donnerait la culture du serveur sur lequel il tourne, mais comme c'est le World Wide Web, l'utilisateur peut être de n'importe où ...

vous pouvez connaître la version actuelle de votre serveur avec une simple déclaration:

System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;

Notez qu’il identifie une propriété CurrentUICulture, mais que UICulture est utilisé à partir d’applications multilingues de ResourceMeanager. pour le formatage numérique, vous devez considérer CurrentCulture.

J'espère que cela vous aidera

Puisque vous ne connaissez pas la culture de l'internaute, vous pouvez vous permettre de deviner. TryParse avec une culture qui utilise, pour les séparateurs et. pour décimal, et TryParse avec une culture qui utilise. pour les séparateurs et, pour les décimales. S'ils réussissent tous les deux mais donnent des réponses différentes, vous devrez demander à l'utilisateur à quoi ils sont destinés. Sinon, vous pouvez procéder normalement, étant donné vos deux résultats égaux ou un résultat utilisable ou aucun résultat utilisable.

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