» »

Kako (pravilno) preveti, ali je GTIN vrednost valid?

Kako (pravilno) preveti, ali je GTIN vrednost valid?

HotBurek ::

Dobro jutro.

Evo, nov dan, nov izziv.

Tokrat me zanima, kako preverit, ali je zapis GTIN-a (8, 12, 13 in 14) veljaven?

GTIN13: 7035620047176

Spletna stran [ https://eancheck.com/ ], [ https://www.gs1.org/services/verified-b... ] in [ https://worldbarcodes.com ] pravijo, da je GTIN valid.

Spodnja koda pravi, da ni.

Zanima me, če lahko kdo poda trden dokaz, da je zgornji GTIN13 valid oz. da ni. Ter, kako pridit do te informacije... po možnosti z testom v Python kodi.

Koda:
def luhn_check(gtin):

    # init is it valid
    is_it_valid = "false";

    # check if length is in 8, 12, 13, 14
    if len(gtin) in [8, 12, 13, 14]:

        # try
        try:

            # check if int
            gtin_test = int(gtin);

            # init total
            total = 0;

            # set reverse digits
            reverse_digits = str(gtin)[::-1];

            # luhn algorithm
            for i, digit in enumerate(reverse_digits):
                n = int(digit)
                if i % 2 == 1:
                    n *= 2
                    if n > 9:
                        n -= 9
                total = total + n;

            # check if total devided by 10 is 0
            if total % 10 == 0:

                # set is it valid
                is_it_valid = "true";

        except:

            pass;

    # return is it valid
    return is_it_valid;
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
  • spremenilo: HotBurek ()

HotBurek ::

Evo, s pomočjo spletnega pomočnika sem zadevo rešil.

Dejansko sploh ne vem, zakaj sem šel sem gor to spraševat... (bi bilo verjetno bolj primerno "ejga, a si se že učlanu v strelsko društvo").

Enivej.

Zadevo sem šel dodatno preverjat, ker sem v bazi imel okrog miljon pa pol GTIN-ov, od tega je neki kr en brezvezen tekst, ostalo so pa zapisi s številkami.

In je bilo po zgornjem algoritmu zgolj 10% valid, ostalih 90% pa kao ne. In se mi je to razmerje zdelo a bit too much.

Koda funkcije z algoritmom (plus moj stil):

def luhn_check(gtin):

    is_it_valid = "false";

    if len(gtin) in [8, 12, 13, 14]:

        try:

            # make digits
            digits = [int(d) for d in str(gtin)];

            # read last control/check digit
            check_digit = digits[-1];

            # exclude check digit
            digits = digits[:-1];

            # reverse the digits to apply weights from the right, as per GTIN rules
            digits = digits[::-1]

            # init total
            total = 0;

            # go after each digit
            for i, digit in enumerate(digits):

                # init weight
                weight = 0;

                # weights: 3,1,3,1,... from the right
                if (i % 2) == 0:

                    # set weight
                    weight = 3;

                else:

                    # set weight
                    weight = 1;

                # add to total
                total = total + (digit * weight);

            # calc check digit
            calc_check_digit = (10 - (total % 10)) % 10;

            # check if the same
            if check_digit == calc_check_digit:

                # set valid
                is_it_valid = "true";

        except :

            print("not int");

            pass;

    else:

        print("wrong len(" + str(len(gtin)) + ")");

    return is_it_valid;
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

Zgodovina sprememb…

  • spremenilo: HotBurek ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Nakazilo na napačen TRR (strani: 1 2 )

Oddelek: Loža
5411397 (8838) Vanquish
»

Lidl Pilos grški tip jogurta 2%

Oddelek: Loža
175343 (4286) Vuli
»

Kontakt obrazec

Oddelek: Izdelava spletišč
62150 (1995) betmen
»

Kaj je to UPC/EAN Code

Oddelek: Pomoč in nasveti
103549 (3202) No Can Do
»

Navijanje E6600 NUJNO

Oddelek: Navijanje
392948 (1705) M-XXXX

Več podobnih tem