עמוד 1 מתוך 2

ולידציה של אימייל, תעודת זהות וכרטיסי אשראי

הודעהפורסם: 30 אוגוסט 2015, 20:16
על ידי avr416
מצ"ב קובץ של 3 מחלקות סטטיות שבודקות תקינות של מיילים, ת.ז. ואשראי.
עדכנתי את השינויים גם בקובץ..
ValidationNew.rar

העקרונות לת.ז. ואשראי נעשו ע"פ המבואר כאן, כאן, וכאן.
אני מצרף גם את הקוד ואשמח לשמוע הערות והארות!!
פונקציה לבדיקת ת.ז. (מתוקן):
csharp code
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;
}
}

הפונקציה שבודקת כרטיסי אשראי:
csharp code
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:
בהצלחה לכולם!!

Re: ולידציה של אימייל, תעודת זהות וכרטיסי אשראי

הודעהפורסם: 30 אוגוסט 2015, 20:32
על ידי רחמים
כדאי ששתי הפונקציות הנ"ל ידעו להגיב נכון גם במקרה שהפרמטר המועבר אליהן הוא NULL או DBNULL

Re: ולידציה של אימייל, תעודת זהות וכרטיסי אשראי

הודעהפורסם: 30 אוגוסט 2015, 20:34
על ידי רחמים
דבר נוסף אם תעודת הזהות קצרה מ9 ספרות נסה למלא את החסר באפסים ואז לבדוק אם זה תקין ולא מייד להחזיר שקר
אגב כל הקישורים שהבאת חסומים לי בנטפרי משום מה. כמדומה שבנתיב זה היה פתוח לי...
בכל אופן ראה כאן זו פונקציה שכתב ידידנו 'מאקרו'

Re: ולידציה של אימייל, תעודת זהות וכרטיסי אשראי

הודעהפורסם: 30 אוגוסט 2015, 20:49
על ידי avr416
רחמים כתב:דבר נוסף אם תעודת הזהות קצרה מ9 ספרות נסה למלא את החסר באפסים ואז לבדוק אם זה תקין ולא מייד להחזיר שקר
אגב כל הקישורים שהבאת חסומים לי בנטפרי משום מה. כמדומה שבנתיב זה היה פתוח לי...
בכל אופן ראה כאן זו פונקציה שכתב ידידנו 'מאקרו'

הנה קבצי PDF:
חישוב מספר כרטיס אשראי ישראכרט.pdf

חישוב מספר כרטיס אשראי.pdf

חישוב ספרת ביקורת של תעודת זהות ישראלית.pdf

לגבי ההערות - קיבלתי ואתקן בלנ"ד.
רק אין לי מושג מהו DBNULL, (כלומר אני מבין שהכוונה לערך NULL בדטה בייס, רק אינני יודע כיצד להתמודד איתו..
אשמח אם תוכל להסביר..)
לגבי הקישור שהבאת - שמחתי לראותו.. כי לפני שכתבתי את הפונקציות הנ"ל חיפשתי הרבה בגוגל ובפורום כדי למצוא חומר בנושא.. ודווקא את האשכול הזה לא ראיתי..
תודה!

Re: ולידציה של אימייל, תעודת זהות וכרטיסי אשראי

הודעהפורסם: 30 אוגוסט 2015, 20:55
על ידי רחמים
תכתוב כך:
אם (הפרמט הוא נאל || דיבינאל) אז {החזר שקר או זרוק חריג} מה שנראה לך;

Re: ולידציה של אימייל, תעודת זהות וכרטיסי אשראי

הודעהפורסם: 30 אוגוסט 2015, 21:23
על ידי avr416
רחמים כתב:תכתוב כך:
אם (הפרמט הוא נאל || דיבינאל) אז {החזר שקר או זרוק חריג} מה שנראה לך;

כתבתי כך:
csharp code
if (numOfTeudatZehut.Length > 9||string.IsNullOrEmpty(numOfTeudatZehut))
return false;

אינני יודע איך לכתוב את הif לגבי הdbnull.
כמו כן, הפונקציה מקבלת סטרינג ולכן אינני מבין כיצד הסטרינג יכיל dbnull האם זה לא סוג שונה?

Re: ולידציה של אימייל, תעודת זהות וכרטיסי אשראי

הודעהפורסם: 30 אוגוסט 2015, 22:03
על ידי רחמים
אכן אתה צודק, אם תעביר כפרמט DBNULL תקבל שגיאה כי חייב להעביר מחרוזת
לגבי הבדיקה שכתבת חייבים לבדוק קודם אם הוא NULL ורק אחר כך את האורך כי אם הוא באמת נאל ותנסה לבדוק אורך תקבל שגיאת זמן ריצה.

Re: ולידציה של אימייל, תעודת זהות וכרטיסי אשראי

הודעהפורסם: 30 אוגוסט 2015, 23:22
על ידי avr416
עדכנתי את הקובץ כדבריך!!
יישר כח!

Re: ולידציה של אימייל, תעודת זהות וכרטיסי אשראי

הודעהפורסם: 30 אוגוסט 2015, 23:48
על ידי רחמים
חשבתי על עוד כמה שיפורים
csharp code
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;
}

Re: ולידציה של אימייל, תעודת זהות וכרטיסי אשראי

הודעהפורסם: 31 אוגוסט 2015, 10:49
על ידי דוד ל.ט.
יש המון מה לשפר... וזה די מתסכל כי כמעט כל קוד שנכתוב בחיים נמצא מישהו שכתב יותר יעיל או פשוט...
רחמים השיפורים שלך נכונים מאוד, אבל אם כתבת חזרה קטע קוד איך נכשלת בשורה כמו 25... אני מוכרח לומר שגם הקוד המקורי של אברהם יפה מאוד, היה לוקח לי חתיכת זמן לכתוב ככה. אבל בגלל זה, אני פשוט לא כותב אני מעתיק ממה שכותבים אחרים... כמו פה
http://rosettacode.org/wiki/Luhn_test_o ... rd_numbers ... המימוש של C# נמצא פה: http://rosettacode.org/wiki/Luhn_test_o ... mbers#C.23 בשורה אחת:
csharp code
return digits.Select((d, i) => i % 2 == digits.Length % 2 ? ((2 * d) % 10) + d / 5 : d).Sum() % 10;

Fatal: ./cache/ is NOT writable.