BAD
Я буквально не могу поверить, как много грязных реализаций существует.
IDAutomation имеет .NET-сборку с функцией MOD10 () для создания, но, похоже, она не работает. В Reflector код слишком длинный для того, что он должен делать в любом случае.
BAD
Этот беспорядок на странице , которая на самом деле в настоящее время связана с Википедией (!) Для Javascript, имеет несколько реализаций проверки, которые даже не возвращают одно и то же значение при вызове каждой из них.
GOOD
Страница , на которую ссылается лунная страница Википедии , имеет кодировщик Javascript, который работает:
// Javascript
String.prototype.luhnGet = function()
{
var luhnArr = [[0,1,2,3,4,5,6,7,8,9],[0,2,4,6,8,1,3,5,7,9]], sum = 0;
this.replace(/\D+/g,"").replace(/[\d]/g, function(c, p, o){
sum += luhnArr[ (o.length-p)&1 ][ parseInt(c,10) ]
});
return this + ((10 - sum%10)%10);
};
alert("54511187504546384725".luhnGet());
GOOD
Эта очень полезная страница EE4253 проверяет контрольную цифру, а также показывает полный расчет и объяснение.
GOOD
Мне нужен был код C #, и в итоге я использовал этот код проекта :
// C#
public static int GetMod10Digit(string data)
{
int sum = 0;
bool odd = true;
for (int i = data.Length - 1; i >= 0; i--)
{
if (odd == true)
{
int tSum = Convert.ToInt32(data[i].ToString()) * 2;
if (tSum >= 10)
{
string tData = tSum.ToString();
tSum = Convert.ToInt32(tData[0].ToString()) + Convert.ToInt32(tData[1].ToString());
}
sum += tSum;
}
else
sum += Convert.ToInt32(data[i].ToString());
odd = !odd;
}
int result = (((sum / 10) + 1) * 10) - sum;
return result % 10;
}
GOOD
Этот проверочный код в C # , кажется, работает, хотя и немного громоздко. Я только использовал это, чтобы проверить, что выше было правильно.