it-swarm-ru.tech

Преобразовать десятичную строку в int

У меня есть строка «246246.246», которую я хотел бы передать интерфейсу IConvertable, ToInt16, ToInt32, ToIn64. Каков наилучший способ разобрать строку с десятичными разрядами в целое число?

Это решение, но есть ли лучшее решение? 

string value = "34690.42724";
Convert.ToInt64(Convert.ToDouble(value));
26
Mike

Для этого округления дисконтирования вы можете сделать:

Convert.ToInt64(Math.Floor(Convert.ToDouble(value)));

Если вам нужно округлить, вы можете заменить Math.Floor на Math.Round.

Правка: Так как вы упомянули в комментарии, что вы будете округлять:

Convert.ToInt64(Math.Round(Convert.ToDouble(value)));

Если вам нужно беспокоиться о локализации/глобализации, тогда, как сказал @xls, вы должны применить CultureInfo в конверсиях.

Правка 2: Альтернативный метод с использованием строковой функции (не очень элегантный IMO - может быть, он может быть элегантизирован с помощью функции предиката):

Convert.ToInt64(value.Substring(0, value.IndexOf('.') > 0 ? value.IndexOf('.') : value.Length));
47
Joel Etherton

Вам не нужно округлять значение, так как ToInt64 (double) уже возвращает округленную версию

        string value = "246246.246";
        Convert.ToInt64(Convert.ToDouble(value));
9
deepee1

Если вы действительно беспокоитесь о точности, а не о скорости, то лучше использовать десятичный тип.

(long)Math.Round(decimal.Parse(value));
1
Sergey Shandar

Предполагая, что эта строка поступает из пользовательского ввода, вы, вероятно, захотите поймать числовые стили. Запустите через функцию многократного использования, как ...

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