Έλεγχος εγκυρότητας Α.Φ.Μ.

Έλεγχος εγκυρότητας Α.Φ.Μ.

Όπως θα γνωρίζετε, ο Αριθμός Φορολογικού Μητρώου (Α.Φ.Μ.) στην Ελλάδα, δίδεται έπειτα από κάποιους υπολογισμούς. Υπάρχει δηλαδή ένας αλγόριθμους που περιγράφει τη λογική συνέπεια των αριθμών. Είναι λοιπόν πολλές φορές χρήσιμο προγραμματιστικά να ελέγχουμε την εγκυρότητα ενός Α.Φ.Μ. που θα πληκτρολογήσει ο χρήστης, για να τον γλιτώσουμε από πιθανά «τρεχάματα» (όλοι θα έχετε ζήσει τις ελληνικές δημόσιες υπηρεσίες) από λάθος εισαγωγή Α.Φ.Μ. Αυτό που θα κάνουμε λοιπόν εδώ είναι να δούμε βήμα-προς-βήμα τον τρόπο ελέγχου της εγκυρότητας ενός Α.Φ.Μ. που θα μας πληκτρολογήσει ο χρήστης, σε γλώσσα C# και χρησιμοποιώντας το Visual Studio 2005. Ο αλγόριθμος είναι αυτός που έχει σημασία και όχι τόσο η γλώσσα υλοποίησης, οπότε αν καταλάβετε τον κώδικα μπορείτε πολύ εύκολα και απλά να κάνετε τον δικό σας έλεγχο εγκυρότητας σε όποια γλώσσα θέλετε.

Ο τρόπος υπολογισμού είναι ο εξής:
Έστω ότι έχουμε το Α.Φ.Μ. 045678990.
Αντιστρέφουμε τον αριθμό και πολλαπλασιάζουμε ένα ένα τα ψηφία του, αθροίζοντας τα αποτελέσματα, σύμφωνα με το παρακάτω σκίτσο:

Αν το άθροισμα και το αποτέλεσμα είναι ο ίδιος αριθμός τότε το Α.Φ.Μ. μας είναι έγκυρο, σε αντίθετη περίπτωση (δηλαδή το αποτέλεσμα είναι διαφορετικός από το άθροισμα είτε ακέραιος είτε δεκαδικός), το Α.Φ.Μ. που δόθηκε δεν είναι έγκυρο.

Ας δούμε πως μπορούμε υλοποιήσουμε προγραμματιστικά τον παραπάνω αλγόριθμο.

Δημιουργούμε ένα νέο αρχείο σε C#. Δημιουργούμε ένα textbox και ένα button, έστω τα textΒox1 και button1. Πηγαίνουμε στις παραμέτρους του textbox1 (επιλέγοντάς το και πατώντας F4) και δίνουμε MaxLength το 9 (τον αριθμό των ψηφίων του Α.Φ.Μ.).

Στη συνέχεια κάνουμε διπλό κλικ στο κουμπί button1. Στην οθόνη του κώδικα που εμφανίζεται ανεβαίνουμε στο πάνω μέρος της και προσθέτουμε κάτω από τα υπόλοιπα using το

using System.Text.RegularExpressions;

Δημιουργούμε μία μέθοδο με τον παρακάτω κώδικα, η οποία θα ελέγχει το αν αυτό που πληκτρολόγησε ο χρήστης είναι αριθμοί ή γράμματα.

public bool isNumber(string param1)
{
Regex isNum = new Regex(“[^0-9]“);
return !isNum.IsMatch(param1);
}

Αφού τελειώσουμε με την προετοιμασία πάμε στο «ζουμί». Προσθέτουμε μέσα το button1_Click τον παρακάτω κώδικα:

private void button1_Click(object sender, EventArgs e)
{
if (isNumber(textBox1.Text))
{
try
{
int telestis = 2;
int sum = 0;
string afm = textBox1.Text;
for (int i = 7; i >= 0; i–)
{
sum += int.Parse(afm[i].ToString()) * telestis;
telestis = telestis * 2;
}
double check;
check = sum / 11;
check = check * 11;
if (sum == check)
{
MessageBox.Show(“Έγκυρο ΑΦΜ”, “www.digitalnews.gr”);
}
else
{
MessageBox.Show(“Μη έγκυρο ΑΦΜ”, “www.digitalnews.gr”);
}
}
catch
{
MessageBox.Show(“Λάθος στην εισαγωγή δεδομένων”, “www.digitalnews.gr”);
}
}
else
{
MessageBox.Show(“Παρακαλώ δώστε μόνο αριθμούς”, “www.digitalnews.gr”);
}
}

