דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. ולידציה של אימייל, תעודת זהות וכרטיסי אשראי

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

מתוזמן נעוץ נעול הועבר ארכיון code613m
13 פוסטים 4 כותבים 915 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • A מנותק
    A מנותק
    avr416
    כתב ב נערך לאחרונה על ידי
    #1

    מצ"ב קובץ של 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)

    תגובה 1 תגובה אחרונה
    3
    • רחמיםר מנותק
      רחמיםר מנותק
      רחמים מורחק
      כתב ב נערך לאחרונה על ידי
      #2

      כדאי ששתי הפונקציות הנ"ל ידעו להגיב נכון גם במקרה שהפרמטר המועבר אליהן הוא NULL או DBNULL

      פורסם במקור בפורום CODE613 ב30/08/2015 21:32 (+03:00)

      תגובה 1 תגובה אחרונה
      0
      • רחמיםר מנותק
        רחמיםר מנותק
        רחמים מורחק
        כתב ב נערך לאחרונה על ידי
        #3

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

        פורסם במקור בפורום CODE613 ב30/08/2015 21:34 (+03:00)

        תגובה 1 תגובה אחרונה
        1
        • A מנותק
          A מנותק
          avr416
          כתב ב נערך לאחרונה על ידי
          #4

          @רחמים

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

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

          פורסם במקור בפורום CODE613 ב30/08/2015 21:49 (+03:00)

          תגובה 1 תגובה אחרונה
          0
          • רחמיםר מנותק
            רחמיםר מנותק
            רחמים מורחק
            כתב ב נערך לאחרונה על ידי
            #5

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

            פורסם במקור בפורום CODE613 ב30/08/2015 21:55 (+03:00)

            תגובה 1 תגובה אחרונה
            0
            • A מנותק
              A מנותק
              avr416
              כתב ב נערך לאחרונה על ידי
              #6

              @רחמים

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

              כתבתי כך:

              if (numOfTeudatZehut.Length > 9||string.IsNullOrEmpty(numOfTeudatZehut))
                              return false;
              

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

              פורסם במקור בפורום CODE613 ב30/08/2015 22:23 (+03:00)

              תגובה 1 תגובה אחרונה
              0
              • רחמיםר מנותק
                רחמיםר מנותק
                רחמים מורחק
                כתב ב נערך לאחרונה על ידי
                #7

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

                פורסם במקור בפורום CODE613 ב30/08/2015 23:03 (+03:00)

                תגובה 1 תגובה אחרונה
                2
                • A מנותק
                  A מנותק
                  avr416
                  כתב ב נערך לאחרונה על ידי
                  #8

                  עדכנתי את הקובץ כדבריך!!
                  יישר כח!

                  פורסם במקור בפורום CODE613 ב31/08/2015 00:22 (+03:00)

                  תגובה 1 תגובה אחרונה
                  0
                  • רחמיםר מנותק
                    רחמיםר מנותק
                    רחמים מורחק
                    כתב ב נערך לאחרונה על ידי
                    #9

                    חשבתי על עוד כמה שיפורים

                    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)

                    תגובה 1 תגובה אחרונה
                    1
                    • dovidD מחובר
                      dovidD מחובר
                      dovid ניהול
                      כתב ב נערך לאחרונה על ידי
                      #10

                      יש המון מה לשפר... וזה די מתסכל כי כמעט כל קוד שנכתוב בחיים נמצא מישהו שכתב יותר יעיל או פשוט...
                      רחמים השיפורים שלך נכונים מאוד, אבל אם כתבת חזרה קטע קוד איך נכשלת בשורה כמו 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)

                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                      תגובה 1 תגובה אחרונה
                      3
                      • dovidD מחובר
                        dovidD מחובר
                        dovid ניהול
                        כתב ב נערך לאחרונה על ידי
                        #11

                        מילוי האפסים למשל הוא חסר טעם. כי איננו משנה כלל את התוצאה, לא כן?

                        פורסם במקור בפורום CODE613 ב31/08/2015 12:29 (+03:00)

                        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                        בכל נושא אפשר ליצור קשר dovid@tchumim.com

                        תגובה 1 תגובה אחרונה
                        0
                        • A מנותק
                          A מנותק
                          avr416
                          כתב ב נערך לאחרונה על ידי
                          #12

                          @דוד ל.ט.

                          המימוש של 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)

                          תגובה 1 תגובה אחרונה
                          1
                          • clickoneC מנותק
                            clickoneC מנותק
                            clickone
                            כתב ב נערך לאחרונה על ידי
                            #13

                            ואחרי השאלה של צביקה (במייל....) המרתי את הקוד לבדיקת תקינות של כרטיס אשראי של אברהם ל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)

                            אין טסט כמו פרודקשן.

                            המייל שלי urivpn@gmail.com

                            תגובה 1 תגובה אחרונה
                            3

                            בא תתחבר לדף היומי!
                            • התחברות

                            • אין לך חשבון עדיין? הרשמה

                            • התחברו או הירשמו כדי לחפש.
                            • פוסט ראשון
                              פוסט אחרון
                            0
                            • דף הבית
                            • קטגוריות
                            • פוסטים אחרונים
                            • משתמשים
                            • חיפוש
                            • חוקי הפורום