下面的代码一直给我一个错误,说输入字符串格式不正确,但我很确定它是对的,不是吗?
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?
答案 0 :(得分:71)
以格式字符串:
转义“{”,“}”(通过复制它们)"{{ 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个元素。
答案 1 :(得分:8)
newData 中有21个元素,但使用22个占位符(编号为0到21)。
此外,您必须在输入数据中删除文字“{”
打开和关闭大括号被解释为开始和结束格式项。因此,您必须使用转义序列来显示文字左括号或右括号。在固定文本中指定两个开括号(“{{”)以显示一个左括号(“{”)或两个右括号(“}}”)以显示一个右括号(“}”)。格式项中的大括号按其遇到的顺序依次解释。不支持解释嵌套大括号。
答案 2 :(得分:2)
除了转义大括号外,还可以尝试将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);
答案 3 :(得分:2)
我在评论中已经说了很多,但我认为现在值得回答:
请勿使用string.Format
(在本例中)。它更慢,可读性更低。如果需要复杂的连接,只需使用带有意义的变量名称的纯字符串连接 - 这些连接速度更快,更易于维护。更快,因为对于固定数量的段,由于编译器优化,plain +
为the fastest option,并且更易于维护,因为读者可以看到放置变量的字符串中的上下文。
正如Hans Passant所说,看起来你正在制作一个javascript文字。如果是这种情况,请考虑使用Json.NET之类的Json序列化器:
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格式,因为这是最简单的解决方案。
答案 4 :(得分:1)
什么
String cmd = String.Format(data, id.toString(), newData);
的确如此:尝试格式化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);