J'ai une chaîne "246246.246" que j'aimerais transmettre à l'interface IConvertable, ToInt16, ToInt32, ToIn64. Quelle est la meilleure façon d'analyser une chaîne avec des décimales dans un entier?
C'est une solution, mais existe-t-il une meilleure solution?
string value = "34690.42724";
Convert.ToInt64(Convert.ToDouble(value));
Pour faire cet arrondi d'actualisation, vous pourriez faire:
Convert.ToInt64(Math.Floor(Convert.ToDouble(value)));
Si vous devez arrondir, vous pouvez remplacer Math.Floor
par Math.Round
.
Edit: Depuis que vous avez mentionné dans un commentaire que vous allez arrondir:
Convert.ToInt64(Math.Round(Convert.ToDouble(value)));
Si vous devez vous préoccuper de la localisation/de la mondialisation, comme l'a indiqué @xls, vous devez appliquer CultureInfo aux conversions.
Edit 2: Méthode alternative utilisant une fonction de chaîne (IMO pas très élégante - peut-être pourrait-elle être élégante avec une fonction de prédicat):
Convert.ToInt64(value.Substring(0, value.IndexOf('.') > 0 ? value.IndexOf('.') : value.Length));
Vous ne devriez pas avoir à arrondir la valeur car ToInt64 (double) renvoie déjà la version arrondie
string value = "246246.246";
Convert.ToInt64(Convert.ToDouble(value));
Si vous êtes vraiment préoccupé par la précision mais pas par la vitesse, le type décimal serait préférable.
(long)Math.Round(decimal.Parse(value));
En supposant que cette chaîne vienne de l'entrée de l'utilisateur, vous voudrez probablement intercepter le style des nombres. Exécutez-le via une fonction réutilisable comme si ...
int? ConvertToNumber(string value)
{
if (value == string.Empty) return null;
try
{
var dec = decimal.Parse(value,
NumberStyles.AllowDecimalPoint |
NumberStyles.Number |
NumberStyles.AllowThousands);
return (int)Math.Round(dec);
}
catch (Exception ex)
{
Console.WriteLine("Please input a number.");
return null;
}
}