String.Format-参数列表有问题

本文关键字:有问题 列表 参数 Format- String | 更新日期: 2023-09-27 17:57:52

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}",要么是用户想要的任何表达式。

String.Format-参数列表有问题

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

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

试试这个:

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

注意,我去掉了新字符串[]{…},我还去掉了所有的ToString(),因为它们不是必需的。

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[]确实进入了该代码的第一个变体。这是由于C#/.net中的数组协方差,它允许将string[]隐式转换为object[]

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

打印CCD_ 7。

另一方面,如果你用int[]尝试类似的代码,它不会起作用:

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

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

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

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

  • 您的参数编号为0..7,易于读取。但您使用的{8}:索引超出范围
  • 参数周围不需要new string[] { }。不过这是允许的
  • 如果没有new string[] { },您也不需要.ToString()调用

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

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

表达式中的ur索引必须始终以0开头。在我的示例中,如果要为字符串显示此值。。对于nr[4],u以0,1,2,3..0开始,对于nr[5]为1,对于nr[6]为2,对于nr[7]为3,等等。

您必须使用:

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