Подтвердить что ты не робот

С# Преобразование строки, содержащей с плавающей запятой целое число

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

4b9b3361

Ответ 1

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

Обратите внимание, что если вы используете запятую в качестве разделителя чисел в своей операционной системе, вы должны использовать IFormatProvider:

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

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

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

Помните о:

Ответ 2

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

Ответ 3

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

Ответ 4

int a = (int)Math.Round(float.Parse("0.9"));

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

Ответ 5

Я думаю, что другой способ сделать это - это расщепление строки на куски, в которой будет десятичный (.) как разделитель, а затем разбор целого числа. Конечно, я еще должен спросить вас, может ли строка содержать такие значения, как значения типа "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]);
}

Ответ 6

Вы можете использовать библиотеку времени исполнения Visual Basic для выполнения этого из С#.

Вам нужно добавить ссылку на сборку Microsoft.VisualBasic.dll на свое решение.

Затем следующий код выполнит ваше преобразование:

using VB = Microsoft.VisualBasic.CompilerServices;

class Program
{
    static void Main(string[] args)
    {
        int i = VB.Conversions.ToInteger("1.2");
    }
}

Ответ 7

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

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

  var num1 = (float)Convert.ToDouble(num);