bool.TryParse 一個美麗的誤會

bool.TryParse 一個美麗的誤會

找到一個深埋很久的bug,

一直以為以下的Code 若parse error 會傳回預設的true,

誤會: TryParse 失敗不會改變更參數b (大誤

            bool.TryParse(p, out b)

實際上是會的,故當parse error時,b 永遠是 false

正確的code如下

            b = bool.TryParse(p, out b) ? b : def;

測試碼:

            bool b = true;
            string s = bool.TryParse(p, out b) ? b.ToString() : "default " + def;
            if (p == null)
                p = "*** is null ***";
            textBox1.Text = textBox1.Text + "\r\n[" +p+ "] " + s;
            
        }

測試結果:(不分大小寫,但無法處理0或1, Y或N , OK或NO)

            testTryParse("", true);      // default true
            testTryParse("true", false); // true
            testTryParse("True", false); // true
            testTryParse("TRUE", false); // true

            testTryParse(null, false);   // default false
            testTryParse("", false);     // default false
            testTryParse("false", true); // false
            testTryParse("False", true); // false 
            testTryParse("FALSE", true); // false

            testTryParse("0", true);  // default true
            testTryParse("N", true);  // default true
            testTryParse("OK", true);  // default true

同理數值在TryParse時亦會變更參數為0

 

2010/11/19 再加碼一個簡易, 功能更多的轉換程式碼

            if(str==null)
                return false;
            bool rtnValue = false;
            rtnValue = bool.TryParse(str, out rtnValue) ? rtnValue :
                Regex.IsMatch(str, "^(?i:true|yes|y|1|ok|是)$");
            return rtnValue;
        }