Entwickler-Ecke

WinForms - IBAN Check tool


SSC streezer - Di 09.09.08 08:56
Titel: IBAN Check tool
Hallo - ich mal wieder xD

wie schaffe ich es, ein mehrzeiliges textfeld (1 - n viele zeilen) zu überprüfen ob es eine gültige IBAN Nr. ist?

die klasse zur überprüfung der iban nummer hab ich bereits:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
using System;

class IBAN_validieren
{
    private string IBAN;

    /*
    * CSharp IBAN validieren
    * Der Konstruktor erwartet die Übergabe der zu testenden IBAN
    */

    public IBAN_validieren(string sIBAN)
    {
        IBAN = sIBAN;
    }

    /*
    * CSharp ISIBAN
    * Liefert True für korrekte IBAN, sonst false
    */

    public bool ISIBAN()
    {
        //Leerzeichen entfernen
        string mysIBAN = IBAN.Replace(" """);
        //Eine IBAN hat maximal 34 Stellen
        if (mysIBAN.Length > 34 || mysIBAN.Length < 5)
            return false//IBAN ist zu lang oder viel zu lang
        else
        {
            string LaenderCode = mysIBAN.Substring(02).ToUpper();
            string Pruefsumme = mysIBAN.Substring(22).ToUpper();
            string BLZ_Konto = mysIBAN.Substring(4).ToUpper();

            if (!IsNumeric(Pruefsumme))
                return false//Prüfsumme ist nicht numerisch

            if (!ISLaendercode(LaenderCode))
                return false//Ländercode ist ungültig

            //Pruefsumme validieren
            string Umstellung = BLZ_Konto + LaenderCode + "00";
            string Modulus = IBANCleaner(Umstellung);
            if (98 - Modulo(Modulus, 97) != int.Parse(Pruefsumme))
                return false;  //Prüfsumme ist fehlerhaft 
        }
        return true;
    }

    /*
     * CSharp Ländercode
     * Test auf korrekten Ländercode nach ISO 3166-1
     */

    private bool ISLaendercode(string code)
    {
        // Der Code muss laut ISO 3166-1 ein 2-stelliger Ländercode aus Buchstaben sein.
        if (code.Length != 2)
            return false;
        else
        {
            code = code.ToUpper();
            string[] Laendercodes = { "AA""AB""AC""AD""AE""AF""AG""AH""AI",
                "AJ""AK""AL""AM""AN""AO""AP""AQ""AR""AS""AT""AU""AV",
                "AW""AX""AY""AZ""BA""BB""BC""BD""BE""BF""BG""BH""BI",
                "BJ""BK""BL""BM""BN""BO""BP""BQ""BR""BS""BT""BU""BV",
                "BW""BX""BY""BZ""CA""CB""CC""CD""CE""CF""CG""CH""CI",
                "CJ""CK""CL""CM""CN""CO""CP""CQ""CR""CS""CT""CU""CV",
                "CW""CX""CY""CZ""DA""DB""DC""DD""DE""DF""DG""DH""DI",
                "DJ""DK""DL""DM""DN""DO""DP""DQ""DR""DS""DT""DU""DV",
                "DW""DX""DY""DZ""EA""EB""EC""ED""EE""EF""EG""EH""EI",
                "EJ""EK""EL""EM""EN""EO""EP""EQ""ER""ES""ET""EU""EV",
                "EW""EX""EY""EZ""FA""FB""FC""FD""FE""FF""FG""FH""FI",
                "FJ""FK""FL""FM""FN""FO""FP""FQ""FR""FS""FT""FU""FV",
                "FW""FX""FY""FZ""GA""GB""GC""GD""GE""GF""GG""GH""GI",
                "GJ""GK""GL""GM""GN""GO""GP""GQ""GR""GS""GT""GU""GV",
                "GW""GX""GY""GZ""HA""HB""HC""HD""HE""HF""HG""HH""HI",
                "HJ""HK""HL""HM""HN""HO""HP""HQ""HR""HS""HT""HU""HV",
                "HW""HX""HY""HZ""IA""IB""IC""ID""IE""IF""IG""IH""II",
                "IJ""IK""IL""IM""IN""IO""IP""IQ""IR""IS""IT""IU""IV",
                "IW""IX""IY""IZ""JA""JB""JC""JD""JE""JF""JG""JH""JI",
                "JJ""JK""JL""JM""JN""JO""JP""JQ""JR""JS""JT""JU""JV",
                "JW""JX""JY""JZ""KA""KB""KC""KD""KE""KF""KG""KH""KI",
                "KJ""KK""KL""KM""KN""KO""KP""KQ""KR""KS""KT""KU""KV",
                "KW""KX""KY""KZ""LA""LB""LC""LD""LE""LF""LG""LH""LI",
                "LJ""LK""LL""LM""LN""LO""LP""LQ""LR""LS""LT""LU""LV",
                "LW""LX""LY""LZ""MA""MB""MC""MD""ME""MF""MG""MH""MI",
                "MJ""MK""ML""MM""MN""MO""MP""MQ""MR""MS""MT""MU""MV",
                "MW""MX""MY""MZ""NA""NB""NC""ND""NE""NF""NG""NH""NI",
                "NJ""NK""NL""NM""NN""NO""NP""NQ""NR""NS""NT""NU""NV",
                "NW""NX""NY""NZ""OA""OB""OC""OD""OE""OF""OG""OH""OI",
                "OJ""OK""OL""OM""ON""OO""OP""OQ""OR""OS""OT""OU""OV",
                "OW""OX""OY""OZ""PA""PB""PC""PD""PE""PF""PG""PH""PI",
                "PJ""PK""PL""PM""PN""PO""PP""PQ""PR""PS""PT""PU""PV",
                "PW""PX""PY""PZ""QA""QB""QC""QD""QE""QF""QG""QH""QI",
                "QJ""QK""QL""QM""QN""QO""QP""QQ""QR""QS""QT""QU""QV",
                "QW""QX""QY""QZ""RA""RB""RC""RD""RE""RF""RG""RH""RI",
                "RJ""RK""RL""RM""RN""RO""RP""RQ""RR""RS""RT""RU""RV",
                "RW""RX""RY""RZ""SA""SB""SC""SD""SE""SF""SG""SH""SI",
                "SJ""SK""SL""SM""SN""SO""SP""SQ""SR""SS""ST""SU""SV",
                "SW""SX""SY""SZ""TA""TB""TC""TD""TE""TF""TG""TH""TI",
                "TJ""TK""TL""TM""TN""TO""TP""TQ""TR""TS""TT""TU""TV",
                "TW""TX""TY""TZ""UA""UB""UC""UD""UE""UF""UG""UH""UI",
                "UJ""UK""UL""UM""UN""UO""UP""UQ""UR""US""UT""UU""UV",
                "UW""UX""UY""UZ""VA""VB""VC""VD""VE""VF""VG""VH""VI",
                "VJ""VK""VL""VM""VN""VO""VP""VQ""VR""VS""VT""VU""VV",
                "VW""VX""VY""VZ""WA""WB""WC""WD""WE""WF""WG""WH""WI",
                "WJ""WK""WL""WM""WN""WO""WP""WQ""WR""WS""WT""WU""WV",
                "WW""WX""WY""WZ""XA""XB""XC""XD""XE""XF""XG""XH""XI",
                "XJ""XK""XL""XM""XN""XO""XP""XQ""XR""XS""XT""XU""XV",
                "XW""XX""XY""XZ""YA""YB""YC""YD""YE""YF""YG""YH""YI",
                "YJ""YK""YL""YM""YN""YO""YP""YQ""YR""YS""YT""YU""YV",
                "YW""YX""YY""YZ""ZA""ZB""ZC""ZD""ZE""ZF""ZG""ZH""ZI",
                "ZJ""ZK""ZL""ZM""ZN""ZO""ZP""ZQ""ZR""ZS""ZT""ZU""ZV",
                "ZW""ZX""ZY""ZZ" };
            if (Array.IndexOf(Laendercodes, code) == -1)
                return false;
            else
                return true;
        }
    }

    /*
     * CSharp IBAN Cleaner
     * Buchstaben duch Zahlen ersetzen
     */
 
    private string IBANCleaner(string sIBAN)
    {
        for (int x = 65; x < 90; x++)
        {
            int replacewith = x - 64 + 9;
            string replace = ((char)x).ToString();
            sIBAN = sIBAN.Replace(replace, replacewith.ToString());
        }
        return sIBAN;
    }

    /*
     * CSharp Modulo
     * Es war mir bei diesen großen Zahlen mit C# nicht möglich anderes 
     * an eine Mod Ergebnis zu kommen.
     */
 
    private int Modulo(string sModulus, int iTeiler)
    {
        int iStart,iEnde,iErgebniss,iRestTmp,iBuffer;
        string iRest = "",sErg = "";

        iStart = 0;
        iEnde = 0;

        while (iEnde <= sModulus.Length - 1)
        {
            iBuffer = int.Parse(iRest + sModulus.Substring(iStart, iEnde - iStart + 1));

            if (iBuffer >= iTeiler)
            {
                iErgebniss = iBuffer / iTeiler;
                iRestTmp = iBuffer - iErgebniss * iTeiler;
                iRest = iRestTmp.ToString();

                sErg = sErg + iErgebniss.ToString();

                iStart = iEnde + 1;
                iEnde = iStart;
            }
            else
            {
                if (sErg != "")
                    sErg = sErg + "0";

                iEnde = iEnde + 1;
            }
        }

        if (iStart <= sModulus.Length)
            iRest = iRest + sModulus.Substring(iStart);

        return int.Parse(iRest);
    }

    /*
     * Csharp ISNUMERIC
     * Da C# ISNUMERIC als Methode nicht kennt müssen wir selbst ran.
     */

