הפורום נסגר!

במקומו נפתח פורום חדש, טוב יותר בהרבה מובנים. >>>>
אתם מוזמנים להצטרף אליו, בואו!

ההצטרפות לפורום התכנות החדש כרוכה בתשלום חודשי סמלי.

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

שיתוף של ידע פרקטי, ספריות, קוד, ודוקמנטציה ברוחב לב החברים היקרים.

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

הודעהעל ידי דוד ל.ט. » 31 אוגוסט 2015, 11:29

מילוי האפסים למשל הוא חסר טעם. כי איננו משנה כלל את התוצאה, לא כן?
סמל אישי של המשתמש
דוד ל.ט.
משתמש וותיק
 
הודעות: 2380
הצטרף: 12 יוני 2013, 11:02
שלח תודה: 1238 פעמים
קיבל תודה: 2019 פעמים

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

הודעהעל ידי avr416 » 31 אוגוסט 2015, 21:38

דוד ל.ט. כתב:המימוש של 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;

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

תודה רבה!

ולגבי האפסים - אכן באלגוריתם שכתבתי אתה צודק, כי אני מתחיל מהסוף להתחלה. אולם, יש המממשים את הבדיקה ע"י שהפונקציה בהתחלה מבצעת היפוך למס' הת.ז. או הכרטיס (reverse), ואז יש חשיבות לאפסים, כיון שהבדיקה מתבצעת בצורה כזו שאת הספרה הכי ימנית מכפילים ב1 ואת הבאה אחריה ב2 וחוזר חלילה.. ואם נגיד המשתמש הקליד מס' בן 8 ספרות אז לאחר ההיפוך הוא יכפיל את הספרה הראשונה ב1 במקום ב2 והתוצאה תהיה שגויה.. (אני בניתי את האלגוריתם בסדר יורד וכך אני נותן לו בתחילה את האורך של הסטרינג וכל הזמן זה יורד, וכך בלי להפוך את הספרות הוא מתחיל לי מהספרה הימנית ואז אין את הבעיה הזאת.. אולם, אם מבצעים רוורס ועובדים בסדר עולה אז מאד חשוב לדעת מהי הספרה הראשונה).
avr416
משתמש וותיק
 
הודעות: 853
הצטרף: 14 אפריל 2015, 15:53
שלח תודה: 1074 פעמים
קיבל תודה: 442 פעמים

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

הודעהעל ידי ClickOne » 07 נובמבר 2015, 23:02

ואחרי השאלה של צביקה (במייל....) המרתי את הקוד לבדיקת תקינות של כרטיס אשראי של אברהם לVBA עבורו.
הנה הוא (לא נגעתי בקוד של הC# ובשמות המשתנים. רק התאמתי לVBA)

vbnet code
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
קליקOne - קליק אחד ואתה מסודר!

המרחק בין להבין קוד כתוב, לבין לשפר אותו הוא אדיר, והמרחק ביניהם, לבין לכתוב פרויקט או אפילו להתחיל פרויקט בצורה טובה הוא עוד יותר גדול. [משפט חכם ששמעתי...]
ClickOne
משתמש וותיק
 
הודעות: 930
הצטרף: 29 דצמבר 2013, 09:50
שלח תודה: 1465 פעמים
קיבל תודה: 760 פעמים

הקודם

חזור אל שיתופיה

מי מחובר

משתמשים הגולשים בפורום זה: all bots ו 0 אורחים