|
| 1 | +# create by claudio.dcv@gmail.com |
| 2 | +import re |
| 3 | +import math |
| 4 | + |
| 5 | + |
| 6 | +''' |
| 7 | +@param paramrut {string}= 16.761.256-9 |
| 8 | +@return {string} = 167512569 |
| 9 | +''' |
| 10 | +rut_clean = lambda paramrut : re.sub(r'[^0-9kK]+', '', str(paramrut)).upper() |
| 11 | + |
| 12 | + |
| 13 | +''' |
| 14 | +@param paramrut {number/string} = 16751256 / 16.751.256 |
| 15 | +@return {string} = 9 |
| 16 | +''' |
| 17 | +def rut_calc_dv(paramrut): |
| 18 | + rut = rut_clean(str(paramrut)) |
| 19 | + reverse_rut = ''.join(c for c in rut if c.isdigit())[::-1] |
| 20 | + result = 0 |
| 21 | + n = 1 |
| 22 | + |
| 23 | + for digit_rut in reverse_rut: |
| 24 | + n += 1 |
| 25 | + result += int(digit_rut) * n |
| 26 | + n = 1 if n == 7 else n |
| 27 | + |
| 28 | + result = 11 - (result % 11) |
| 29 | + result = 0 if result == 11 else result |
| 30 | + return str('K' if result == 10 else result) |
| 31 | + |
| 32 | + |
| 33 | +''' |
| 34 | +@example = |
| 35 | +RUT_validate('167512569') |
| 36 | +True |
| 37 | +RUT_validate('167512568') |
| 38 | +False |
| 39 | +RUT_validate('16.751.256-8') |
| 40 | +False |
| 41 | +RUT_validate('16.751.256-9') |
| 42 | +True |
| 43 | +@param paramrut {string} = 16.761.256-9 |
| 44 | +@return {boolean} = True |
| 45 | +''' |
| 46 | +def rut_validate(paramrut): |
| 47 | + rut = str(paramrut) |
| 48 | + if (not re.match(r'^0*(\d{1,3}(\.?\d{3})*)-?([\dkK])$', rut)): |
| 49 | + return False |
| 50 | + |
| 51 | + rut = rut_clean(rut) |
| 52 | + |
| 53 | + dv = rut[-1] |
| 54 | + rut_number = rut[0:-1] |
| 55 | + |
| 56 | + return rut_calc_dv(rut_number) == dv |
| 57 | + |
| 58 | + |
| 59 | +''' |
| 60 | +@param paramrut {number/string} = 167512569 |
| 61 | +@return {string} = 16.761.256-9 |
| 62 | +''' |
| 63 | +def rut_format(paramrut): |
| 64 | + rut = str(rut_clean(paramrut)) |
| 65 | + result = '{}-{}'.format(rut[-4:-1], rut[-1]) |
| 66 | + reverse_rut = rut[0:-1][::-1] |
| 67 | + |
| 68 | + def for_in_rut(i, rr, out): |
| 69 | + out = rr[i:i+3][::-1] + '.' + out |
| 70 | + i += 3 |
| 71 | + return out if i > len(rr) else for_in_rut(i, rr, out) |
| 72 | + |
| 73 | + return for_in_rut(3, reverse_rut, result) |
| 74 | + |
| 75 | + |
| 76 | +''' |
| 77 | +@param paramrut {string} = 16.751.256-9 / 16751256-9 |
| 78 | +@return {string} = 16751256 |
| 79 | +''' |
| 80 | +rut_get_number = lambda paramrut : rut_clean(paramrut.split('-', 1)[0]) |
| 81 | + |
| 82 | + |
| 83 | +''' |
| 84 | +@param paramrut {string} = 16.751.256-9 / 16751256-9 |
| 85 | +@return {string} = 9 |
| 86 | +''' |
| 87 | +rut_get_dv = lambda paramrut : rut_clean(paramrut.split('-', 1)[1]) |
| 88 | + |
| 89 | + |
| 90 | +''' |
| 91 | +@param paramrut {string} = 16751256 |
| 92 | +@return {string} = 167512569 |
| 93 | +''' |
| 94 | +rut_add_dv = lambda paramrut : '{}-{}'.format(paramrut, rut_calc_dv(paramrut)) |
| 95 | + |
| 96 | +''' |
| 97 | +test |
| 98 | +
|
| 99 | +test1 = rut_clean('16.752.156-9'); |
| 100 | +test2 = rut_calc_dv('16751256'); |
| 101 | +test3 = rut_validate('16.751.256-9'); |
| 102 | +test4 = rut_validate('16.751.256-8'); |
| 103 | +test5 = rut_format('167512569'); |
| 104 | +test6 = rut_get_number('16751256'); |
| 105 | +test7 = rut_get_dv('16.751.256-9'); |
| 106 | +test8 = rut_add_dv('16751256'); |
| 107 | +
|
| 108 | +print(test1, test2, test3, test4, test5, test6, test7, test8); |
| 109 | +result: |
| 110 | +('167521569', '9', True, False, '16.751.256-9', '16751256', '9', '16751256-9') |
| 111 | +''' |
0 commit comments