[英]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.