2013-04-15 2 views
1

Im работает в бит проблемы с преобразованием string в int, char by char. Когда я перехожу через код, каждый char в string преобразуется в его представление ASCII. Так, например, 0 преобразуется в 48.Проблема с преобразованием строки в int

Что я пытаюсь сделать, это взять 4-значное число, взять каждую цифру и сделать что-то другое.

В качестве примера, если date1 является 0415, num1 должен быть 0, num2 4, num3 1 и num4 5.

foreach (char c in date1) 
{     
    switch (num) 
    { 
     case 1: 
      // calculate first number 
      cNum = Convert.ToInt32(c); 
      num1 = c * 1; 
      break; 

     case 2: 
      // calculate second number 
      cNum = Convert.ToInt32(c); 
      num2 = c * 2; 
      break; 

     case 3: 
      // calculate third number 
      cNum = Convert.ToInt32(c); 
      num3 = c * 3; 
      break; 

     case 4: 
      // calculate fourth number 
      cNum = Convert.ToInt32(c); 
      num4 = c * 4; 
      break; 

     default: 
      break; 
    } 

    num++; 
} 

Любая помощь очень высоко ценится, и если что-нибудь еще нужно, пожалуйста, дайте мне знать.

+0

Почему бы не использовать петлю для петли? – BlackBear

+0

Это странный способ сделать это, но почему в мире вы умножаете результаты на 1, 2, 3 и 4 соответственно? – Jcl

+1

Вероятно, это должно быть 'num1 = cNum * 1;' Вы пытаетесь несколько символов, а не тот, который вы преобразовали в int. Также, если вы увеличиваете число num ++, вы можете удалить оператор switch и сделать что-то вроде 'numarray [num] = cNum * (num + 1)' – lucuma

ответ

3

Попробуйте использовать GetNumericValue вместо Convert.ToInt32().

Документация здесь: http://msdn.microsoft.com/en-us/library/system.char.getnumericvalue.aspx

Кроме того - вы, вероятно, может упростить код это если я не хватает чего-то:

num1 = Char.GetNumericValue(date1[0]); 
num2 = Char.GetNumericValue(date1[1]); 
num3 = Char.GetNumericValue(date1[2]); 
num4 = Char.GetNumericValue(date1[3]); 

Это кажется немного странно для меня, но ваш цикл только обрабатывая первые 4 символа.

Если вы хотите обработать более 4, я вернусь к использованию цикла и просто нажму все числа в массив или что-то вместо того, чтобы создавать определенную переменную для каждого.

+0

Спасибо Abe. Его только когда-либо будет 4 персонажа, поэтому я так и сделал. Я знаю, что он супер уродливый, но я просто хотел получить что-то быстрое и функциональное. –

+0

Быстрое и грязное бывает. –

0

Операторы case ищут значение ASCII 1, 2, 3,..., а не значения символов. Измените ваши заявления случая, чтобы соответствовать:

case '1': 
case '2': 
... 
+0

Это то, что я тоже думал, но это на самом деле вызовы 'Convert.ToInt32', которые не делают то, что хочет OP. –

+0

Ах да, вы правы. Ну, великий Джон Скит снова избил меня до удара! – gunr2171

2

Convert.ToInt32 ведет себя точно так, как документировано:

32-разрядное целое число, которое представляет UTF-16 в кодировке кодовой точки параметра значения.

Вы можете использовать Char.GetNumericValue, чтобы получить числовое значение символа, или если вы знаете, что это в пределах «0» - «9» вы можете просто использовать:

int digit = c - '0'; 

Это иногда проще, чем вызов Char.GetNumericValue, поскольку последний возвращает double, чтобы он мог представлять такие значения, как ¼. Если вы сделать только хотите обрабатывать «0» - «9», было бы лучше, чтобы проверить, что:

if (c < '0' || c > '9') 
{ 
    // Throw an exception or something like that 
} 

Кроме того, обратите внимание, что если date1 действительно предназначается, чтобы быть представление даты, не сделайте все это самостоятельно - используйте DateTime.ParseExact (или TryParseExact).

+0

Большое спасибо. Я обычно не код на C#, поэтому было довольно схематично, как это сделать, очевидно, lol. Еще раз спасибо. –

Смежные вопросы