C# — Преобразование строки в массив с плавающей точкой и игнорирование специальных символов

#c#

Вопрос:

Я пытаюсь создать простую программу для преобразования строки, такой как «[0.00, 2277, 1827, 1840, 1, 1247, 1238, 993]» к числовому массиву, над которым я затем смогу немного посчитать. Тем не менее, я получаю сообщение об ошибке, что «Входная строка была не в правильном формате».

Может ли кто-нибудь указать, где я ошибся? Извините, я здесь совсем новичок.

 using System;

namespace ColorConverter
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter color cal curve: ");
            string input12BitLine = Console.ReadLine();

            float[] fltCalTable = Array.ConvertAll(input12BitLine.Split('[', ' ', ',', ']'), float.Parse); //error is here

        }
    }
}
 

Комментарии:

1. Ввод здесь, по-видимому, JSON. Так почему бы не использовать синтаксический анализатор JSON для десериализации этого в float[] для вас?

Ответ №1:

Как это выглядит, вы передаете массив JSON в качестве входных данных. Используйте анализатор JSON для анализа входной строки JArray , а затем преобразуйте каждый элемент в float.

  using Newtonsoft.Json.Linq;
 ....
 var result = JArray.Parse(input12BitLine).Select(x => x.Value<float>());
 Console.WriteLine(string.Join(Environment.NewLine, result));
 

Альтернативные решения

Вы получаете эту ошибку, потому что она пытается проанализировать пустые строки, которые генерируются после разделения массива на '[', ' ', ',', ']' . Если вы хотите использовать все эти разделители, используйте StringSplitOptions.RemoveEmptyEntries их для удаления пустых строк из массива.

 float[] fltCalTable = Array.ConvertAll(input12BitLine.Split(new char[] {'[', ' ', ',', ']'}, StringSplitOptions.RemoveEmptyEntries), float.Parse); 
 

Сначала вам нужно Trim заключить квадратные скобки, а затем преобразовать их в плавающие, разделив каждый элемент с помощью , разделителя

 //Readable solution
string input12BitLine = Console.ReadLine();
var floatArray = input12BitLine.Trim(new char[]{ '[', ']'}) //Remove square brackets
    .Split(',')   //Split string by ','
    .Select(float.Parse)  //Parse each element to float
    .ToArray();   //Convert to Array
 

Или с помощью Array.ConvertAll()

 float[] fltCalTable = Array.ConvertAll(input12BitLine.Trim(new char[]{ '[', ']'}).Split(','), float.Parse);
 

POC: СКРИПКА .NET

Комментарии:

1. OP пытается проанализировать JSON вручную… Действительно не понимаю, почему вы поддерживаете их в этом странном путешествии.

2. так ли это? Я вижу, что ОП считывает строку с консоли? да, ОП, возможно, печатает Джаррея на консоли

3. Я согласен, что очень необычно иметь «[ ]» во входных данных, введенных пользователем… но это то, о чем просит ОП…

4. @AlexeiLevenkov, я обновил свой ответ, чтобы использовать JArray и преобразовать его в float

Ответ №2:

Вам нужно отфильтровать пустые строки.

 float[] fltCalTable = Array.ConvertAll(input12BitLine.Split('[', ' ', ',', ']').Where(x => !string.IsNullOrWhiteSpace(x)).ToArray(), float.Parse);
 

Комментарии:

1. Вы можете использовать StringSplitOptions.RemoveEmptyEntries значение перечисления вместо предложения Where. Это улучшит ваш запрос linq, пропустив еще один цикл for