Thứ Bảy, 9 tháng 8, 2014

C# – Lấy thứ tự tuần trong năm

Bạn có thể sử dụng đoạn code sau để lấy ra thứ tự trong năm của tuần chứa 1 ngày được chỉ định cụ thể nào đó:
 /// <summary>
 /// Lấy ra thứ tự trong năm của tuần có chứa ngày nhập vào 
 /// với Culture mặc định là Culture hiện tại
 /// </summary>
 /// <param name="time">Ngày nhập vào</param>
 /// <returns>Trả về kiểu int là thứ tự của tuần trong năm</returns>
 public static int GetWeekOrderInYear(DateTime time)
 {
     CultureInfo myCI = CultureInfo.CurrentCulture;
     Calendar myCal = myCI.Calendar;
     CalendarWeekRule myCWR = myCI.DateTimeFormat.CalendarWeekRule;
     DayOfWeek myFirstDOW = myCI.DateTimeFormat.FirstDayOfWeek;
 
     return myCal.GetWeekOfYear(time, myCWR, myFirstDOW);
 }

C# – Lấy ngày đầu tiên trong tuần

Bạn có thể sử dụng đoạn code sau để lấy về ngày đầu tiên trong tuần chứa 1 ngày được nhập vào.
Lưu ý là class CultureInfo nằm trong namespace System.Globalization, nên bạn cần using nó để sử dụng.
 /// <summary>
 /// Lấy ra ngày đầu tiên trong tuần của ngày nhập vào 
 /// với Culture mặc định là Culture hiện tại
 /// </summary>
 /// <param name="dayInWeek">Ngày nhập vào</param>
 /// <returns>Ngày đầu tiên trong tuần</returns>
 public static DateTime GetFirstDayOfWeek(DateTime dayInWeek)
 {
     CultureInfo defaultCultureInfo = CultureInfo.CurrentCulture;
     return GetFirstDayOfWeek(dayInWeek, defaultCultureInfo);
 }
 /// <summary>
 /// Lấy ra ngày đầu tiên trong tuần của ngày nhập vào
 /// với một Culture cụ thể được truyền vào
 /// </summary>
 /// <param name="dayInWeek">Ngày nhập vào</param>
 /// <param name="cultureInfo">CultureInfo quy định các thông tin về Culture 
 /// ( định dạng ngày tháng, ngày bắt đầu trong tuần , ... )
 /// </param>
 /// <returns></returns>
 private static DateTime GetFirstDayOfWeek(DateTime dayInWeek, CultureInfo cultureInfo)
 {
     DayOfWeek firstDay = cultureInfo.DateTimeFormat.FirstDayOfWeek;
     DateTime firstDayInWeek = dayInWeek.Date;
     while (firstDayInWeek.DayOfWeek != firstDay)
     {
        firstDayInWeek = firstDayInWeek.AddDays(-1);
     }
     return firstDayInWeek;
 }
 /// <summary>
 /// Lấy ra ngày đầu tiên trong tuần của ngày nhập vào
 /// với 1 giá trị cụ thể của enum DayOfWeek chỉ định 
 /// ngày bắt đầu tuần là thứ mấy
 /// </summary>
 /// <param name="dayInWeek">Ngày nhập vào</param>
 /// <param name="dayOfWeek">enum chỉ định thứ bắt đầu tuần</param>
 /// <returns></returns>
 private static DateTime GetFirstDayOfWeek(DateTime dayInWeek, DayOfWeek dayOfWeek)
 {
     DateTime firstDayInWeek = dayInWeek.Date;
     while (firstDayInWeek.DayOfWeek != dayOfWeek)
     {
         firstDayInWeek = firstDayInWeek.AddDays(-1);
     }
     return firstDayInWeek;
 }

C# – Lấy ngày đầu tiên và cuối cùng trong tháng

Để lấy ra ngày đầu tiên trong tháng, bạn sử dụng đoạn code sau :
 /// <summary>
 /// Lấy ra ngày đầu tiên trong tháng có chứa 
 /// 1 ngày bất kỳ được truyền vào
 /// </summary>
 /// <param name="dtDate">Ngày nhập vào</param>
 /// <returns>Ngày đầu tiên trong tháng</returns>
 public static DateTime GetFirstDayOfMonth(DateTime dtInput)
 {
     DateTime dtResult = dtInput;
     dtResult = dtResult.AddDays((-dtResult.Day)+1);
     return dtResult;
 }
 /// <summary>
 /// Lấy ra ngày đầu tiên trong tháng được truyền vào 
 /// là 1 số nguyên từ 1 đến 12
 /// </summary>
 /// <param name="iMonth">Thứ tự của tháng trong năm</param>
 /// <returns>Ngày đầu tiên trong tháng</returns>
 public static DateTime GetFirstDayOfMonth(int iMonth)
 {
     DateTime dtResult = new DateTime(DateTime.Now.Year, iMonth, 1);
     dtResult = dtResult.AddDays((-dtResult.Day)+1);
     return dtResult;
 }

