簡體   English   中英

如何驗證string.Format方法的格式

[英]How to validate format for string.Format method

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

讓我們考慮一下這個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這樣的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}搜索custFormat 如果找不到,則無效。

您可以使用try catch進行驗證,如果格式化,則除了您記錄信息並停止處理。

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

string message = ProcessMessage(custFormat, name);

您應該使用正則表達式進行語法檢查,也可以使用一些語義檢查。

正則表達式應為: (*{\\d+}*)+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM