significa que not error correct c# .net exception-handling string.format

error - input string was not in a correct format que significa c#



String.Format: la cadena de entrada no estaba en un formato correcto (5)

Además de escapar de sus llaves, intente cambiar la definición de String[] a:

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"};

y cambie su String.Format a:

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

El siguiente código me sigue dando error diciendo que la cadena de entrada no estaba en el formato correcto, pero estoy bastante seguro de que está bien, ¿no?

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);

Alguien tiene alguna idea?

=== EDIT ===

después de corregir las llaves, un nuevo error de "Índice (basado en cero) debe ser mayor o igual a cero y menor que el tamaño de la lista de argumentos". es dado. el newData tiene 21 y más el id.toString (), debe ser exacto 22?


Escape el "{", "}" (duplicándolos) en la cadena de formato:

"{{ 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} }} }}"

Y tiene 22 elementos en la cadena de formato y 21 en la matriz.


Lo he dicho en los comentarios, pero creo que vale la pena una respuesta:

No use string.Format (en este caso). Es más lento y menos legible. Simplemente use concatenación de cadenas simples con nombres de variables significativos si necesita concatenaciones complejas; estas serán más rápidas y más fáciles de mantener. Más rápido porque para un número fijo de segmentos, plain + es la opción más rápida debido a las optimizaciones del compilador, y más fácil de mantener porque el lector puede ver el contexto dentro de la cadena en la que se coloca la variable.

Como señaló Hans Passant, parece que estás haciendo un literal de javascript. Si ese es el caso, considere un serializador Json.NET como Json.NET en Json.NET lugar:

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 })

Si bien Json.NET admite la serialización de DateTime , no hay un formato estandarizado para las fechas en JS, por lo que estos se serializan como cadenas en un formato iso 8601. Puede que esto no sea lo que necesita, de ahí las cadenas de fechas en este ejemplo; sin embargo, probaría el formato iso primero, ya que esa es la solución más simple.


Qué

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

does is: tratando de formatear los datos de String, utilizando solo 2 cadenas ... ¡no 22!
¿Cuáles? ... 1) id.ToString () y 2) newData.ToString ()
Eso es obviamente malo

¿Cómo puedes ver que este es el problema ...? Deje solo {0} y {1} en cadena de datos e imprímalo. Compila bien y vea lo que obtiene.
Por supuesto, tiene que usar {{en lugar de {donde quiere una cadena literal

Solución totalmente funcional:

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);


Tiene 21 elementos en newData pero usa 22 marcadores de posición (numerados del 0 al 21).

Además, debe escapar el literal ''{'' en sus datos de entrada

Las llaves de apertura y cierre se interpretan como el inicio y la finalización de un elemento de formato. En consecuencia, debe usar una secuencia de escape para mostrar una llave de apertura literal o llave de cierre. Especifique dos llaves de apertura ("{{") en el texto fijo para mostrar una llave de apertura ("{"), o dos llaves de cierre ("}}") para mostrar una llave de cierre ("}"). Las llaves en un elemento de formato se interpretan secuencialmente en el orden en que se encuentran. No se admite la interpretación de llaves anidadas.

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