ולידציה של אימייל, תעודת זהות וכרטיסי אשראי
-
מצ"ב קובץ של 3 מחלקות סטטיות שבודקות תקינות של מיילים, ת.ז. ואשראי.
עדכנתי את השינויים גם בקובץ..
ValidationNew.rar
העקרונות לת.ז. ואשראי נעשו ע"פ המבואר כאן, כאן, וכאן.
אני מצרף גם את הקוד ואשמח לשמוע הערות והארות!!
פונקציה לבדיקת ת.ז. (מתוקן):public static class ValidTehudatZehut { public static bool IsValidTZ(string numOfTeudatZehut) { int sumAll = 0; if (numOfTeudatZehut.Length > 9||string.IsNullOrEmpty(numOfTeudatZehut)) return false; else if(numOfTeudatZehut.Length<9) { while (numOfTeudatZehut.Length < 9) { numOfTeudatZehut = "0" + numOfTeudatZehut; } } for (int i = 9; i > 0; i--) { int x = Convert.ToInt32(numOfTeudatZehut.Substring(i-1, 1)); if (i % 2 == 0) { x = x * 2; if (x > 9) x = (x % 10) + 1; sumAll += x; } else { x = x * 1; sumAll += x; } } sumAll = sumAll % 10; if (sumAll % 10 > 0) return false; else return true; } }
הפונקציה שבודקת כרטיסי אשראי:
public static bool validCardGenery(string credit) { if(string.IsNullOrEmpty(credit)) { return false; } int sumAll = 0; //כרטיס בין 11 ל19 תוים נבדק לפי אלגוריתם המשמש לבדיקת תקינות של ת.ז. if (credit.Length > 10 && credit.Length < 20) { int y = 1;//משתנה שנועד להגדיר האם להכפיל ב1 או ב2 for (int i = credit.Length; i > 0; i--) { int x = Convert.ToInt32(credit.Substring(i-1, 1)); if (y % 2 == 0) { x = x * 2; if (x > 9) x = (x % 10) + 1; sumAll += x; y++; } else { x = x * 1; sumAll += x; y++; } } sumAll = sumAll % 10; if (sumAll % 10 > 0) return false; else return true; } //אם אורך המספר בין 8 ל9 תווים - מדובר בכרטיס מסוג ישראכרט והאלגוריתם שונה else if (credit.Length == 8 || credit.Length == 9) { int y = 1;//מספר הכפל כדי לבדוק אימות כרטיס //אם הכרטיס באורך 8 ספרות - מוסיף לו 0 משמאל לצורך תקינות הבדיקה if (credit.Length == 8) { credit = credit.Insert(0, "0"); } for (int i = credit.Length; i > 0; i--) { int x = Convert.ToInt32(credit.Substring(i, 1)); x = x * y; sumAll += x; y++; } if (sumAll % 11 == 0) return true; else return false; } //אם המספר ארוך מדי או קצר מדי - מדובר במס' שגוי else return false; } }
ולגבי הבדיקה של המייל כבר חפרנו בפורום מספיק :lol:
בהצלחה לכולם!!פורסם במקור בפורום CODE613 ב30/08/2015 21:16 (+03:00)
-
דבר נוסף אם תעודת הזהות קצרה מ9 ספרות נסה למלא את החסר באפסים ואז לבדוק אם זה תקין ולא מייד להחזיר שקר
אגב כל הקישורים שהבאת חסומים לי בנטפרי משום מה. כמדומה שבנתיב זה היה פתוח לי...
בכל אופן ראה כאן זו פונקציה שכתב ידידנו 'מאקרו'פורסם במקור בפורום CODE613 ב30/08/2015 21:34 (+03:00)
-
דבר נוסף אם תעודת הזהות קצרה מ9 ספרות נסה למלא את החסר באפסים ואז לבדוק אם זה תקין ולא מייד להחזיר שקר
אגב כל הקישורים שהבאת חסומים לי בנטפרי משום מה. כמדומה שבנתיב זה היה פתוח לי...
בכל אופן ראה כאן זו פונקציה שכתב ידידנו 'מאקרו'הנה קבצי PDF:
חישוב מספר כרטיס אשראי ישראכרט.pdf
חישוב מספר כרטיס אשראי.pdf
חישוב ספרת ביקורת של תעודת זהות ישראלית.pdf
לגבי ההערות - קיבלתי ואתקן בלנ"ד.
רק אין לי מושג מהו DBNULL, (כלומר אני מבין שהכוונה לערך NULL בדטה בייס, רק אינני יודע כיצד להתמודד איתו..
אשמח אם תוכל להסביר..)
לגבי הקישור שהבאת - שמחתי לראותו.. כי לפני שכתבתי את הפונקציות הנ"ל חיפשתי הרבה בגוגל ובפורום כדי למצוא חומר בנושא.. ודווקא את האשכול הזה לא ראיתי..
תודה!פורסם במקור בפורום CODE613 ב30/08/2015 21:49 (+03:00)
-
תכתוב כך:
אם (הפרמט הוא נאל || דיבינאל) אז {החזר שקר או זרוק חריג} מה שנראה לך;כתבתי כך:
if (numOfTeudatZehut.Length > 9||string.IsNullOrEmpty(numOfTeudatZehut)) return false;
אינני יודע איך לכתוב את הif לגבי הdbnull.
כמו כן, הפונקציה מקבלת סטרינג ולכן אינני מבין כיצד הסטרינג יכיל dbnull האם זה לא סוג שונה?פורסם במקור בפורום CODE613 ב30/08/2015 22:23 (+03:00)
-
חשבתי על עוד כמה שיפורים
public static bool IsValidTZ(string numOfTeudatZehut) { if (string.IsNullOrWhiteSpace(numOfTeudatZehut) || numOfTeudatZehut.Length > 9) return false; numOfTeudatZehut = numOfTeudatZehut.PadLeft(9, '0'); int sumAll = 0; for (int i = 9; i > 0; i--) { int x = 0; if (!int.TryParse(numOfTeudatZehut[i - 1].ToString(), out x)) return false; if (i % 2 == 0) { x = x * 2; if (x > 9) { x = (x % 10) + 1; } sumAll += x; } else { x = x * 1; sumAll += x; } } sumAll = sumAll % 10; if (sumAll % 10 > 0) return false; else return true; }
פורסם במקור בפורום CODE613 ב31/08/2015 00:48 (+03:00)
-
יש המון מה לשפר... וזה די מתסכל כי כמעט כל קוד שנכתוב בחיים נמצא מישהו שכתב יותר יעיל או פשוט...
רחמים השיפורים שלך נכונים מאוד, אבל אם כתבת חזרה קטע קוד איך נכשלת בשורה כמו 25... אני מוכרח לומר שגם הקוד המקורי של אברהם יפה מאוד, היה לוקח לי חתיכת זמן לכתוב ככה. אבל בגלל זה, אני פשוט לא כותב אני מעתיק ממה שכותבים אחרים... כמו פה
http://rosettacode.org/wiki/Luhn_test_of_credit_card_numbers ... המימוש של C# נמצא פה: http://rosettacode.org/wiki/Luhn_test_of_credit_card_numbers#C.23 בשורה אחת:return digits.Select((d, i) => i % 2 == digits.Length % 2 ? ((2 * d) % 10) + d / 5 : d).Sum() % 10;
פורסם במקור בפורום CODE613 ב31/08/2015 11:49 (+03:00)
-
@דוד ל.ט.
המימוש של C# נמצא פה: http://rosettacode.org/wiki/Luhn_test_of_credit_card_numbers#C.23 בשורה אחת:
return digits.Select((d, i) => i % 2 == digits.Length % 2 ? ((2 * d) % 10) + d / 5 : d).Sum() % 10;
תודה על המחמאות :lol:
אשמח אם תוכל לפרט את מהלכו של הקוד שהבאת.. אני מבין שזהו ביטוי למדא אבל אינני מבין כיצד בדיוק הוא מממש את האלגוריתם שלנו..
אשמח אפי סתם להסבר טכני מהו בדיוק עושה, כי אני לא מצליח להבין...תודה רבה!
ולגבי האפסים - אכן באלגוריתם שכתבתי אתה צודק, כי אני מתחיל מהסוף להתחלה. אולם, יש המממשים את הבדיקה ע"י שהפונקציה בהתחלה מבצעת היפוך למס' הת.ז. או הכרטיס (reverse), ואז יש חשיבות לאפסים, כיון שהבדיקה מתבצעת בצורה כזו שאת הספרה הכי ימנית מכפילים ב1 ואת הבאה אחריה ב2 וחוזר חלילה.. ואם נגיד המשתמש הקליד מס' בן 8 ספרות אז לאחר ההיפוך הוא יכפיל את הספרה הראשונה ב1 במקום ב2 והתוצאה תהיה שגויה.. (אני בניתי את האלגוריתם בסדר יורד וכך אני נותן לו בתחילה את האורך של הסטרינג וכל הזמן זה יורד, וכך בלי להפוך את הספרות הוא מתחיל לי מהספרה הימנית ואז אין את הבעיה הזאת.. אולם, אם מבצעים רוורס ועובדים בסדר עולה אז מאד חשוב לדעת מהי הספרה הראשונה).
פורסם במקור בפורום CODE613 ב31/08/2015 22:38 (+03:00)
-
ואחרי השאלה של צביקה (במייל....) המרתי את הקוד לבדיקת תקינות של כרטיס אשראי של אברהם לVBA עבורו.
הנה הוא (לא נגעתי בקוד של הC# ובשמות המשתנים. רק התאמתי לVBA)Public Function validCardGenery(credit As String) As Boolean If Len(credit & "") Then validCardGenery = False End If Dim sumAll As Integer Dim y As Integer Dim x As Integer Dim i As Integer 'כרטיס בין 11 ל19 תוים נבדק לפי אלגוריתם המשמש לבדיקת תקינות של ת.ז. If Len(credit) > 10 And Len(credit) < 20 Then y = 1 'משתנה שנועד להגדיר האם להכפיל ב1 או ב2 For i = Len(credit) To 1 Step -1 x = CInt(Mid(credit, i, 1)) If y Mod 2 = 0 Then x = x * 2 If x > 9 Then x = (x Mod 10) + 1 End If sumAll = sumAll + x y = y + 1 Else x = x * 1 sumAll = sumAll + x y = y + 1 End If Next sumAll = sumAll Mod 10 If sumAll Mod 10 > 0 Then validCardGenery = False Else validCardGenery = True End If 'אם אורך המספר בין 8 ל9 תווים - מדובר בכרטיס מסוג ישראכרט והאלגוריתם שונה ElseIf Len(credit) = 8 Or Len(credit) = 9 Then y = 1 'מספר הכפל כדי לבדוק אימות כרטיס 'אם הכרטיס באורך 8 ספרות - מוסיף לו 0 משמאל לצורך תקינות הבדיקה If Len(credit) = 8 Then credit = "0" & credit End If For i = Len(credit) To 1 Step -1 x = CInt(Mid(credit, i, 1)) x = x * y sumAll = sumAll + x y = y + 1 Next If sumAll Mod 11 = 0 Then validCardGenery = True Else validCardGenery = False End If Else 'אם המספר ארוך מדי או קצר מדי - מדובר במס' שגוי validCardGenery = False End If End Function
פורסם במקור בפורום CODE613 ב07/11/2015 23:02 (+02:00)