String.Format:输入字符串的格式不正确

本文关键字:格式 不正确 字符串 输入 Format String | 更新日期: 2023-09-27 17:56:29

下面的代码一直给我错误,说输入字符串的格式不正确,但我很确定它是正确的,不是吗?

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?

String.Format:输入字符串的格式不正确

转义格式字符串中的"{"、"}"(通过复制它们):

"{{ 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 个元素。

newData 中有 21 个元素,但使用 22 个占位符(编号为 0 到 21)。

此外,您必须在输入数据中转义文字"{"

左大括号和

右大括号被解释为开始和结束格式项。因此,必须使用转义序列来显示文本左大括号或右大括号。在固定文本中指定两个左大括号 ("{{") 以显示一个左大括号 ("{"),或指定两个右大括号 ("}}") 以显示一个右大括号 ("}")。格式项中的大括号按遇到它们的顺序按顺序进行解释。不支持解释嵌套大括号。

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

我在评论中说了很多,但我认为现在值得回答:

不要使用string.Format (在这种情况下)。 它更慢,可读性也较差。 如果您需要复杂的串联,只需使用带有有意义的变量名称的纯字符串连接 - 这些将更快且更易于维护。 更快,因为对于固定数量的段,由于编译器优化,普通+是最快的选择,并且更易于维护,因为读者可以看到放置变量的字符串中的上下文。

正如 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 格式,因为这是最简单的解决方案。

除了转义大括号外,还可以尝试将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);

什么

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

做的是:尝试格式化字符串数据,只使用 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);