Преобразование текста в целое число для сравнения в C#

Программа C# получает строку с пометкой:

1.2345 V

Мне нужно сравнить это значение, используя ‹ или > в операторе if. Как мне преобразовать строку выше в целое число? Я пытался использовать:

int anInteger;
anInteger = Convert.ToInt32(textBox1.Text);
anInteger = int.Parse(textBox1.Text);

Но выдает ошибку System.FormatException: incorrect format.


person Claude Hitech    schedule 15.09.2017    source источник
comment
Это не целое число, а двойное/десятичное значение. Вы также должны удалить V, прежде чем сможете его проанализировать.   -  person Tim Schmelter    schedule 15.09.2017
comment
какое целочисленное значение вы ожидаете от 1.2345 V?   -  person Rahul    schedule 15.09.2017
comment
Вам нужны только числа или V имеет особое значение, потому что эта строка не может быть преобразована в числовое значение.   -  person Jerodev    schedule 15.09.2017
comment
Возможный дубликат Как преобразовать строку в целое число в C#   -  person SᴇM    schedule 15.09.2017
comment
Возможный дубликат Как решить System.FormatException??   -  person EJoshuaS - Reinstate Monica    schedule 15.10.2017


Ответы (4)


Если вы настаиваете на целом числе (точка в 1.2345 должна быть игнорирована, а конечным результатом будет 12345):

  // Any digits (including, say, Persian ones) are OK  
  int anInteger = (textBox1.Text
    .Where(c => char.IsDigit(c))
    .Aggregate(0, (s, a) => s * 10 + (int)char.GetNumericValue(a));   

Or

  // Only '0'..'9' digits supported
  int anInteger = (textBox1.Text
    .Where(c => c >= '0' && c <= '9')
    .Aggregate(0, (s, a) => s * 10 + a - '0');   
person Dmitry Bychenko    schedule 15.09.2017

Вы должны удалить V в конце и использовать decimal.Parse/ TryParse:

decimal d;
bool validFormat = decimal.TryParse(textBox1.Text.TrimEnd('V', ' '), out d);

В моей стране, которая использует , в качестве десятичного числа и . в качестве разделителя групп, это дает 12345.

Если вместо этого вы хотите игнорировать все, что не является цифрой в строке:

int number = int.Parse(new string(textBox1.Text.Where(char.IsDigit).ToArray()));
person Tim Schmelter    schedule 15.09.2017
comment
В C#7 вы можете сделать out decimal d, чтобы сэкономить немного места :) - person Sasha; 15.09.2017
comment
и вам, возможно, придется использовать инвариантную культуру в зависимости от местоположения спрашивающих - person Yair Halberstadt; 15.09.2017
comment
@YairHalberstadt: ну, у меня это работает, и я не использую . в качестве десятичного разделителя. Результат 12345, что немного странно - person Tim Schmelter; 15.09.2017
comment
В некоторых странах это не работает, и программист часами пытается понять, почему. @Tim - person Yair Halberstadt; 15.09.2017
comment
@YairHalberstadt: верно и обратное, кажется, OP также ожидает целое число, а не двойное, поэтому это не сработает, если он использует InvariantCulture, который использует . в качестве десятичного разделителя - person Tim Schmelter; 15.09.2017
comment
@TimSchmelter Я просто предположил, что это ошибка - person Yair Halberstadt; 15.09.2017
comment
@YairHalberstadt: изменил мой ответ, чтобы упомянуть об этом - person Tim Schmelter; 15.09.2017

Также обратите внимание, что в зависимости от ваших текущих настроек культуры вы можете получить разные результаты.

Следующий код был запущен с настройками культуры de-DE

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-DE");

string str = "1.23";
decimal val = decimal.Parse(str);
val.Dump(); // output 123

string str2 = "1,23";
decimal val2 = decimal.Parse(str2);
val2.Dump(); // output 1,23

Следующий код был запущен с настройками культуры en-US

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

string str = "1.23";
decimal val = decimal.Parse(str);
val.Dump(); // output 1.23

string str2 = "1,23";
decimal val2 = decimal.Parse(str2);
val2.Dump(); // output 123

Пожалуйста, используйте LINQPad для запуска этого кода.

person rraszewski    schedule 15.09.2017

можешь попробовать -

 decimal dec=2;
 string str = "3.23456";
 dec = Convert.ToDecimal(str.ToString());
 int a = Convert.ToInt32(dec);
person Nofar Eliasi    schedule 17.10.2017