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
沒有留言:
張貼留言