Παρατηρήσεις:

  • Το αντικείμενο string μπορεί να χρησιμοποιηθεί και σαν πίνακας χαρακτήρων. Αλλά αν το χρησιμοποιήσουμε έτσι μετατρέπεται αυτόματα σε πίνακα char οπότε για να το κάνουμε integer το μετατρέπουμε από char σε string και μετά σε integer.

  • Η μεταβλητή check είναι double ενώ η sum είναι integer. Ως γνωστόν οι πράξεις του πολλαπλασιασμού και της πρόσθεσης ακέραιων αριθμών μας δίνουν μόνο ακέραιο αποτέλεσμα ενώ οι πράξη της διαίρεσης μπορεί να μας δώσει και δεκαδικό. Έτσι εξηγούνται οι παραπάνω επιλογές που κάναμε και εκεί βασίζεται και η λειτουργία του αλγόριθμου.

  • Όπως θα καταλάβατε παραλείπουμε έναν αριθμό (τον τελευταίο αριθμό του Α.Φ.Μ.) γιατί λόγω του τύπου πρέπει να τον πολλαπλασιάσουμε με 0 και να τον προσθέσουμε στο άθροισμα, κάτι που πάντα θα μας κάνει 0 και δεν θα αλλάζει τίποτα.


Μπορείτε να κατεβάσετε τον παραπάνω οδηγό σε video. Μπορείτε να το βρείτε στην κατηγορία Downloads και στην υποκατηγορία Video Tutorials, ή μπορείτε να ακολουθήσετε το παρακάτω link:
http://www.digitalnews.gr/modules/PDdownloads/visit.php?cid=4&lid=12

Blog Widget by LinkWithin

Post to Twitter Post to Delicious Delicious



5 σχόλια »

  1. avatar
    Δημήτρης:
    6-05-2009 | 6:59 pm
    comment-top

    Έχεις κάνει λάθος στον τύπο.
    Η πράξη είναι το υπόλοιπο της διαίρεσης με το 11 πρέπει να ισόυτε με το τελευταίο ψηφίο του Α.Φ.Μ.
    π.χ. (0*0 + 9*2 + 9*4 + 8*8 + 7*16 + 6*32 + 5*64 + 4*128 + 0*256) mod 11 = (0 + 18 + 36 + 64 + 112 + 192 + 320 + 512) mod 11 = 1254 mod 11 = 0
    Άρα το τελευταίο ψηφίο του Α.Φ.Μ. πρέπει να είναι 0. Αν διαιρέσεις εναν αριθμό με το 11 και τον πολλαπλασιάσεις με το 11 θα είναι πάντα σωστο όποιο Α.Φ.Μ. και να δώσεις.

    comment-bottom
  2. avatar comment-top

    Σωστός ο Δημήτρης

    comment-bottom
  3. avatar comment-top

    ΜΠΟΡΕΙΤΕ ΣΑΣ ΠΑΡΑΚΑΛΩ ΝΑ ΜΟΥ ΠΕΙΤΕ ΠΟΙΑ ΓΡΑΜΜΗ ΤΟΥ ΚΩΔΙΚΑ ΑΛΛΑΖΕΙ?

    comment-bottom
  4. avatar comment-top

    Ειναι σωστό μόνο για τις περιπτώσεις που το τελευταίο digit του ΑΦΜ είναι 0.
    Διαφορετικά το υπόλοιπο της διαίρεσης πρέπει να είναι ίσο με το τελευταίο digit του AFM.
    Αν διαιρέσουμε ένα αριθμό με 11 και τον πολλαπλασιάσουμε με 11 δεν είναι πάντα το ίδιο.
    ΠΧ 1255 /11 = 114.09090909
    114.09090909 * 11 = 1254.99999999

    comment-bottom
  5. avatar comment-top

    Αντικατέστησε τα

    double check;
    check = sum / 11;
    check = check * 11;
    if (sum == check)

    με
    int checkDigit = int.Parse(afm[8].ToString());

    if (sum % 11 % 10 == checkDigit);

    comment-bottom

RSS για τα σχόλια αυτού του άρθρου | TrackBack URL

γράψτε ένα σχόλιο