Что лучший способ состоит в том, чтобы взять строку, которая может быть пустой или содержать "1.2", например, и преобразовать его в целое число? int.TryParse
сбои, конечно, и я не хочу использовать float.TryParse
и затем преобразуйте в int
.
Convert.ToDouble
(зависит от языка и региональных параметров) Вы можете использовать Convert.ToDouble
. Но будьте осторожны! Приведенное ниже решение будет работать только тогда, когда разделителем чисел в настройке текущего языка и региональных параметров является символ точки.
var a = (int)Convert.ToDouble("1.2");
Convert.ToDouble
(не зависит от языка и региональных параметров) Предпочтительно использовать IFormatProvider
и преобразовывать число независимо от текущих параметров языка и региональных параметров:
var a = (int)Convert.ToDouble("1.2", CultureInfo.InvariantCulture.NumberFormat);
Другой способ выполнить эту задачу - использовать Разделение для проанализированной строки:
var a = int.Parse("1.2".Split('.')[0]);
Или:
var a = int.Parse("1.2".Split('.').First());
Условие IsNullOrEmpty
. NumberFormatInfo.NumberDecimalSeparator
. Анализируйте
, TryParse
или Конвертируйте
класс с умом. Подробнее читайте на:
Я думаю, что другой способ сделать это - разделить строку на части, взяв десятичную дробь (.) В качестве разделителя, а затем проанализировать целое число. Конечно, я еще не спрашивал вас, может ли строка содержать значения типа «37,56 миль за 32,65 секунды»
.
Учитывая, что в строке будет только одно значение (строка или число), я могу придумать что-то в следующей строке:
public int64 GetInt64(string input)
{
if (string.IsNullOrEmpty(input)) return 0;
// Split string on decimal (.)
// ... This will separate all the digits.
//
string[] words = input.Split('.');
return int.Parse(words[0]);
}
Я не знаю, что не так с синтаксическим анализом в float
и преобразование в int
. Я сомневаюсь, что какой-либо другой способ был бы более эффективным, но вот попытка:
//allows empty strings and floating point values
int ParseInt(string s, bool alwaysRoundDown = false)
{
//converts null/empty strings to zero
if (string.IsNullOrEmpty(s)) return 0;
if (!s.Contains(".")) return int.Parse(s);
string parts = s.Split(".");
int i = int.Parse(parts[0]);
if (alwaysRoundDown || parts.Length==1) return i;
int digitAfterPoint = int.Parse(parts[1][0]);
return (digitAfterPoint < 5) ? i : i+1;
}
Чтобы глобализировать код, вам нужно будет заменить "."
на System.Globalization.CultureInfo.CurrentCulture. NumberFormat.NumberDecimalSeparator
.
Для этого можно использовать библиотеку времени выполнения Visual Basic из C #.
Вам необходимо добавить ссылку на сборку Microsoft.VisualBasic.dll в ваше решение.
Затем следующий код выполнит преобразование:
using VB = Microsoft.VisualBasic.CompilerServices;
class Program
{
static void Main(string[] args)
{
int i = VB.Conversions.ToInteger("1.2");
}
}
Может быть, вы можете попытаться удалить все после чисел с плавающей запятой, используя строковые функции, а затем преобразовать их в int. Но если серьезно, я не думаю, что это лучше, чем преобразовать в float, а затем в int.
int a = (int)Math.Round(float.Parse("0.9"));
Вам нужно сначала округлить, если вы не хотите преобразовать 0.9f в 0 вместо 1.