< Summary

Information
Class: Buergerportal.Gebuehren.IbanPruefer
Assembly: Buergerportal.Gebuehren
File(s): /builds/konradschrader2001/buergerportal/Buergerportal/src/Buergerportal.Gebuehren/IbanPruefer.cs
Line coverage
67%
Covered lines: 31
Uncovered lines: 15
Coverable lines: 46
Total lines: 94
Line coverage: 67.3%
Branch coverage
68%
Covered branches: 11
Total branches: 16
Branch coverage: 68.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
IstGueltig(...)83.33%6684.61%
Modulo97(...)100%66100%
Formatiere(...)0%2040%

File(s)

/builds/konradschrader2001/buergerportal/Buergerportal/src/Buergerportal.Gebuehren/IbanPruefer.cs

#LineLine coverage
 1namespace Buergerportal.Gebuehren;
 2
 3/// <summary>
 4/// Einfache Pruefung deutscher IBANs (Laenge, Praefix, Modulo-97-Pruefsumme).
 5///
 6/// HINWEIS FUER DAS PRAXISPROJEKT:
 7/// Diese Klasse ist bewusst nur TEILWEISE mit Tests abgedeckt. Die Methode
 8/// <see cref="Formatiere"/> hat absichtlich KEINE Tests. Dadurch zeigt der
 9/// Coverage-Report eine sichtbare, erklaerbare Luecke (&lt; 100 %), an der
 10/// sich die Wirkung der Testabdeckung demonstrieren laesst.
 11/// </summary>
 12public class IbanPruefer
 13{
 14    /// <summary>
 15    /// Prueft, ob eine deutsche IBAN formal gueltig ist. Leerzeichen werden
 16    /// ignoriert. Gross-/Kleinschreibung ist egal.
 17    /// </summary>
 18    public bool IstGueltig(string? iban)
 1019    {
 1020        if (string.IsNullOrWhiteSpace(iban))
 321        {
 322            return false;
 23        }
 24
 725        var bereinigt = iban.Replace(" ", "").ToUpperInvariant();
 26
 727        if (bereinigt.Length != 22)
 328        {
 329            return false;
 30        }
 31
 432        if (!bereinigt.StartsWith("DE"))
 033        {
 034            return false;
 35        }
 36
 437        return Modulo97(bereinigt) == 1;
 1038    }
 39
 40    /// <summary>
 41    /// Fuehrt die Modulo-97-Pruefung nach ISO 13616 durch: die ersten vier
 42    /// Zeichen ans Ende stellen, Buchstaben in Zahlen wandeln, Rest zu 97.
 43    /// </summary>
 44    private static int Modulo97(string iban)
 445    {
 446        var umgestellt = iban.Substring(4) + iban.Substring(0, 4);
 47
 448        var ziffern = new System.Text.StringBuilder();
 18849        foreach (var c in umgestellt)
 8850        {
 8851            if (char.IsLetter(c))
 852            {
 53                // A=10, B=11, ... Z=35
 854                ziffern.Append((c - 'A' + 10).ToString());
 855            }
 56            else
 8057            {
 8058                ziffern.Append(c);
 8059            }
 8860        }
 61
 62        // Stueckweise Modulo, um Ueberlauf bei langen Zahlen zu vermeiden.
 463        var rest = 0;
 20464        foreach (var c in ziffern.ToString())
 9665        {
 9666            rest = (rest * 10 + (c - '0')) % 97;
 9667        }
 68
 469        return rest;
 470    }
 71
 72    /// <summary>
 73    /// Formatiert eine IBAN in Vierergruppen zur besseren Lesbarkeit.
 74    /// ABSICHTLICH NICHT GETESTET (siehe Klassenkommentar).
 75    /// </summary>
 76    public string Formatiere(string iban)
 077    {
 078        if (string.IsNullOrWhiteSpace(iban))
 079        {
 080            return string.Empty;
 81        }
 82
 083        var bereinigt = iban.Replace(" ", "").ToUpperInvariant();
 084        var gruppen = new List<string>();
 85
 086        for (var i = 0; i < bereinigt.Length; i += 4)
 087        {
 088            var laenge = Math.Min(4, bereinigt.Length - i);
 089            gruppen.Add(bereinigt.Substring(i, laenge));
 090        }
 91
 092        return string.Join(" ", gruppen);
 093    }
 94}