2020年3月20日 星期五

[研究][ASP.NET][WebForm] 日期 正規表示式驗證 RegularExpressionValidator

[研究][ASP.NET][WebForm] 日期 的 正規表示式驗證 RegularExpressionValidator

2020-03-20
2020-03-26 更新

注意,各種語言 (C#、JavaScript、PHP、、、) 的規則運算式的規定不保證完全相同。


<asp:TextBox ID="MyDateTextBox" runat="server" Text='<%# Bind("MyDate") %>' CssClass="date" AutoComplete="Off" />

<asp:RequiredFieldValidator ID="RequiredFieldValidator_MyDateTextBox" ControlToValidate="MyDateTextBox" runat="server" ErrorMessage="必填" ForeColor="Red" ValidationGroup="InsertGroup" Display="Dynamic"></asp:RequiredFieldValidator>

<asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="MyDateTextBox" runat="server" ErrorMessage="日期格式錯誤" ForeColor="Red" ValidationExpression="(19|20)[0-9]{2}[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])" ValidationGroup="InsertGroup" Display="Dynamic"></asp:RegularExpressionValidator>

<asp:CompareValidator ID="CompareValidator1" ControlToValidate="MyDateTextBox" runat="server" ErrorMessage="日期不合理" ForeColor="Red" Operator="DataTypeCheck" Type="Date" ValidationGroup="InsertGroup" Display="Dynamic"></asp:CompareValidator>


把兩個 Validator 的 Display 屬性設定為 Dynamic 錯誤訊息就不會偏移了

檢查日期型態 (YYYY/MM/DD)
(19|20)[0-9]{2}[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])

檢查日期型態 (YYYY/MM/DD、YYYY/MM/D、YYYY/M/DD、YYYY/M/D )
(19|20)[0-9]{2}[- /.]([1-9]|0[1-9]|1[012])[- /.]([1-9]|0[1-9]|[12][0-9]|3[01])

年限制 1900~2099年,月限制1~12月,或01~12月,日限制 1~31或01~31。

CompareValidator 檢查是否合理,例如:2020/03/31 是不合理的。

只能輸入長度為3的字符:「^.{3}$」

********************************************************************************
.cs 可以用這樣檢查資料是否可以轉成日期格式,但是能轉換的資料可能超乎一般的想像,
例如輸入:1、100、1/1、2020、、、有些看起來不像年月日的,可能都可以轉換,不是很建議。

DateTime temp;
if (DateTime.TryParse(myDate, out temp))
{
 
}
else
{
    Label_ExportImportMSG.Text = "<font color=red>「完成日期」填寫的非日期格式資料。</font>";
    return;
}


********************************************************************************

在 .cs 中可以這樣寫

// 檢查「日期」格式 YYYY/MM/DD,YYYY/M/D 不行
                            string regularExpressions = @"^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$|^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$";

// YYYY/MM/DD、YYYY/MM/D、YYYY/M/DD、YYYY/M/D 都可以,但 9999/9/99 會過
// 2020/3/1 上午 12:00:00 實際測試也會過 ( Why ?) DateTime.TryParse 得到相同值;插入 SQL Server 會出現【從字元字串轉換成日期及/或時間時,轉換失敗。】錯誤,要想辦拿拿掉【上午】兩字
                            // string regularExpressions = @"^(\d{4}(?:/\d{1,2}){2})";

Match  m = Regex.Match(myDate, regularExpressions);

                        if (m.Success)
                        {
                            //return true;
                        }
                        else
                        {
                            Label_ExportImportMSG.Text = "<font color=red>格式為YYYY/MM/DD,例如:2020/1/1請填寫2020/01/01。</font>";
                            return;
                        }

********************************************************************************

結合使用,在 .cs 中可以這樣寫

protected void Button1_Click(object sender, EventArgs e)
        {
            //string regularExpressions = @"^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$|^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$";
            string regularExpressions = @"^(\d{4}(?:/\d{1,2}){2})";
            string myDate = TextBox1.Text.Trim();
            Match m = Regex.Match(myDate, regularExpressions);
            if (m.Success)
            {
                Label1.Text = "Ok";
                DateTime temp;
                if (DateTime.TryParse(myDate, out temp))
                {
                                //mainlandPurchaseDate=temp.ToString("yyyy/MM/dd HH:mm:ss");
                                // Excel 儲存格格式若為【日期】,ClosedXML 對「2020/3/1」回傳「2020/3/1 上午 00:00:00」
                                // Excel 儲存格格式若為【文字】,ClosedXML 對「2020/3/1」回傳「2020/3/1」
                                // 插入 SQL Server 會出現【從字元字串轉換成日期及/或時間時,轉換失敗。】錯誤,要想辦拿拿掉【上午】兩字
                                mainlandPurchaseDate = temp.ToString("yyyy/MM/dd");
                }
                else
                {
                    Label1.Text = "<font color=red>「完成日期」填寫日期不合理。</font>";
                    return;
                }
            }
            else
            {
                Label1.Text = "<font color=red>「完成日期」填寫的非日期格式資料。</font>";
                return;
            }
        }
            


(完)

相關

[研究] [C#] [ASP.NET] 除去日期格式中的 "上午"、"下午"
http://shaurong.blogspot.com/2017/01/c-aspnet.html

Regex 類別
https://docs.microsoft.com/zh-tw/dotnet/api/system.text.regularexpressions.regex?view=netframework-4.8

Regex.IsMatch 方法
https://docs.microsoft.com/zh-tw/dotnet/api/system.text.regularexpressions.regex.ismatch?view=netframework-4.8

規則運算式語言 - 快速參考
https://docs.microsoft.com/zh-tw/dotnet/standard/base-types/regular-expression-language-quick-reference

規則運算式範例:變更日期格式
https://docs.microsoft.com/zh-tw/dotnet/standard/base-types/regular-expression-example-changing-date-formats

如何確認字串是否為有效的電子郵件格式
https://docs.microsoft.com/zh-tw/dotnet/standard/base-types/how-to-verify-that-strings-are-in-valid-email-format

沒有留言:

張貼留言