implementing luhn algorithm using c#

后端 未结 9 446
醉梦人生
醉梦人生 2020-12-03 02:19

I am using following code to implement Luhn algorithm for credit card check in c# language but could not get the output to generate the check sum its showing validity: kindl

相关标签:
9条回答
  • 2020-12-03 02:56

    Your algorithm is correct, but you're testing it wrong way.

    I can see your sample input is from wiki page: Luhn algorithm. Difference is, they are calculating check digit for "7992739871X", where X is the check digit they're looking for. Your code validates number your already have!

    Change your input to "79927398713" and it will mark it as correct number.

    Update

    OK, I see where is the problem. You're not taking this part of algorithm right:

    From the rightmost digit, which is the check digit, moving left, double the value of every second digit;

    Your code takes every other digit, but not necessary starting from most left digit. Try this code:

    for (int i = 0; i < num.Length; i++)
    {
        d = Convert.ToInt32(num.Substring(num.Length - 1 - i, 1));
        if (a % 2 == 0)
            d = d * 2;
        if (d > 9)
            d -= 9;
        sum += d;
        a++;
    }
    
    var checkDigit = 10 - (sum % 10);
    
    0 讨论(0)
  • 2020-12-03 02:59

    You can do it very simply (reference),

        public static bool Mod10Check(string creditCardNumber)
        {              
            // check whether input string is null or empty
            if (string.IsNullOrEmpty(creditCardNumber))
            {
                return false;
            }
    
            int sumOfDigits = creditCardNumber.Where((e) => e >= '0' && e <= '9')
                            .Reverse()
                            .Select((e, i) => ((int)e - 48) * (i % 2 == 0 ? 1 : 2))
                            .Sum((e) => e / 10 + e % 10);
    
    
            return sumOfDigits % 10 == 0;
        }
    
    0 讨论(0)
  • 2020-12-03 03:03
    byte[] data = new byte[19];
    
    //fill the data[] 
    ...
    
    //use it
    if (checkByLuhn(data))
    {
      //check complete
    }
    ...
    private bool checkByLuhn(byte[] pPurposed)
    {
        int nSum = 0;
        int nDigits = pPurposed.Length;
        int nParity = (nDigits - 1) % 2;
        char[] cDigit = new char[] { '0','\0' };
    
        for (int i = nDigits; i > 0; i--)
        {
            cDigit[0] = (char)pPurposed[i - 1];
            int nDigit = (int)Char.GetNumericValue(cDigit[0]);
    
            if (nParity == i % 2)
            {
                nDigit = nDigit * 2;
            }
            nSum += nDigit / 10;
            nSum += nDigit % 10;
        }
        return 0 == nSum % 10;
    }
    
    0 讨论(0)
提交回复
热议问题