2016-11-28 4 views
0

У меня есть массив с плавающей точкой, который является [] [] и временным массивом чтения, который является b []. У меня есть данные, как это:2D строковый массив для массива float C#

1 1 6 4 12 5 5 3 4 1 67 3 2 1 2 1 0 0 1 0 0 1 0 0 1 
2 2 48 2 60 1 3 2 2 1 22 3 1 1 1 1 0 0 1 0 0 1 0 0 1 
1 4 12 4 21 1 4 3 3 1 49 3 1 2 1 1 0 0 1 0 0 1 0 1 0 
1 1 42 2 79 1 4 3 4 2 45 3 1 2 1 1 0 0 0 0 0 0 0 0 1 
2 1 24 3 49 1 3 3 4 4 53 3 2 2 1 1 1 0 1 0 0 0 0 0 1 
1 4 36 2 91 5 3 3 4 4 35 3 1 2 2 1 0 0 1 0 0 0 0 1 0 
1 4 24 2 28 3 5 3 4 2 53 3 1 1 1 1 0 0 1 0 0 1 0 0 1 
1 2 36 2 69 1 3 3 2 3 35 3 1 1 2 1 0 1 1 0 1 0 0 0 0 
1 4 12 2 31 4 4 1 4 1 61 3 1 1 1 1 0 0 1 0 0 1 0 1 0 
2 2 30 4 52 1 1 4 2 3 28 3 2 1 1 1 1 0 1 0 0 1 0 0 0 
2 2 12 2 13 1 2 2 1 3 25 3 1 1 1 1 1 0 1 0 1 0 0 0 1 
2 1 48 2 43 1 2 2 4 2 24 3 1 1 1 1 0 0 1 0 1 0 0 0 1 
1 2 12 2 16 1 3 2 1 3 22 3 1 1 2 1 0 0 1 0 0 1 0 0 1 
2 1 24 4 12 1 5 3 4 3 60 3 2 1 1 1 1 0 1 0 0 1 0 1 0 

И мой код здесь:

 for(int i = 0 ; i < linecount ; i++) 
     { 
      string[] b = sr.ReadLine().Split(' '); 
      for(int j = 0 ; j < b.Length ; j++) 
      { 
       a[i,j]= float.Parse(b[ j ]); 
      } 
     } 

Это дает мне эту ошибку:

Необработанное исключение типа 'System.FormatException' произошло в mscorlib.dll

Дополнительная информация: Строка ввода не была в правильном формате.

Большая часть этой проблемы в Интернете связана с 123124.23234 вместо 123124,23234, но мои числа являются целыми числами. Как мне это сделать? Спасибо!

+3

Возможный дубликат [Почему я получаю FormatException при преобразовании строки в float?] (http://stackoverflow.com/questions/5592950/why-do-i-get-a-formatexception-when-converting-a-string-to-a-float) – MickyD

+0

a [i, j] = float.Parse (b [j], CultureInfo.InvariantCulture); Дала мне ту же ошибку. С «использованием System.Globalization»; правильно? Также они являются целыми числами. –

+0

Вам нужно обрезать свое значение b [j] перед тем, как делать кастинг, как если бы у вас было несколько пробелов между номерами, он будет генерировать строку типа «2», и ваша программа завершится неудачей с этим исключением. Изменить float.Parse (b [j]); float.Parse (b [j] .Trim()); – Hakunamatata

ответ

0

Один из элементов, которые вы обрабатываете для float, - это не просто число и может содержать пробелы. Вы можете сделать это, чтобы выяснить, какие:

for (int i = 0; i < linecount; i++) 
{ 
    string[] b = sr.ReadLine().Split(' '); 
    for (int j = 0; j < b.Length; j++) 
    { 

     try 
     { 
      a[i, j] = float.Parse(b[j]); 
     } 
     catch (FormatException ex) 
     { 
      var notANumber = b[j]; 
     } 

    } 
} 

Вы должны вместо этого попытаться использовать:

float.Parse(b[j].Trim()); // Remove spaces and the parse it 

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

В любом случае вы знаете, в чем проблема.

0

Мы можем отфильтровать все, что не является числом с помощью Regex, хотя я уверен, что есть и другие альтернативы слишком

const string testData = @"1 1 6 4 12 5 5 3 4 1 67 3 2 1 2 1 0 0 1 0 0 1 0 0 1 
2 2 48 2 60 1 3 2 2 1 22 3 1 1 1 1 0 0 1 0 0 1 0 0 1 
1 4 12 4 21 1 4 3 3 1 49 3 1 2 1 1 0 0 1 0 0 1 0 1 0 
1 1 42 2 79 1 4 3 4 2 45 3 1 2 1 1 0 0 0 0 0 0 0 0 1 
2 1 24 3 49 1 3 3 4 4 53 3 2 2 1 1 1 0 1 0 0 0 0 0 1 
1 4 36 2 91 5 3 3 4 4 35 3 1 2 2 1 0 0 1 0 0 0 0 1 0 
1 4 24 2 28 3 5 3 4 2 53 3 1 1 1 1 0 0 1 0 0 1 0 0 1 
1 2 36 2 69 1 3 3 2 3 35 3 1 1 2 1 0 1 1 0 1 0 0 0 0 
1 4 12 2 31 4 4 1 4 1 61 3 1 1 1 1 0 0 1 0 0 1 0 1 0 
2 2 30 4 52 1 1 4 2 3 28 3 2 1 1 1 1 0 1 0 0 1 0 0 0 
2 2 12 2 13 1 2 2 1 3 25 3 1 1 1 1 1 0 1 0 1 0 0 0 1 
2 1 48 2 43 1 2 2 4 2 24 3 1 1 1 1 0 0 1 0 1 0 0 0 1 
1 2 12 2 16 1 3 2 1 3 22 3 1 1 2 1 0 0 1 0 0 1 0 0 1 
2 1 24 4 12 1 5 3 4 3 60 3 2 1 1 1 1 0 1 0 0 1 0 1 0"; 

    float[] floatArray = testData.Split(' ') 
           .Select(s => Regex.Match(s, @"(\d*)").Groups[1].Value) 
           .Select(Convert.ToSingle) 
           .ToArray(); 
+1

Это отличный ответ, но эти вопросы, похоже, являются домашними вопросами, и я сомневаюсь, что они находятся на уровне linq. Тем не менее, ответ хороший. – CodingYoshi

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