54 lines
1.6 KiB
C#
54 lines
1.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
namespace New_College.Common
|
|
{
|
|
public static class GenerateCardNumberHelper
|
|
{
|
|
public static string GenerateCardNumber(string bin, int length)
|
|
{
|
|
Random r = new Random() { };
|
|
int[] digits = new int[length];
|
|
var prefixDigits = bin.Select(p => p - '0').ToArray();
|
|
for (var i = 0; i < prefixDigits.Length; i++)
|
|
{
|
|
digits[i] = prefixDigits[i];
|
|
}
|
|
for (var i = bin.Length; i < length - 1; i++)
|
|
{
|
|
var digit = r.Next(0, 10);
|
|
digits[i] = digit;
|
|
}
|
|
digits[length - 1] = GenerateCheckDigit(digits[..(length - 1)]);
|
|
return string.Join(null, digits);
|
|
}
|
|
|
|
public static bool IsLuhnValid(int[] digits)
|
|
{
|
|
var sum = CalculateSum(digits, 1);
|
|
return sum % 10 == 0;
|
|
}
|
|
|
|
private static int CalculateSum(int[] digits, int bitShift = 0)
|
|
{
|
|
var sum = digits.Reverse()
|
|
.Select((digit, i) =>
|
|
(i + bitShift) % 2 == 0
|
|
? digit * 2 > 9 ? digit * 2 - 9 : digit * 2
|
|
: digit)
|
|
.Sum();
|
|
return sum;
|
|
}
|
|
|
|
public static int GenerateCheckDigit(int[] digits)
|
|
{
|
|
var sum = CalculateSum(digits);
|
|
var lastDigit = sum * 9 % 10;
|
|
return lastDigit;
|
|
}
|
|
}
|
|
|
|
}
|