2016-03-06 6 views
1

Так что я пытаюсь читать из текстового файла и хранить каждое поле в массиве. Но когда я попытался преобразовать accountNumber в Int, я получаю сообщение об ошибке.Формат Исключение при попытке конвертировать

 public bool matchCustomer(int accountID){ 
     string[] data = null; 
     string line = Global.currentFile.reader.ReadLine(); 
     while (line != null) 
     { 
      data = line.Split('*'); 
      this.accountNumber = Convert.ToInt32(data[0]); 
      line = Global.currentFile.reader.ReadLine(); 
      if (accountID == this.accountNumber) 
      { 
       return true; 
      } 

      } 

     return false; 
     } 
+0

Какая ошибка, и что это значение 'данных [0]'? – Steve

+0

Ошибка говорит: «Строка ввода не была в правильном формате». И значение данных [0] равно 12345. Первая строка текстового файла - 12345 * Shrek * 1209 * 100,000 * 50,000 –

+0

Если значения все числовые, существуют ли значения с более чем 10 цифрами? (в частности, любое большее, чем «2 147 483 647») –

ответ

1

Это потому, что данные [0] не конвертируются в int. Что такое данные [0] во время выполнения?

Вы могли бы использовать:

int value; 
if(Int32.TryParse(data[0], out value)) 
{ 
    accountNumber = value; 
} 
else 
{ 
    //Something when data[0] can't be turned into an int. 
    //You'll have to decide this logic. 
} 
+1

И да, TryParse также является безопасным выбором. ;) проголосовали – Ian

1

Скорее всего, потому что вы расщепляетесь разделитель * в строке:

12345 * Shrek * 1209 * 100,000 * 50,000 

Вы оставили с разнесенным номером "12345" вместо всех цифр "12345" , Это заставляет его быть неконвертируемым. Попробуйте применить Обрезка:

this.accountNumber = Convert.ToInt32(data[0].Trim()); 

Кроме того, остерегайтесь строк с разделителем запятой (50000 и 100000). Вы, возможно, потребуется заменить его пустой строкой, если это неконвертируемые:

data[4].Replace(",","").Trim(); 
+0

Я подозревал, что место, но тестирование через консольное приложение показывает, что Convert.ToIn32 (..) достаточно умен, чтобы обрезать. Однако вы правы, что он не может правильно поймать запятые. –

+1

Хорошо, что вы можете проверить его. :) Я сейчас не с моим ноутбуком. Иногда этот, казалось бы, правильный формат дает нам проблему. :) – Ian

0

Другие два ответа решается вопрос и исправить, я подумал о предоставлении другой альтернативы, которая использует Linq.

Вы можете заменить это содержимое блоком while.

return line.Split('*').Select(s=> s.Trim().Replace(",", "")) 
      .Where(c=> Regex.IsMatch(c.Trim(), @"\d+")) 
      .Select(s=>int.Parse(s.Trim()))    
      .Any(e=>e == accountId); 

Работа Demo

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