С# Преобразование String Decimal в Int
У меня есть строка "246246.246", которую я хотел бы передать интерфейсу IConvertable, ToInt16, ToInt32, ToIn64. Каков наилучший способ разобрать строку с десятичными знаками на целое число?
Это решение, но есть ли лучшее решение?
string value = "34690.42724";
Convert.ToInt64(Convert.ToDouble(value));
Ответы
Ответ 1
Чтобы сделать это округление округления, вы можете сделать:
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));
Ответ 2
Вам не нужно округлять значение, так как ToInt64 (double) возвращает закругленную версию уже
string value = "246246.246";
Convert.ToInt64(Convert.ToDouble(value));
Ответ 3
Если вы действительно беспокоитесь о точности, но не о скорости, то десятичный тип будет лучше.
(long)Math.Round(decimal.Parse(value));
Ответ 4
Предполагая, что эта строка поступает из пользовательского ввода, вы, вероятно, захотите уловить стиль набора. Запустите его с помощью функции многократного использования так...
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;
}
}