Kirjautuminen

Haku

Tehtävät

Koodit: Python: Viitenumerolaskuri

Kirjoittaja: Chiman

Kirjoitettu: 05.12.2012 – 05.12.2012

Tagit: teksti, yhteiskunta, koodi näytille, vinkki, yleispätevä

Viitenumerolaskuri täydentää annetun numerosarjan suomalaiseksi viitenumeroksi lisäämällä perään tarkistenumeron.

Koodi on tehty yksinkertaiseksi, jotta se toimisi mahdollisimman hyvin 2- ja 3-sarjan Python-versioilla.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# viitenumero.py

def viitenumeron_tarkiste(viitenumero_raaka):
    """palauta annetun tarkisteettoman viitenumeron perään kuuluva tarkistenumero"""
    kertoimet = (7, 3, 1)
    viitenumero_raaka = viitenumero_raaka.replace(' ', '')
    nrot_kaanteinen = map(int, viitenumero_raaka[::-1])
    tulosumma = sum(kertoimet[i % 3] * x for i, x in enumerate(nrot_kaanteinen))
    return (10 - (tulosumma % 10)) % 10

def viitenumero_ok(viitenumero):
    """tarkista vastaako lopun tarkistenumero viitenumeron alkuosaa"""
    return viitenumeron_tarkiste(viitenumero[:-1]) == int(viitenumero[-1])

def jaa_ryhmiin_oikealta(s, n):
    """palauta merkkijono s eroteltuna n merkin ryhmiin, välilyönti erottaa

    Ryhmittely aloitetaan oikeasta reunasta.
    Esimerkki: s='1234567890', n=4 palauttaa '12 3456 7890'

    """
    kaannetty = s[::-1]
    osat = [(' ' if i and i % n == 0 else '') + c for i, c in enumerate(kaannetty)]
    return ''.join(osat)[::-1]

def testit():
    assert viitenumeron_tarkiste('1662') == 5
    assert viitenumero_ok('16625')
    assert jaa_ryhmiin_oikealta('966846848', 5) == '9668 46848'
    print('testit ok')

if __name__ == '__main__':
    from sys import argv
    if len(argv) == 2:
        # oleta argumentiksi viitenumero ilman tarkistetta, tulosta tarkisteen kanssa
        viite_raaka = argv[-1]
        tarkiste = viitenumeron_tarkiste(viite_raaka)
        viite = viite_raaka + str(tarkiste)
        print(jaa_ryhmiin_oikealta(viite, 5))
    else:
        testit()
        print('Anna argumenttina viitenumero ilman tarkistetta')

Käyttö komentoriviltä:
python viitenumero.py 1234567
tulostaa:
123 45672

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta