dsh-checkdigit
Check-digit mathematics toolbox for DeepSeek Harness (dsh): generate, validate and detect check digits for 11 schemes — Luhn, Verhoeff, Damm, ISBN-10, ISBN-13, EAN-8, EAN-13, UPC-A, ISIN, CUSIP and IBAN.
校验位数学工具箱:生成 / 验证 / 识别 11 种校验位(Luhn、Verhoeff、Damm、ISBN、EAN、UPC、ISIN、CUSIP、IBAN),零运行时依赖、纯本地算术。
Why
Language models routinely botch check-digit arithmetic: wrong card-number checksums, ISBNs that fail validation, IBANs with impossible check digits. Every algorithm here is implemented from its published specification with pure integer arithmetic — deterministic, offline, zero runtime dependencies — and cross-checked against published worked examples (Apple's US0378331005, the classic GB82 WEST 1234 5698 7654 32, the Luhn textbook example 79927398713, and more).
Install
dsh plugin --profile web add github:TYEclipse/dsh-checkdigit
Then add dsh-checkdigit to dsh.profile.bundles in your profile's package.json if it is not auto-activated, and restart dsh.
Tools
checkdigit_generate
Compute the check digit for a payload and return the complete identifier.
checkdigit_generate(scheme="luhn", payload="7992739871")
→ checkDigit: "3", complete: "79927398713"
Supported scheme values and their payloads:
| scheme | payload | check digit | example complete |
|---|---|---|---|
luhn |
digits (any length ≥ 1) | last digit | 79927398713 |
verhoeff |
digits (any length ≥ 1) | last digit | 2363 |
damm |
digits (any length ≥ 1) | last digit | 5724 |
isbn10 |
9 digits | 10th char (0-9 or X) | 0306406152 |
isbn13 |
12 digits | 13th digit | 9780306406157 |
ean8 |
7 digits | 8th digit | 96385074 |
ean13 |
12 digits | 13th digit | 4006381333931 |
upca |
11 digits | 12th digit | 036000291452 |
isin |
2 letters + 9 alphanumerics | 12th char (digit) | US0378331005 |
cusip |
8 chars from [A-Z0-9*@#] |
9th char (digit) | 037833100 |
iban |
2-letter country + BBAN | chars 3–4 (two digits) | GB82WEST12345698765432 |
Use it to build test card numbers, ISBNs, barcodes, securities identifiers or account numbers whose check digits actually verify.
checkdigit_validate
Verify the check digit of a full identifier. The scheme is auto-detected when omitted (ISIN → CUSIP → IBAN → EAN-13 → UPC-A → EAN-8 → ISBN-10 → Luhn); pass scheme to force one.
checkdigit_validate(value="GB82WEST12345698765432")
→ valid: true, scheme: "iban", iban.country: "GB", iban.formatted: "GB82 WEST 1234 5698 7654 32"
checkdigit_validate(value="79927398714")
→ valid: false, scheme: "luhn", checkDigit: "4", expected: "3",
detail: "Luhn: check digit should be 3, but the value ends in 4"
Spaces and dashes in the input are ignored. When a value is invalid, the result carries the expected check digit so callers can fix it programmatically.
checkdigit_info
Describe the supported schemes: identifier lengths, payload formats, check-digit positions and worked examples. Call with a scheme for one scheme, or without arguments for all 11.
Supported schemes
| Scheme | Standard | Detail |
|---|---|---|
| Luhn | ISO/IEC 7812 | Credit/debit cards, IMEI, loyalty cards |
| Verhoeff | — | Dihedral-group checksum; catches all single errors and adjacent transpositions |
| Damm | — | Quasigroup operation; full-value tally must be zero |
| ISBN-10 | ISO 2108 | Mod-11; check digit may be X (= 10) |
| ISBN-13 | ISO 2108 | EAN-13 arithmetic (Bookland) |
| EAN-8 / EAN-13 | GS1 GTIN-8 / GTIN-13 | Retail barcodes |
| UPC-A | GS1 GTIN-12 | North American retail barcodes |
| ISIN | ISO 6166 | Securities; letters expand A=10…Z=35, then Luhn |
| CUSIP | ANSI X9.6 | North American securities; * @ # allowed; even positions doubled |
| IBAN | ISO 13616 | Mod-97 over letter-expanded rearranged string; BBAN length table for 75+ countries |
Development
pnpm install
pnpm build
pnpm test # 51 tests, anchors cross-checked against published worked examples
pnpm lint
License
MIT
No comments yet. Be the first to write one.