C#, Преобразовывающий строку, содержащую плавающую точку к целому числу

Что лучший способ состоит в том, чтобы взять строку, которая может быть пустой или содержать "1.2", например, и преобразовать его в целое число? int.TryParse сбои, конечно, и я не хочу использовать float.TryParse и затем преобразуйте в int.

16
задан Dariusz Woźniak 21 February 2018 в 19:04
поделиться

6 ответов

Решение 1: Convert.ToDouble (зависит от языка и региональных параметров)

Вы можете использовать Convert.ToDouble . Но будьте осторожны! Приведенное ниже решение будет работать только тогда, когда разделителем чисел в настройке текущего языка и региональных параметров является символ точки.

var a = (int)Convert.ToDouble("1.2");    

Решение 2: Convert.ToDouble (не зависит от языка и региональных параметров)

Предпочтительно использовать IFormatProvider и преобразовывать число независимо от текущих параметров языка и региональных параметров:

var a = (int)Convert.ToDouble("1.2", CultureInfo.InvariantCulture.NumberFormat); 

Решение 3: Анализ и Разделение

Другой способ выполнить эту задачу - использовать Разделение для проанализированной строки:

var a = int.Parse("1.2".Split('.')[0]);

Или:

var a = int.Parse("1.2".Split('.').First());

Примечания

36
ответ дан 30 November 2019 в 16:13
поделиться

Я думаю, что другой способ сделать это - разделить строку на части, взяв десятичную дробь (.) В качестве разделителя, а затем проанализировать целое число. Конечно, я еще не спрашивал вас, может ли строка содержать значения типа «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]);
}
0
ответ дан 30 November 2019 в 16:13
поделиться

Я не знаю, что не так с синтаксическим анализом в 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 .

4
ответ дан 30 November 2019 в 16:13
поделиться

Для этого можно использовать библиотеку времени выполнения 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");
    }
}
0
ответ дан 30 November 2019 в 16:13
поделиться

Может быть, вы можете попытаться удалить все после чисел с плавающей запятой, используя строковые функции, а затем преобразовать их в int. Но если серьезно, я не думаю, что это лучше, чем преобразовать в float, а затем в int.

1
ответ дан 30 November 2019 в 16:13
поделиться
int a = (int)Math.Round(float.Parse("0.9"));

Вам нужно сначала округлить, если вы не хотите преобразовать 0.9f в 0 вместо 1.

1
ответ дан 30 November 2019 в 16:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: