Python – CAS validátor

Po pauze jsem zase potřeboval skočit do Pythonu, tak jsem si pro rozcvičení napsal jednoduchou aplikaci na validaci CAS čísla.

Registrační číslo CAS

CAS číslo je jednoznačný, mezinárodní identifikátor chemických sloučenin, směsí, slitin, atd. Byl zaveden Americkou chemickou společností.

Číslo se skládá ze tří částí, které jsou odděleny pomlčkami. První část má proměnný počet číslic, druhá právě dvě číslice a poslední, tzv, kontrolní, je jednočíselná. Strukturu lze popsat regulárním výrazem:
^[1-9]{1}[0-9]{1,5}-[0-9]{2}-[0-9]{1}$

Kontrolní číslice slouží pro ověření správnosti zbytku CAS čísla. Postup pro ověření je snadný, vynecháme kontrolní číslici a postupně od poslední číslice násobíme každé číslo nejprve jedničkou, pak dvojkou, atd. Výsledky sčítáme a získané číslo podělíme 10. Zbytek po dělení se musí rovnat kontrolní číslici.

Jako příklad můžeme vzít trimethylalan, který más CAS 75-24-1. Kontrolní číslice je 1. Výpočet provedeme následovně:

4 × 1 + 2 × 2 + 5 × 3 + 7 × 4 = 51
51 / 10 = 5 zb 1

Výpočtem jsme ověřili, že CAS číslo má správný formát. Dál se podíváme, jak to udělat pomocí Pythonu.

CAS Validator

Začneme rovnou kódem, protože je velmi jednoduchý.

from tkinter import *
import re

window = Tk()
window.title("CAS validator")
window.geometry('300x100')

lbl1 = Label(window, text="CAS:")
lbl1.grid(column=0, row=2)

cas = Entry(window)
cas.grid(column=2, row=2)

lbl2 = Label(window, text="")
lbl2.grid(column=0, row=3)

def reverse(Number):
    Reverse = 0
    Number = int(Number)
    while(Number > 0):    
        Residue = Number %10    
        Reverse = (Reverse *10) + Residue    
        Number = Number //10
    return Reverse

def validate():
    casValue = cas.get()
    if not re.match("^[1-9]{1}[0-9]{1,5}-[0-9]{2}-[0-9]{1}$", casValue):
        lbl2.configure(text= "Wrong input")

    parts = casValue.split("-")
    rev1 = reverse(parts[1])
    rev2 = reverse(parts[0])
    revNum = str(rev1) + str(rev2)

    sumCAS = 0
    arrChr = list(revNum)
    i = 1
    for x in arrChr:
        sumCAS = sumCAS + i*int(x)
        i = i+1

    if (sumCAS%10 == int(parts[2])):
        res = "CAS OK"
    else:
        res = "CAS not OK"
        
    lbl2.configure(text= res)

btn = Button(window, text="Validate", command=validate)
btn.grid(column=0, row=10)

window.mainloop()

Nejprve si naimportujeme TKinter pro tvorbu GUI a knihovnu re, protože budeme potřebovat regulární výrazy.

V druhém bloku si nadefinujeme okno aplikace, vstup pro text, button pro odeslání a popisky. Dále se dostáváme k definici dvou funkcí, první převrátí pořadí číslic v zadaném čísle CAS a druhá provede validaci.

Převrácení pořadí číslic je jednoduché, číslo postupně dělíme 10 a ukládáme zbytek po dělení. Operátor // provede dělení a zároveň číslo zaokrouhlí dolů. Můžeme si to ukázat na čísle 352:

352%10 = 2   zbytek po dělení 10 je 2
Reverse = 0*10 + 2 = 2
Number = 352//10 = 35

2. iterace
35%10 = 5
Reverse = 2*10 + 5 = 25
Number = 35//10 = 3

3. iterace
3%10 = 3
Reverse = 25*10 + 3 = 253
Number = 3//10 = 0

Z čísla 352 jsme tímto postupem získali 253.

Po kliknutí na tlačítko Validate se zavolá funkce validate(), ta vezme zadaný řetězec a nejprve ho ověří oproti regulárnímu výrazu, pokud je řetězec v pořádku. Tak je rozsekán na tři části a první dvě jsou spojeny a získané číslo se otočí.

Otočené číslo rozsekáme po jednotlivých znacích do pole a pak postupně násobíme. Posledním krokem je ověření oproti kontrolní číslici. Informace o validitě je vypsána pomocí prvku Label (lbl2).

Vzhled okna

Tato jednoduchá aplikace nenajde moc využití, ale na potrénování Pythonu může být užitečná.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.