C # Преобразование строки с плавающей запятой в целое число - PullRequest
15 голосов
/ 03 августа 2010

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

Ответы [ 7 ]

35 голосов
/ 03 августа 2010

Решение 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: Parse & Split

Еще один способ выполнить эту задачуиспользовать Split для анализируемой строки:

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

Или:

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

Примечания

4 голосов
/ 03 августа 2010

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

1 голос
/ 05 августа 2010
int a = (int)Math.Round(float.Parse("0.9"));

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

1 голос
/ 03 августа 2010

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

0 голосов
/ 21 ноября 2017

У меня была такая же проблема, и я использовал гибрид Марка и Дариуса ':

 if (num == "")
     {
      num = "0.00";
     }

  var num1 = (float)Convert.ToDouble(num);
0 голосов
/ 05 августа 2010

Вы можете использовать библиотеку времени выполнения 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 голосов
/ 03 августа 2010

Я думаю, что другой способ сделать это - разбить строку на части, взяв десятичную дробь (.) В качестве разделителя, а затем проанализировав целое число. Конечно, мне еще нужно спросить вас, может ли строка содержать значения типа "37.56 miles in 32.65 seconds" значения типа.

Учитывая, что в строке будет только одно значение (строка или число), я могу придумать что-нибудь в следующей строке:

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]);
}
...