String.Format - 参数列表问题

时间:2011-05-27 07:54:02

标签: c# string

string nr = "42245555" //just an example number
string expression = "{5}{6}/{7}{8}";

string res = String.Format(expression, new string[] {
nr[0].ToString(),nr[1].ToString(),
nr[2].ToString(), nr[3].ToString(), 
nr[4].ToString(), nr[5].ToString(), 
nr[6].ToString(), nr[7].ToString() 
});

为什么这不起作用,我该如何解决? 我希望表达式为"{5}{6}/{7}{8}" or "{0}{3}/{7}{1}"或用户想要的任何内容。

6 个答案:

答案 0 :(得分:8)

您必须提供至少相同数量的参数(或具有至少相同元素数量的数组)作为最高占位符值加1(占位符值为零索引)

最大占位符值{3},您必须提供至少四个附加参数。

试试这个:

string res = String.Format(expression,
  nr[0], nr[1],
  nr[2], nr[3], 
  nr[4], nr[5], 
  nr[6], nr[7]);

请注意,我拿出了新的字符串[] {...}我还取出了所有ToString(),因为它们不是必需的。

答案 1 :(得分:5)

Format的相关重载是:

public static string Format(string format,  params Object[] args)

这意味着你可以像这样调用它:

Format("...",new object[]{...})//Each array element is used

或直接将对象作为参数:

Format("...",object1, object2,...)//the objects are used

与我原先的想法不同,string[]确实会进入此代码的第一个变体。这是由于array covariance in C#/.net允许string[]隐式转换为object[]

string.Format("{0} {1}",new string[]{"A","B"})

打印A B

另一方面,如果您尝试使用int[]的类似代码,则无效:

string.Format("{0} {1}",new int[]{1,2})

将抛出异常,因为它进入第二个变体,因此int[]只能看到string.Format类型的单个参数。这种差异是因为数组协方差仅适用于具有引用类型成员的数组,如string而不是类型int。这意味着int[]无法隐式转换为object[]

因此原始代码的问题可能只是您使用了超出范围的索引{8}

答案 2 :(得分:3)

表达式中的参数必须从"{0}"开始,array必须包含与表达式相同数量的参数,并且必须是对象数组:new object[]{...

答案 3 :(得分:2)

  • 您的参数编号为0..7,便于回读。然而,您使用{8}:索引超出范围
  • 参数周围不需要new string[] { }。虽然这是允许的。
  • 没有new string[] { }您也不需要.ToString()来电。

答案 4 :(得分:0)

如果您的用户想要{5} {6} / {7} {8},那么您的代码将是:

String.Format("{0}{1}/{2}{3}",nr[4],nr[5],nr[6],nr[7]);

表达式中的索引必须始终以0开头。在我的例子中,如果你想为字符串显示这个...你从0,1,2,3 .. 0开始为nr [4],1为nr [5],2为nr [6],3为nr [7]等。

答案 5 :(得分:-1)

你必须使用:

nr.Substring(...)
String.Format([expression],[values])中的

表达式是一个字符串,表示带有占位符的字符串,而值插入这些占位符中。

<强>更新

string nr = "42245555" //just an example number   


string res = String.Format("{0}{1}/{2}{3}", new string[] {
nr[5].ToString(),nr[6].ToString(),
nr[7].ToString(), nr[8].ToString()
});

string res = String.Format("{0}{1}/{2}{3}", new string[] {
nr[0].ToString(),nr[3].ToString(),
nr[7].ToString(), nr[1].ToString()
});