11

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 中的值以避免异常。

4

4 回答 4

21

让我们考虑一下这个 API,如果它存在的话。目标是预先验证格式字符串,以确保String.Format不会抛出。

请注意,任何包含有效格式槽的字符串都是有效的格式字符串 - 如果您不尝试插入任何替换。

-> 所以我们需要传入我们希望替换的数字或参数

请注意,有大量不同的专业格式模式,每种格式都有特定类型的特定含义:http: //msdn.microsoft.com/en-us/library/system.string.format.aspx

尽管如果您传递与您的参数类型不匹配的格式字符串似乎String.Format不会抛出,但在这种情况下格式化程序变得毫无意义。例如String.Format("{0:0000}", "foo")

-> 因此,只有当您也传递了参数的类型时,这样的 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;
   }
}
于 2012-08-24T15:57:36.890 回答
0

只要您只传入 1 个参数,您就可以查找 search custFormatfor {0}。如果你没有找到它,它是无效的。

于 2012-08-24T15:23:23.247 回答
0

您可以使用 try catch 进行验证,如果格式抛出异常,则记录信息并停止处理。

try 
{ 
   string.Format(custFormat, params, .., .. , ..);
}
catch(FormatException ex)  
{ 
  throw ex;
}

string message = ProcessMessage(custFormat, name);
于 2012-08-24T15:23:48.600 回答
-1

您应该使用正则表达式进行语法检查,也可以使用一些语义检查。

正则表达式应该是:(*{\d+}*)+

于 2012-08-24T15:23:08.403 回答