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).
Tato jednoduchá aplikace nenajde moc využití, ale na potrénování Pythonu může být užitečná.