Quelle est la meilleure façon d'analyser un flottant dans CSharp? Je connais TryParse, mais ce qui m'interroge particulièrement, ce sont les points, les virgules, etc.
J'ai des problèmes avec mon site Web. Sur mon serveur de développement, le ',' est pour les décimales, le '.' pour séparateur. Cependant, sur le serveur prod, c'est l'inverse. Comment puis-je mieux capturer cela?
Dépend d'où vient l'entrée.
Si votre entrée provient de l'utilisateur, vous devez utiliser CultureInfo que l'utilisateur/la page utilise ( Thread.CurrentThread.CurrentUICulture ).
Vous pouvez obtenir et indiquer la culture de l'utilisateur, en consultant la propriété HttpRequest.UserLanguages . (Pas correct à 100%, mais je l'ai trouvé une très bonne première supposition) Avec ces informations, vous pouvez définir 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 d'analyse est un peu plus facile à utiliser si votre entrée provient d'une source contrôlée. Autrement dit, vous avez déjà validé la chaîne. Parse lève une exception (lente) en cas d'échec.
Si l'entrée n'est pas contrôlée, (de l'utilisateur ou d'une autre source Internet), TryParse me semble mieux.
Je suis d'accord avec la réponse de Leppie; pour mettre cela en termes de code:
string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);
Si vous souhaitez conserver des valeurs (nombres, date, heure, etc ...) à des fins internes. Utilisez à chaque fois "InvariantCulture" pour formater et analyser les valeurs. "InvariantCulture" est le même sur chaque ordinateur, chaque système d'exploitation avec la culture/langue/etc de tout 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);
Vous pourriez toujours utiliser la surcharge de Parse qui inclut la culture à utiliser?
Par exemple:
double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting
Si vous contrôlez toutes vos données, vous devez utiliser "CultureInfo.InvariantCulture" dans tout votre code.
Utilisez une culture neutre (ou celle que vous connaissez) lors de l'analyse avec Try/Parse.
Passez un CultureInfo ou NumberFormatInfo qui représente la culture sous laquelle vous souhaitez analyser le flottant; cela 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 pourriez passer 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 les mêmes quelle que soit la culture de l'environnement).
La source est une entrée d'un site Web. Je ne peux pas compter sur sa validité. J'ai donc choisi TryParse comme mentionné précédemment. Mais je ne sais pas comment lui donner la culture actuelle.
De plus, cela me donnerait la culture du serveur sur lequel il fonctionne actuellement, mais comme c'est le World Wide Web, l'utilisateur peut être de n'importe où ...
Essayez d'éviter float.Parse, utilisez TryParse à la place car il fonctionne beaucoup mieux mais fait le même travail. cela vaut également pour les doubles, DateTime, etc ...
(Certains types proposent également TryParseExact qui fonctionne également encore mieux!)
vous pouvez connaître le Cuklture actuel de votre serveur avec une simple déclaration:
System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;
Notez qu'il existe une propriété CurrentUICulture, mais UICulture est utilisé à partir des applications multilingues de ResourceMeanager. pour la mise en forme des nombres, vous devez tenir compte de CurrentCulture.
J'espère que cela t'aidera