วันนี้ไปเจอบทความหนึ่งที่พูดถึงการทดสอบความเร็วในการประมวลตรวจสอบข้อความที่เป็นตัวเลข(Numeric) จึงเอามาเขียนใน Blog เพื่อเพิ่มความเข้าใจ บางครั้งเราเห็นว่ามันเป็นเรื่องเล็กๆแต่การเขียนโปรแกรมที่ดีนั้น คงหนีไม่พ้นการเขียนโปรแกรมของเราให้ใช้ทรัพยากรเครื่องน้อยที่สุด
ใน .Net มีวิธีในการตรวจสอบข้อมูลที่เป็นตัวเลขหลายวิธี ในที่นี้นำมาทดสอบ 6 วิธีด้วยกัน คือ
#1. Regular Expression - คือการนำ Regular Expression (^(\d*\.?\d*)$) มาใช้เพื่อตรวจสอบหาตัวเลขระหว่าง 0-9
148 public static System.Text.RegularExpressions.Regex IsNumeric =
149 new System.Text.RegularExpressions.Regex(@"^(\d*\.?\d*)$",
150 System.Text.RegularExpressions.RegexOptions.Compiled &
151 System.Text.RegularExpressions.RegexOptions.CultureInvariant);
#2. Try ToDouble & Catch - เป็นการเรียกใช้ System.Convert.ToDouble ซึ่งอยู่ภายใต้คำสั่ง try-catch ถ้าคืนค่ากลับเป็นจริงแสดงว่าไม่มีข้อผิดพลาด นั้นก็คือเป็นตัวเลข แต่ถ้าเกิดมี error แสดงว่า ข้อมูลที่ได้รับนั้นไม่ใช่ตัวเลข
160 public bool TryToDouble(object expression)
161 {
162 try
163 {
164 expression = Convert.ToDouble(expression);
165 return true;
166 }
167 catch
168 {
169 return false;
170 }
171 }
#3. Try Parse & Catch - เป็นการเรียกใช้ System.Double.Parse ซึ่งอยู่ภายใต้คำสั่ง try-catch ถ้าคืนค่ากลับเป็นจริงแสดงว่าไม่มีข้อผิดพลาด นั้นก็คือเป็นตัวเลข แต่ถ้าเกิดมี error แสดงว่า ข้อมูลที่ได้รับนั้นไม่ใช่ตัวเลข
180 public bool TryParse(object expression)
181 {
182 try
183 {
184 expression = double.Parse(expression.ToString());
185 return true;
186 }
187 catch
188 {
189 return false;
190 }
191 }
#4. Double.TryParse - ใช้ System.Double.TryParse เพื่อตรวจสอบข้อมูลที่เป็นตัวเลข จนกว่าจะคืนค่าที่เป็นจริงแสดงว่ามีการเปลี่ยนแปลงค่าที่เป็นตัวเลขสำเร็จ
262 isNumeric = double.TryParse(this.InputValue.Text,
263 System.Globalization.NumberStyles.AllowDecimalPoint,
264 System.Globalization.NumberFormatInfo.CurrentInfo,
265 out result);
#5. VisualBasic IsNumeric - เป็นการเรียกใช้ Namespace ของMicrosoft.VisualBasic.Information.IsNumeric เพื่อตรวจสอบข้อมูลที่เป็นตัวเลข
269 isNumeric = Microsoft.VisualBasic.Information.IsNumeric (this.InputValue.Text);
#6. Incremental Char - เป็นการวน loop String ทีล่ะตัวแล้วนำมาเปรียบเทียบว่าเป็นตัวเลขหรือเปล่าโดยใช้ System.Char.IsNumber
200public bool IncrementalChar(string expression)
201 {
202 bool hasDecimal = false;
203 for(int i=0;i<expression.Length;i++)
204 {
205 // Check for decimal
206 if (expression[i] == '.')
207 {
208 if (hasDecimal) // 2nd decimal
209 return false;
210 else // 1st decimal
211 {
212 // inform loop decimal found and continue
213 hasDecimal = true;
214 continue;
215 }
216 }
217 // check if number
218 if(!char.IsNumber(expression[i]))
219 return false;
220 }
221 return true;
222 }
เครื่องที่ใช้ในการทดสอบ
Dell Inspiron 8500 with a Pentium 4-M 2.2GHz CPU, 1GB DDR PC2100 RAM, and 40GB 5400RPM IDE HD
ผลการทดสอบ กรณีที่ข้อมูลที่ตรวจสอบ "ถูกต้อง"

ผลการทดสอบ กรณีที่ข้อมูลที่ตรวจสอบ "ไม่ถูกต้อง"
ผลที่ได้ คงเปรียบเทียบกันเห็นได้จากภาพซึ่งแน่นอนครับวิธีที่ 6 ใช้เวลาในการประมวลผลน้อยที่สุดทั้ง 2 กรณี ถ้าอยากอ่านรายละเอียดเพิ่มเติมอ่านได้ที่นี้
http://aspalliance.com/80
Code สำหรับคนเขียน Vb สำหรับวิธีที่ 6
267 Private Function IsNumeric(ByVal expression As String) As Boolean
268 Dim hasDecimal As Boolean = False
269 Dim i As Char
270 For Each i In expression
271 ' Check for decimal
272 If i = "." Then
273 If hasDecimal Then
274 Return False
275 Else
276 hasDecimal = True
277 End If
278 End If
279 ' check if number
280 If Not Char.IsNumber(i) Then
281 Return False
282 End If
283 Next
284 Return True
285 End Function