Подтвердить что ты не робот

String.Format: строка ввода не была в правильном формате

Следующий код продолжает давать мне ошибку: строка ввода не была в правильном формате, но я уверен, что это правильно, не так ли?

int id = 112;

String[] newData = { "1", "2", "21", "reidb", "reidb", "reidb", "reidb", "aa", 
                      "Some description", "11", "2012-02-28", "2012-01-29", "true", "1", "1", 
                      "true", "note note note", "true", "1", "2011-12-03", "45"};

String data = "{ cmd: \"save magellan deal\", data: { id: {0} , AId: {1}, " +
            "CId: {2}, CCId:{3}, LA: \"{4}\", BA: \"{5}\" , " +
            "LSA: \"{6}\" , BSA: \"{7}\" , \"path: \"{8}\"," +
            "dscp: \"{9}\", SI: \"{10}\", CD: \"{11}\", " +
            "period: \"{12}\", IsStatic: {13}, LSD: {14}, LC: {15}, RB: {16},} " +
            "Notes: \"{17}\", IsEE: {18}, RBy: {19}, DPDD: \"{20}\", LId: {21} } }";


String cmd = String.Format(data, id.toString(), newData);

Любые идеи?

=== РЕДАКТИРОВАТЬ ===

после фиксации фигурных скобок новая ошибка "Индекс (на основе нуля) должна быть больше или равна нулю и меньше, чем размер списка аргументов". дано. newData имеет 21 и плюс id.toString(), должен быть точным 22?

4b9b3361

Ответ 1

Побегите "{", "}" (путем их дублирования) в строке формата:

"{{ cmd: \"save magellan deal\", data: {{ id: {0} , AId: {1}, " +
"CId: {2}, CCId:{3}, LA: \"{4}\", BA: \"{5}\" , " +
"LSA: \"{6}\" , BSA: \"{7}\" , \"path: \"{8}\"," +
"dscp: \"{9}\", SI: \"{10}\", CD: \"{11}\", " +
"period: \"{12}\", IsStatic: {13}, LSD: {14}, LC: {15}, RB: {16},}} " +
"Notes: \"{17}\", IsEE: {18}, RBy: {19}, DPDD: \"{20}\", LId: {21} }} }}"

И у вас есть 22 элемента в строке формата и 21 в массиве.

Ответ 2

У вас есть 21 элемент в newData, но используйте 22 заполнителя (с номерами от 0 до 21).

Кроме того, вы должны избегать букв '{' в ваших входных данных

Открытие и закрытие фигурных скобок интерпретируются как начало и конец элемента формата. Следовательно, вы должны использовать escape-последовательность для отображения литеральной открывающей скобки или закрывающей скобки. Задайте две открывающиеся фигурные скобки ( "{{" ) в фиксированном тексте, чтобы отобразить одну открывающую скобу ( "{" ) или две закрывающие фигурные скобки ( "}}" ), чтобы отобразить одну закрывающую фигуру ( "}" ). Скобки в элементе формата интерпретируются последовательно в том порядке, в котором они встречаются. Интерпретация вложенных фигурных скобок не поддерживается.

http://msdn.microsoft.com/en-us/library/txafckwd.aspx

Ответ 3

В дополнение к экранированию фигурных скобок также попробуйте изменить определение String[] на:

int id = 112;

String[] newData = {id.ToString(), "1", "2", "21", "reidb", "reidb", "reidb", "reidb", "aa", 
          "Some description", "11", "2012-02-28", "2012-01-29", "true", "1", "1", 
          "true", "note note note", "true", "1", "2011-12-03", "45"};

и измените ваш String.Format на:

String cmd = String.Format(data,newData);

Ответ 4

Я так сказал в комментариях, но думаю, что сейчас стоит ответить:

Не используйте string.Format (в данном случае). Это медленнее и менее читаемо. Просто используйте сплошную конкатенацию строк со значимыми именами переменных, если вам нужны сложные конкатенации - они будут быстрее и удобнее обслуживать. Быстрее, потому что для фиксированного количества сегментов plain + самый быстрый вариант из-за оптимизации компилятора и более ремонтопригодный, поскольку читатель может видеть контекст в строке, в которую помещена переменная.

Как отметил Ханс Пассант, похоже, что вы делаете букву javascript. В этом случае рассмотрим сериализатор Json, например Json.NET:

JsonConvert.SerializeObject(new {
    cmd = "save magellan deal",
    data = new {
        id = 12345, AId = 1, CId = 2, CCId = 21,
        LA = "reidb", BA = "reidb", LSA = "reidb", BSA = "reidb",
        path = "aa", dscp = "Some description", SI = 11,
        CD = "2012-02-28", period = "2012-01-29",
        IsStatic = true, LSD = 1, LC = 1, RB = true,
    },
    Notes = "note note note",
    IsEE = true, RBy = 1, DPDD = "2011-12-03", LId = 45
})

Хотя Json.NET поддерживает сериализацию DateTime, в JS нет стандартизованного формата дат, поэтому они сериализуются как строки в формате iso 8601. Возможно, это не то, что вам нужно, поэтому строки даты в этом примере - я сначала попробую формат iso, поскольку это самое простое решение.

Ответ 5

Что

String cmd = String.Format(data, id.toString(), newData);  

is is: пытается форматировать данные String, используя только 2 строки.. не 22!!
Какие?... 1) id.ToString() и 2) newData.ToString()
Это явно неправильно.

Как вы можете видеть, что это проблема...? Оставьте только {0} и {1} в строке данных и распечатайте его. Он компилируется в порядке и видит, что вы получаете.
Конечно, вы должны использовать {{вместо {где вам нужен строковый литерал

Полностью работающее решение:

int id = 112;

String[] newData = { id.ToString(),"1", "2", "21", "reidb", "reidb", "reidb", "reidb", "aa", 
                  "Some description", "11", "2012-02-28", "2012-01-29", "true", "1", "1", 
                  "true", "note note note", "true", "1", "2011-12-03", "45"};

String data = "{{ cmd: \"save magellan deal\", data: {{ id: {0} , AId: {1}, " +
                    "CId: {2}, CCId:{3}, LA: \"{4}\", BA: \"{5}\" , " +
                    "LSA: \"{6}\" , BSA: \"{7}\" , \"path: \"{8}\"," +
                    "dscp: \"{9}\", SI: \"{10}\", CD: \"{11}\", " +
                    "period: \"{12}\", IsStatic: {13}, LSD: {14}, LC: {15}, RB: {16},}} " +
                    "Notes: \"{17}\", IsEE: {18}, RBy: {19}, DPDD: \"{20}\", LId: {21} }} }}";


String cmd = String.Format(data, newData);