Sha256: 37de25f04a5100e25fd689f58e1645911903c6f609aade3b28e96a21eee9732f

Contents?: true

Size: 1.54 KB

Versions: 64

Compression:

Stored size: 1.54 KB

Contents

using System;
using System.Linq;

public class Luhn
{
    private readonly long number;

    public long CheckDigit { get { return number % 10; } }
    public int[] Addends { get; private set; }
    public int Checksum { get { return Addends.Sum(); } }
    public bool Valid { get { return Checksum % 10 == 0; } }

    public Luhn(long number)
    {
        this.number = number;
        Addends = GenerateAddends();
    }

    private int[] GenerateAddends()
    {
        var reversedIntArray = SplitToReversedIntArray(number);
        for (int i = 1; i < reversedIntArray.Length; i++)
        {
            if (i % 2 != 0)
                reversedIntArray[i] = ConvertDigitForAddend(reversedIntArray[i]);
        }
        Array.Reverse(reversedIntArray);
        return reversedIntArray;
    }

    private static int[] SplitToReversedIntArray(long value)
    {
        return value.ToString().Select(c => int.Parse(c.ToString())).Reverse().ToArray();
    }

    private static int ConvertDigitForAddend(int value)
    {
        var doubled = value * 2;
        return doubled < 10 ? doubled : doubled - 9;
    }

    public static long Create(long number)
    {
        var zeroCheckDigitNumber = number * 10;
        var luhn = new Luhn(zeroCheckDigitNumber);

        if (luhn.Valid)
            return zeroCheckDigitNumber;

        return zeroCheckDigitNumber + CreateCheckDigit(luhn.Checksum);
    }

    private static int CreateCheckDigit(int value)
    {
        var nearestTen = (int)(Math.Ceiling(value / 10.0m) * 10);
        return nearestTen - value;
    }
}

Version data entries

64 entries across 64 versions & 1 rubygems

Version Path
trackler-2.0.6.8 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.6.7 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.6.6 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.6.5 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.6.4 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.6.3 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.6.2 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.6.1 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.6.0 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.5.18 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.5.17 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.5.16 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.5.15 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.5.14 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.5.13 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.5.12 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.5.11 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.5.10 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.5.9 tracks/csharp/exercises/luhn/Example.cs
trackler-2.0.5.8 tracks/csharp/exercises/luhn/Example.cs