String.Format - 参数列表问题

3
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}"或"{0}{3}/{7}{1}"或用户想要的任何内容。

1
什么没有起作用?你看到了什么错误信息?你期望什么行为? - TJHeuvel
2
“this [is] not working”是程序员非常糟糕的错误报告。 - H H
6个回答

8

您必须至少提供与最高占位符值加一(占位符值从零开始)相同数量的参数(或至少具有相同数量的元素的数组)。

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

尝试这样做:

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

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

2
此外,该表达式指的是参数{8},即第9个参数,但只提供了8个。 - Daniel Rose
4
不是这样的。String.Format可以接受字符作为参数(这就是正在传递的内容)-它可以接受任何对象,如果没有得到字符串,string.Format将自己调用ToString()。因此,除非你正在做我没看到的其他事情,否则并不需要使用ToString()。你为什么认为需要使用ToString()? - Colin Mackay
1
你是否也删除了我的代码中所示的新字符串[] { ... }?我猜你没有,因此出现了“无法隐式将类型'char'转换为'string'”的错误。 - Colin Mackay
你所说的只有一个参数有效是错误的。因为该数组包含8个元素,所以参数0到7都是有效的。 - CodesInChaos
啊...好的。当单个附加参数是一个数组时,它仍然可以工作。但是,在正常情况下,它不会起作用。我会更正答案的这一部分。 - Colin Mackay
显示剩余4条评论

7

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

打印输出A B

然而,如果您尝试使用int[]进行类似的代码操作,它将无法工作:

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

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

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


3

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


作为字符串数组似乎也可以。 - CodesInChaos

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

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],依此类推。


-1

你必须使用:

nr.Substring(...)

在 String.Format([expression], [values]) 中,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()
});

你不需要新的string[]和ToStrings,因为Format接受params对象。 - Renatas M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接