    private bool IsNumeric(string value)
    {
        try
        {
            int.Parse(value);
            return (true);
        }
        catch
        {
            return (false);
        }
    }
}


das funzt auch wunderbar soweit - jedoch wenn ich das textfeld in dem ich die iban nr. eingebe mehrzeilig mache, dann stürtzt das tool logischerweise ab - nämlich wegen der zeile 150 (substring anweisung).

wie kann ich das problem lösen damit er eine liste von iban nummern einlesen kann und so checked ob sie gültig sind?


vielen dank für eure hilfe,


gruss,
mike


SSC streezer - Di 09.09.08 11:14

hiermit sollte mein vorhaben klar sein - oder doch nicht ? :? :


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
private void txt_ibanline_TextChanged(object sender, EventArgs e)
        {
            IBAN_validieren iban = new IBAN_validieren(txt_ibanlines.Text);
            int i = 0;
            while (i != txt_ibanlines.Text.Length)
            {
                if (!iban.ISIBAN(txt_ibanlines.Lines))
                {
                    pic_ok.Visible = false;
                    pic_error.Visible = true;

                    lbl_false_iban_message.Enabled = true;

                    list_false_IBANS.Enabled = true;
                    list_false_IBANS.Items.Clear();
                    list_false_IBANS.Items.Add(txt_ibanlines.Text);
                }
                else
                {
                    pic_error.Visible = false;
                    pic_ok.Visible = true;

                    lbl_false_iban_message.Enabled = false;

                    list_false_IBANS.Items.Clear();
                    list_false_IBANS.Enabled = false;
                }

                if (txt_ibanlines.Text == "")
                {
                    pic_error.Visible = false;
                    pic_ok.Visible = false;

                    lbl_false_iban_message.Enabled = false;
                    list_false_IBANS.Enabled = false;
                }

                i++;
            }
        }


freak4fun - Di 09.09.08 11:26
Titel: Re: IBAN Check tool
user profile iconSSC streezer hat folgendes geschrieben:
wie schaffe ich es, ein mehrzeiliges textfeld (1 - n viele zeilen) zu überprüfen ob es eine gültige IBAN Nr. ist?
das funzt auch wunderbar soweit - jedoch wenn ich das textfeld in dem ich die iban nr. eingebe mehrzeilig mache, dann stürtzt das tool logischerweise ab - nämlich wegen der zeile 150 (substring anweisung).

wie kann ich das problem lösen damit er eine liste von iban nummern einlesen kann und so checked ob sie gültig sind?

Da musst du jede Zeile einzeln prüfen und für jede IBAN das Ergebnis ausgeben. :oops: Aber das klingt mir als Lösung zu einfach.


SSC streezer - Di 09.09.08 11:34

ja so einfach machen wie möglich xD

aber ich verstehe nicht wo ich das genau einfügen muss... und wie ich das machen muss... :s kannst du mir da helfen? mein lehrmeister wollte mir nicht helfen xD


freak4fun - Di 09.09.08 11:39

Huhu,
Lehrmeister? :shock: Was machst du denn?


C#-Quelltext
1:
IBAN_validieren iban = new IBAN_validieren(txt_ibanlines.Text);                    

Diese Zeile wird wohl Probleme machen.

Da hätte ich 2 Ansätze:

1. Du spendierst deiner Klasse eine neue public-Methode, die als Parameter eine Liste erwartet und dann die EInträge einzeln abarbeitet.

2. Du Arbeitest die Einträge in der Liste ab, indem du für jede Zeil IBAN_validieren(<entsprechende Zeile>); aufrufst.

Ich hoffe das hilft dir weiter. ;)

PS: Kenne mich mit C# nicht besonders gut aus, nur lesen geht. ;)


Th69 - Di 09.09.08 12:44

Stichwort: Eigenschaft TextBox.Lines (näheres in der MSDN)


SSC streezer - Di 09.09.08 14:37

user profile iconfreak4fun hat folgendes geschrieben:
Huhu,
Lehrmeister? :shock: Was machst du denn?

na in der lehre als applikationsentwickler - aber meine bude hat nicht so viel zeit für mich *snif*

Zitat:


C#-Quelltext
1:
IBAN_validieren iban = new IBAN_validieren(txt_ibanlines.Text);                    

Diese Zeile wird wohl Probleme machen.

Da hätte ich 2 Ansätze:

1. Du spendierst deiner Klasse eine neue public-Methode, die als Parameter eine Liste erwartet und dann die EInträge einzeln abarbeitet.

2. Du Arbeitest die Einträge in der Liste ab, indem du für jede Zeil IBAN_validieren(<entsprechende Zeile>); aufrufst.


vielen dank für die hinweise - sieht shcon ein wenig besser aus und es tut was ich will :P *juhuii*


freak4fun - Di 09.09.08 15:24

Ach so, das kenne ich noch von meiner Ausbildung. Geschadet hat es aber nicht. ;) Ich wünsch dir weiterhin viel Erfolg. :zustimm: