web-dev-qa-db-fra.com

La meilleure façon d'analyser le flotteur?

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?

39
Boris Callens

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.

25
GvS

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);
47
Marc Gravell

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);
6
TcKs

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.

6
Davy Landman

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

3
leppie

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).

1
Greg Beech

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ù ...

0
Boris Callens

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!)

0

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

0
stefano m