From 1c18b3236db7ac03146981d26a8258b5e62117c8 Mon Sep 17 00:00:00 2001 From: Henadzi Rabkin Date: Tue, 2 Jan 2024 19:52:08 +0100 Subject: [PATCH] Update EAN13.swift EAN13 calculation corrected --- Sources/BarcodeView/Models/EAN13.swift | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Sources/BarcodeView/Models/EAN13.swift b/Sources/BarcodeView/Models/EAN13.swift index f609397..90f971f 100644 --- a/Sources/BarcodeView/Models/EAN13.swift +++ b/Sources/BarcodeView/Models/EAN13.swift @@ -70,16 +70,18 @@ extension EAN13 { return digits } - + private static func verifyChecksumDigit(value: String) -> Bool { - let digits = value.map { Int(String($0))! }.dropLast() - - let odd = stride(from: 1, to: digits.count, by: 2).map { digits[$0] }.reduce(0, +) * 3 - let even = stride(from: 0, to: digits.count, by: 2).map { digits[$0] }.reduce(0, +) - - let calculatedChecksum = 10 - ((odd + even) % 10) - - return String(calculatedChecksum) == value.last.map({ String($0) }) + let digits = value.compactMap { Int(String($0)) } + let lastDigit = digits.last! + + let evenSum = stride(from: 1, to: digits.count - 1, by: 2).map { digits[$0] }.reduce(0, +) * 3 + let oddSum = stride(from: 0, to: digits.count - 1, by: 2).map { digits[$0] }.reduce(0, +) + let totalSum = evenSum + oddSum + + let calculatedCheckDigit = totalSum % 10 == 0 ? 0 : 10 - totalSum % 10 + + return calculatedCheckDigit == lastDigit } }