Đoạn code sau dùng để lấy ra ngày cuối cùng trong tháng :
 /// <summary>
 /// Lấy ra ngày cuối cùng trong tháng có chứa 
 /// 1 ngày bất kỳ được truyền vào
 /// </summary>
 /// <param name="dtInput">Ngày nhập vào</param>
 /// <returns>Ngày cuối cùng trong tháng</returns>
 public static DateTime GetLastDayOfMonth(DateTime dtInput)
 {
     DateTime dtResult = dtInput;
     dtResult = dtResult.AddMonths(1);
     dtResult = dtResult.AddDays(-(dtResult.Day));
     return dtResult;
 }
 /// <summary>
 /// Lấy ra ngày cuối cùng trong tháng được truyền vào
 /// là 1 số nguyên từ 1 đến 12
 /// </summary>
 /// <param name="iMonth"></param>
 /// <returns></returns>
 public static DateTime GetLastDayOfMonth(int iMonth)
 {
     DateTime dtResult = new DateTime(DateTime.Now.Year,iMonth,1);
     dtResult = dtResult.AddMonths(1);
     dtResult=dtResult.AddDays(-(dtResult.Day));
     return dtResult;
 }

Chủ Nhật, 3 tháng 8, 2014

Regular Expression

Cơ bản về Regular Expression trong C#

1. Giới thiệu:
RE là một ngôn ngữ cực mạnh dùng mô tả văn bản cũng như thao tác trên văn bản. Một RE thường được ứng dụng lên một chuỗi, nghĩa là lên một nhóm ký tự.
- Biểu thức chính quy được xây dựng dựa vào ký tự đại diện và những nguyên tắc sau :
Ký tự đại diện
[0-9] hay \d: đại diện 1 ký tự số từ 0 – 9
[0-9a-zA-Z_] hay \w: Đại diện ký tự aphabet hay ký tự gạch chân(hoa thường).
.(dấu chấm): đại diện ký tự bất kỳ.
\s : đại diện ký tự trắng (\r\n\t\f)
[xyz] đại diện 1 ký tự x,y hặc z.
\D: đại diện ký tự không thuộc \d
\W : đại diện ký tự không thuộc \w
[^xyz]: đại diện ký tự không thuộc xyz.
^: chỉ ra ký tự bắt đầu
$: chỉ ra ký tự kết thúc
Số lần xuất hiện :
{n,m}: ít nhất n lần, nhiều nhất m lần
{,m}: nhiều nhất m lần
{n,}: ít nhất n lần
{n}: chính xác n lần
?: tương đương {0,1}
* : tương dương {0,vô cùng}
+ : tương đương {1,vô cùng}
KHÔNG CHỈ ĐỊNH: 1 lần
Ví dụ :
// S chng minh nhân dân 9 ký t
String cmnd = "[0-9]{9}";

// s đin thoi 10 s hay 11 s
// bt đu bng 0
String PhoneNumber = "0\d{9,10}";

// S xe máy Sài Gòn : VD như 51-Z8-111.11
String MotoNumber = "5\d-[A-Z]\d-\d{3}.\d{2}";

// Đa ch Email
String Email = "\w+.@\w+.\w{2,4}";
- Khi đã hiểu được cách lập biểu thức chính qui chúng ta có thể kiểm tra một chuổi bất kỳ  xem có đúng định dạng hay không, cách đơn giản nhất là dùm phương thức IsMach().
bool Regex.IsMach(String input,String Pattern);

- Ví dụ :
// Kim tra đnh dng chui nhp vào là Email
String EmailPattern = "\w+.@\w+.\w{2,4}";
String input = "xxx@hotmail.com"

2. Các lớp để thao tác với Regular Expression trong .NET:
2.1.Regex:
Lớp Regex tượng trưng cho 1 regular expression bất di bất dịch (read-only). Nó cũng chứa một phương thức tĩnh (static) cho phép chúng ta sử dụng những lớp rex khác mà khỏi khởi tạo 1 đối tượng khác.

Sau đây, mình sẽ kể ra vài thành phần của lớp Regex này:
-Thuộc tính:
+Options: trả về những mục chọn được trao qua cho constructor Regex.
+RightToLeft: nhận 1 trị cho biết liệu xem regular expression dò tìm từ phải qua trái hay không
-Phương thức:
+GetGroupNames: trả về mảng gồm toàn tên nhóm thu lượm đối với RE.
+GetGroupNumbers: trả về mảng gồm toàn số nhóm thu lượm tương ứng với tên nhóm trên 1 mảng.
+GroupNameFromNumber: đi lấy tên nhóm tương ứng với số nhóm được khai báo.
+IsMatch: trả về trị bool cho biết liệu xem RE có tìm thấy một so khớp hay không trên pattern.
+Match: dò tìm trên pattern xem có xuất hiện một RE hay không rồi trả về kết quả chính xác như là một đối tượng Match duy nhất.
+Matches: dò tìm trên pattern xem tất cả các xuất hiện của một RE có hay không rồi trả về tất cả những so khớp thành công xem như Match được gọi nhiều lần.
+Replace: cho thay thế những xuất hiện của một pattern được định nghĩa bởi một RE bởi một chuỗi ký tự thay thế được chỉ định.
+Split: chẻ một pattern thành một mảng gồm những chuỗi con ở những vị trí được chỉ định bởi một so khớp trên RE
+Unescape: cho unescape bất cứ những ký tự nào được escape trên pattern.

2.2.Lớp Match:
Lớp này tượng trưng cho những kết quả duy nhất của một tác vụ so khớp (match) RE. 
Sử dụng thuộc tính Match.Access của lớp Match báo cho biết liệu xem đã tìm ra 1 so khớp hay chưa.
VD:
string chuoi = "123abcd456bdabc";
string pattern = "abc";
Regex myRegex = new Regex(pattern);
Match m = myRegex.Match(chuoi);
if (m.Success)
{
   WriteLine("Chuoi {0} o vi tri thu {1} trong chuoi", m.Value, m.Index);
}

3.Lớp MatchCollection
Hiểu nôm na MatchCollection là mảng các đối tượng Match