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}"
或用户想要的任何内容。
答案 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)
{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()
});