string.Format具有以下方法签名
string.Format(format, params, .., .. , ..);
我想每次传递自定义格式
string custFormat = "Hi {0} ... {n} "; // I only care about numbers here, and want avoid {abdb}
string name = "Foo";
string message = ProcessMessage(custFormat, name);
public string ProcessMessage(custFormat, name)
{
return string.Format(custFormat, name);
}
我想在传递给ProcessMessage之前验证custFormat中的值以避免异常。
答案 0 :(得分:19)
让我们考虑一下这个API,如果它存在的话。目标是预先验证格式字符串,以确保String.Format
不会抛出。
请注意,不包含有效格式广告位的任何字符串都是有效的格式字符串 - 如果您不尝试插入任何替换。
- >所以我们需要传递我们期望替换的数字或算法
请注意,有大量不同的专业格式模式,每种模式都具有特定类型的特定含义:http://msdn.microsoft.com/en-us/library/system.string.format.aspx
虽然如果传递的格式字符串与您的参数类型不匹配,String.Format
似乎不会抛出,但在这种情况下,格式化程序变得毫无意义。例如String.Format("{0:0000}", "foo")
- >因此,只有在传递了args的类型时,这样的API才真正有用。
如果我们已经需要传入我们的格式字符串和类型数组(至少),那么我们基本上是String.Format
的签名,那么为什么不使用它并处理异常呢?如果像String.TryFormat
这样的东西存在会很好,但据我所知,它不存在。
此外,通过某些API进行预验证,然后在String.Format
中重新验证本身并不理想。
我认为最干净的解决方案可能是定义包装器:
public static bool TryFormat(string format, out string result, params Object[] args)
{
try
{
result = String.Format(format, args);
return true;
}
catch(FormatException)
{
return false;
}
}
答案 1 :(得分:0)
只要您只传入1个参数,就可以查找custFormat
的搜索{0}
。如果找不到,则无效。
答案 2 :(得分:0)
您可以使用try catch进行验证,如果格式化抛出异常则会记录信息并停止处理。
try
{
string.Format(custFormat, params, .., .. , ..);
}
catch(FormatException ex)
{
throw ex;
}
string message = ProcessMessage(custFormat, name);
答案 3 :(得分:-1)
您应该使用正则表达式进行语法检查,也可以使用一些语义检查。
正则表达式应为:(*{\d+}*)+