Kirjautuminen

Haku

Tehtävät

Koodit: Python: Kansainvälinen viitenumero

Kirjoittaja: Metabolix

Kirjoitettu: 08.11.2015 – 24.03.2019

Tagit: yhteiskunta, kirjasto, koodi näytille, vinkki

Kansainvälistä viitenumeroa käytetään esimerkiksi SEPA-maksuissa. Viitenumeron alussa ovat merkit RF ja kaksinumeroinen tarkiste, ja tämän jälkeen voi tulla enintään 21 omavalintaista merkkiä. Suomessa käytetään loppuosana yleensä numeroista 0–9 muodostuvaa suomalaista viitenumeroa (ks. toinen koodivinkki), mutta myös kirjaimet A–Z ja a–z ovat sallittuja. Tarkiste muodostetaan seuraavasti:

  1. Otetaan viitteen valinnainen osa, esimerkiksi ”123ABCZ”.
  2. Poistetaan tästä välit ja muutetaan kirjaimet isoiksi.
  3. Lisätään loppuun merkit RF00.
  4. Muutetaan kirjaimet lukuarvoiksi siten, että A = 10, B = 11, ..., Z = 35. Esimerkiksi ”123ABCZRF00” muuttuu muotoon ”12310111235271500”.
  5. Lasketaan jakojäännös 97:llä ja vähennetään tämä 98:sta. Esimerkiksi 12310111235271500 jaettuna 97:llä jättää 63, ja 98 - 63 on 35.
  6. Jos saatu tulos on yksinumeroinen, lisätään siihen etunolla.
  7. Viitenumeroksi tulee siis ”RF” + ”35” + ”123ABCZ” = ”RF35 123A BCZ”.

Kansainvälistä viitenumeroa koskee standardi ISO 11649.

Alla ovat Python-funktiot kansainvälisen viitteen laskemiseen ja tarkastamiseen.

# -*- coding: utf-8 -*-
# iso_11649.py
# Moduuli kansainvälisten viitenumeroiden käsittelyyn (ISO 11649).

# Siivoaa viitteestä ylimääräiset välimerkit.
def clean(reference):
	return "".join(i for i in str(reference) if "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".find(i.upper()) >= 0)

# Muuttaa viitteen numeeriseen muotoon jakojäännöstä varten.
def numeric(reference):
	return "".join(str(j) for i in str(reference) for j in ("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".find(i.upper()),) if j >= 0)

# Luo kokonaisen viitteen (RF + tarkiste) loppuosan perusteella.
def create(reference):
	reference = clean(reference)
	num = numeric(reference + "RF00")
	check = "%02d" % (98 - int(num) % 97)
	return "RF" + check + reference

# Tarkastaa, onko viite kelvollinen.
def validate(reference):
	reference = clean(reference)
	num = numeric(reference[4:] + reference[0:4])
	return 4 < len(reference) <= 25 and int(num) % 97 == 1

# Muuttaa viitteen tulostettavaan muotoon.
def printable(reference):
	reference = clean(reference)
	return " ".join(reference[i:i+4] for i in range(0, len(reference), 4))

Kun funktiot on tallennettu moduuliksi iso_11649.py, niitä voi käyttää esimerkiksi näin:

# -*- coding: utf-8 -*-
import iso_11649 as ref

# Suomalainen viitenumero kansainväliseksi:
s = "12345672"
r = ref.create(s)
print("%s => %s => %s\n" % (s, r, ref.printable(r)))
# 12345672 => RF8512345672 => RF85 1234 5672

# Kansainvälisen viitenumeron tarkastus:
def f(x):
	if ref.validate(x):
		print("%s kelpaa" % x)
	else:
		print("%s ei kelpaa" % x)

f(r)                # kelpaa (juuri itse laskettu)
f("RF45 G72U UR")   # kelpaa
f("RF00 1234 5678") # ei kelpaa

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta