web-dev-qa-db-fra.com

Conversion de chaîne décimale en int

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));
26
Mike

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));
47
Joel Etherton

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));
9
deepee1

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));
1
Sergey Shandar

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;
   }
}
0
dbarth