ΜΑΝΙΠΕΣΤΟ

Η ελεύθερη σκέψη και έκφραση είναι ένα εγχείρημα που αξίζει να δοκιμάσουμε.

Αλγόριθμος του ΑΦΜ (ΑΦΜ έλεγχος ορθότητας)

Δημοσιεύθηκε από tatief στο 29/12/2008

Αυτόν τον αλγόριθμο παλαιότερα χρειάστηκα δύο χρόνια για να τον αποκωδικοποιήσω και ενώ πανηγύριζα για το κατόρθωμά μου, μετά από περίπου 3 χρόνια το υπουργείο οικονομικών αποφάσισε να δώσει η ίδια τον αλγόριθμο στην δημοσιότητα!!

Εν πάσει περιπτώσει ο αλγόριθμος είναι ο εξής:

Από τον 9ψήφιο αριθμό που θέλουμε να ελέγξουμε, απομονώνουμε το τελευταίο ψηφίο. Αυτό είναι το ψηφίο ελέγχου που θα πρέπει να συμπίπτει με τον μονοψήφιο αριθμό που θα βρούμε παρακάτω.

Παίρνουμε τώρα ένα – ένα τα υπόλοιπα ψηφία του αριθμού, ξεκινώντας από το δεξιότερο, πολλαπλασιάζοντας το με μια δύναμη του 2, όση είναι και η θέση του ψηφίου σε αυτόν τον αριθμό. Δηλαδή για το πρώτο δεξιά με 21, το δεύτερο με 22, το τρίτο δεξιά 23 κοκ. Τα μερικά αυτά γινόμενα τα προσθέτουμε και έχουμε το άθροισμά τους. Αυτού του αθροίσματος παίρνουμε το υπόλοιπο της διαίρεσης με το 11 και αυτού του υπολοίπου το υπόλοιπο με το 10. Ο τελικός αυτός αριθμός πρέπει να είναι ίσος  με το ψηφίο του ΑΦΜ που απομονώσαμε.

Παράδειγμα για το ΑΦΜ 011111111 (είναι το ευκολότερο σε πράξεις). Απομονώνουμε το τελευταίο ψηφίο ( το 1 δηλαδή), για τον υπόλοιπο αριθμό 01111111 εφαρμόζουμε τα παραπάνω που είπαμε και έχουμε

1*21+1*22+1*23+1*24+1*25+1*26+1*27+0*28

=2+4+8+16+32+64+128+0=254

Το υπόλοιπο αυτού του αριθμού με το 11 είναι 1 και αυτού το υπόλοιπο με το 10 είναι πάλι 1

Το ΑΦΜ λοιπόν είναι σωστό γιατί το τελευταίο ψηφίο που απομονώσαμε είναι ίσο με το παραπάνω υπόλοιπο

Θα δώσω και ένα κώδικα σε VB για τον παραπάνω αλγόριθμο

Function CheckAFM(VatNo As String) As Boolean
Dim RetVal, TotalVal, i, IsNumber, NumToStr

RetVal = False
If Len(VatNo) = 9 And Val(VatNo) <> 0 Then
NumToStr = LTrim(Str(Val(VatNo)))
IsNumber = (String(9 – Len(NumToStr), “0″) + NumToStr = VatNo)

If IsNumber Then
TotalVal = 0
For i = 8 To 1 Step -1
TotalVal = TotalVal + Val(Mid(VatNo, i, 1)) * 2 ^ (9 – i)
Next
RetVal = (((TotalVal Mod 11) Mod 10) = Val(Right(VatNo, 1)))
End If
End If
CheckAFM = RetVal
End Function

Σημειώνω ότι αυτός ο αλγόριθμος τσεκάρει αν ένα 9ψήφιο νούμερο μπορεί να είναι ΑΦΜ και όχι την ύπαρξή του ή όχι. Είναι έλεγχος ορθότητας και όχι έλεγχος υπαρκτότητας.Αν έχει δοθεί σε κάποιο φυσικό πρόσωπο ή εταιρία και είναι σε χρήση, μόνο η Εφορία το γνωρίζει και δεν βρίσκεται μέσω αλγορίθμου αυτό.

