forked from Bhavika2101/Python_Algo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added barcode_validator.py (TheAlgorithms#6771)
* Update README.md Added Google Cirq references * Create barcode_validator.py Barcode/EAN validator * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update barcode_validator.py Included docstring and updated variables to snake_case * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update barcode_validator.py Included docset and updated bugs * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update barcode_validator.py Implemented the changes asked in review. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update barcode_validator.py Updated with f-string format * Update barcode_validator.py Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Christian Clauss <[email protected]>
- Loading branch information
1 parent
07e991d
commit 1aa7bd9
Showing
2 changed files
with
96 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
""" | ||
https://en.wikipedia.org/wiki/Check_digit#Algorithms | ||
""" | ||
|
||
|
||
def get_check_digit(barcode: int) -> int: | ||
""" | ||
Returns the last digit of barcode by excluding the last digit first | ||
and then computing to reach the actual last digit from the remaining | ||
12 digits. | ||
>>> get_check_digit(8718452538119) | ||
9 | ||
>>> get_check_digit(87184523) | ||
5 | ||
>>> get_check_digit(87193425381086) | ||
9 | ||
>>> [get_check_digit(x) for x in range(0, 100, 10)] | ||
[0, 7, 4, 1, 8, 5, 2, 9, 6, 3] | ||
""" | ||
barcode //= 10 # exclude the last digit | ||
checker = False | ||
s = 0 | ||
|
||
# extract and check each digit | ||
while barcode != 0: | ||
mult = 1 if checker else 3 | ||
s += mult * (barcode % 10) | ||
barcode //= 10 | ||
checker = not checker | ||
|
||
return (10 - (s % 10)) % 10 | ||
|
||
|
||
def is_valid(barcode: int) -> bool: | ||
""" | ||
Checks for length of barcode and last-digit | ||
Returns boolean value of validity of barcode | ||
>>> is_valid(8718452538119) | ||
True | ||
>>> is_valid(87184525) | ||
False | ||
>>> is_valid(87193425381089) | ||
False | ||
>>> is_valid(0) | ||
False | ||
>>> is_valid(dwefgiweuf) | ||
Traceback (most recent call last): | ||
... | ||
NameError: name 'dwefgiweuf' is not defined | ||
""" | ||
return len(str(barcode)) == 13 and get_check_digit(barcode) == barcode % 10 | ||
|
||
|
||
def get_barcode(barcode: str) -> int: | ||
""" | ||
Returns the barcode as an integer | ||
>>> get_barcode("8718452538119") | ||
8718452538119 | ||
>>> get_barcode("dwefgiweuf") | ||
Traceback (most recent call last): | ||
... | ||
ValueError: Barcode 'dwefgiweuf' has alphabetic characters. | ||
""" | ||
if str(barcode).isalpha(): | ||
raise ValueError(f"Barcode '{barcode}' has alphabetic characters.") | ||
elif int(barcode) < 0: | ||
raise ValueError("The entered barcode has a negative value. Try again.") | ||
else: | ||
return int(barcode) | ||
|
||
|
||
if __name__ == "__main__": | ||
import doctest | ||
|
||
doctest.testmod() | ||
""" | ||
Enter a barcode. | ||
""" | ||
barcode = get_barcode(input("Barcode: ").strip()) | ||
|
||
if is_valid(barcode): | ||
print(f"'{barcode}' is a valid Barcode") | ||
else: | ||
print(f"'{barcode}' is NOT is valid Barcode.") |