5 σχόλια προς “Αλγόριθμος του ΑΦΜ (ΑΦΜ έλεγχος ορθότητας)”

  1. leonardo είπε

    Πρέπει να είναι απο τους καλύτερους κώδικες που έχω δει.
    Οσο το δοκίμασα, δεν μου έβγαλε λάθος.
    Εκείνο το IsNumber ακόμα προσπαθώ να το καταλάβω!!

  2. tatief είπε

    Το IsNumber ελέγχει αν το ΑΦΜ έχει μόνο ψηφία.
    Αρχικά το μετατρέπω σε αριθμό με την Val
    μετά πάλι σε συμβολοσειρά (string) με την str (αφαιρώντας το αριστερό κενό που δημιουργεί η str με την ltrim)
    Μετά προσθέτω αριστερά τοσα μηδενικά ώστε το προηγούμενο αποτέλεσμα να γίνει μήκους 9 (γιατί η val θα τα έχει κόψει). Αυτό γίνεται με την string.
    Τώρα αν ήταν αριθμός και δεν είχε ενδιαμέσως κενά ή γράμματα ή άλλους χαρακτήρες που θα έκοβαν τον αριθμό θα πρέπει να ισούται με τον VatNo.

  3. ΚΚ είπε

    ΚΑΛΗΣΠΕΡΑ!

    ΜΠΟΡΕΙ ΚΑΝΕΙΣ ΝΑ ΜΟΥ ΓΡΑΨΕΙ ΤΟΝ ΑΛΓΟΡΙΘΜΟ ΣΕ JAVA ?

    EXΩ ΨΑΞΕΙ ΟΛΟ ΤΟ ΔΙΑΔΙΚΤΥΟ ΚΑΙ ΤΟΝ ΕΧΩ ΒΡΕΙ ΜΟΝΟ ΣΕ VISUAL BASIC.

    ΤΟ ΠΡΟΒΛΗΜΑ ΕΙΝΑΙ ΟΤΙ ΚΑΠΟΙΕΣ ΣΥΝΑΡΤΗΣΕΙΣ ΤΗΣ BASIC ΕΙΝΑΙ ΔΙΑΦΟΡΕΤΙΚΕΣ ΑΠΟ ΤΙΣ ΑΝΤΙΣΤΟΙΧΕΣ ΤΗΣ JAVA , ΜΕ ΑΠΟΤΕΛΕΣΜΑ ΝΑ ΕΙΝΑΙ ΔΥΣΚΟΛΗ Η ΜΕΤΑΤΡΟΠΗ ΤΟΥ ΚΩΔΙΚΑ ΑΠΟ ΤΗ ΜΙΑ ΓΛΩΣΣΑ ΣΤΗΝ ΑΛΛΗ…

    ΑΝ ΜΠΟΡΟΥΣΕ ΚΑΠΟΙΟΣ ΝΑ ΜΕ ΒΟΗΘΗΣΕΙ… ΕΥΧΑΡΙΣΤΩ ΠΡΟΚΑΤΑΒΟΛΙΚΑ

  4. tatief είπε

    function checkAFM (afm)
    {
    if(!afm.match(/^\d{9}$/)) return false;
    afm = afm.split(”).reverse().join(”);

    var Num1 = 0;
    for(var iDigit= 1; iDigit <= 8; iDigit++)
    {
    Num1 += afm.charAt(iDigit) << iDigit;
    }

    return (Num1 % 11) % 10 == afm.charAt(0);
    }

  5. ΚΚ είπε

    ΕΧΕΙΣ ΚΑΠΟΙΑ ΣΥΝΤΑΚΤΙΚΑ ΛΑΘΗ…

    ΑΥΤΕΣ ΤΙΣ ΑΠΟΣΤΡΟΦΟΥΣ ΜΕΣΑ ΣΤΙΣ ΠΑΡΕΝΘΕΣΕΙΣ ΔΕΝ ΤΙΣ ΔΕΧΕΤΑΙ!ΜΠΟΡΕΙΣ ΝΑ ΤΟ ΔΙΟΡΘΩΣΕΙΣ?

    —> afm = afm.split(”).reverse().join(”);

Υποβολή απάντησης

XHTML: Μπορείτε να χρησιμοποιήσετε αυτές τις ετικέτες: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>