Check-digit algorithms and identifier validation for MoonBit: Luhn, Verhoeff, Damm, payment cards, IBAN, IMEI, resident IDs, Aadhaar, VIN, ISIN, LEI, USCC, CPF, CNPJ, BSN, codice fiscale, GS1 retail barcodes (EAN/UPC/GTIN) and bibliographic numbers (ISBN, ISSN)
///|
fn main {
// 7992739871 -> check digit 3
println(luhn_check_digit("7992739871")) // Some(3)
println(luhn_valid("79927398713")) // true
// Brand detection and full card check
println(detect_brand("378282246310005")) // amex
println(card_valid("378282246310005")) // true
// IBAN accepts spaces and lowercase
println(iban_valid("gb82 west 1234 5698 7654 32")) // true
println(iban_format("GB82WEST12345698765432")) // Some("GB82 WEST 1234 5698 7654 32")
// Identifiers that carry a check character of their own
println(cn_id_birthdate("11010519491231002X")) // Some("19491231")
println(vin_valid("1M8GDM9AXKP042788")) // true
println(isin_country("US0378331005")) // Some("US")
println(lei_lou("529900T8BM49AURSDO55")) // Some("5299")
// Formatting helpers for the identifiers that have a printed form
println(cpf_format("11144477735")) // Some("111.444.777-35")
println(cnpj_format("11222333000181")) // Some("11.222.333/0001-81")
println(uscc_division("91350100M000100Y43")) // Some("350100")
// Retail barcodes and bibliographic numbers
println(ean13_valid("4006381333931")) // true
println(upce_expand("07832309")) // Some("078000003239")
println(isbn10_to_isbn13("0306406152")) // Some("9780306406157")
}| Area | Functions |
|---|---|
| Luhn (mod 10) | luhn_valid, luhn_check_digit |
| Verhoeff (dihedral group D5) | verhoeff_valid, verhoeff_check_digit |
| Damm (anti-symmetric quasigroup) | damm_valid, damm_check_digit |
| Payment cards | card_valid, detect_brand, card_format, CardBrand |
| IBAN (ISO 13616) | iban_valid, iban_country, iban_bban, iban_format, iban_normalize, iban_expected_length, iban_check_digits, iban_assemble |
| IMEI (3GPP TS 23.003) | imei_valid, imei_check_digit, imei_tac, imei_serial |
| Resident ID (GB 11643) | cn_id_valid, cn_id_check_char, cn_id_region, cn_id_birthdate |
| Aadhaar | aadhaar_valid, aadhaar_check_digit |
| VIN (ISO 3779) | vin_valid, vin_check_char, vin_wmi, vin_vis |
| ISIN (ISO 6166) | isin_valid, isin_check_digit, isin_country |
| LEI (ISO 17442) | lei_valid, lei_check_digits, lei_lou |
| Unified social credit id (GB 32100) | uscc_valid, uscc_check_char, uscc_division |
| CPF (Brazil) | cpf_valid, cpf_check_digits, cpf_format |
| CNPJ (Brazil) | cnpj_valid, cnpj_check_digits, cnpj_format |
| BSN (Netherlands) | bsn_valid, bsn_check_digit |
| Codice fiscale (Italy) | cf_valid, cf_check_char |
| GTIN / retail barcode (GS1) | gtin_valid, gtin_check_digit, ean8_valid, ean13_valid, upca_valid, upce_valid, gtin14_valid, upce_expand, upce_check_digit |
| ISBN / ISSN (bibliographic) | isbn10_valid, isbn10_check_char, isbn13_valid, isbn13_check_digit, isbn10_to_isbn13, issn_valid, issn_check_char |
moon add sssssurf/checkdigitmoon run cmd/main -- card 378282246310005
moon run cmd/main -- iban "gb82 west 1234 5698 7654 32"
moon run cmd/main -- imei 490154203237518
moon run cmd/main -- luhn 7992739871
moon run cmd/main -- verhoeff 236
moon run cmd/main -- damm 572
moon run cmd/main -- cnid 11010519491231002X
moon run cmd/main -- aadhaar 234123412346
moon run cmd/main -- vin 1M8GDM9AXKP042788
moon run cmd/main -- isin US0378331005
moon run cmd/main -- lei 529900T8BM49AURSDO55
moon run cmd/main -- uscc 91350100M000100Y43
moon run cmd/main -- cpf 11144477735
moon run cmd/main -- cnpj 11222333000181
moon run cmd/main -- bsn 111222333
moon run cmd/main -- cf RSSMRA85T10A562S
moon run cmd/main -- gtin 4006381333931
moon run cmd/main -- upce 07832309
moon run cmd/main -- isbn 9780306406157
moon run cmd/main -- issn 03785955$ moon run cmd/main -- imei 490154203237518
imei: 490154203237518
tac: 49015420
serial: 323751
check digit: 8
status: valid
$ moon run cmd/main -- lei 529900T8BM49AURSDO55
lei: 529900T8BM49AURSDO55
lou: 5299
expected check digits: 55
status: valid
$ moon run cmd/main -- gtin 4006381333931
gtin: 4006381333931
expected check digit: 1
status: valid
$ moon run cmd/main -- upce 07832309
upce: 07832309
expands to: 078000003239
expected check digit: 9
status: valid
$ moon run cmd/main -- isbn 9780306406157
isbn: 9780306406157
form: isbn-13
expected check digit: 7
status: valid| 已有库 | 它解决的问题 | 与本库的边界 |
|---|---|---|
| Betterlol/moon_zod、cosgammmmma/moonschema、QuietlyChan/moonschema、mizchi/jsonschema | JSON / 数据结构的 schema 校验:字段类型、必填、email / uuid / url 等格式约束 | 它们校验数据的形状与格式,不做任何算术校验位运算。本库只做数字标识符的校验位算法,不解析 JSON,也不定义 schema。 |
| ryota0624/moovalid、kosei28/maru | 通用校验组合子(Validated、错误累积、in_range 等) | 它们提供校验框架;本库提供具体领域算法。本库不提供错误累积或组合子 API。 |
| Han-Wentao/mooncontract | OpenAPI 契约校验与 mock | 它校验接口契约(请求 / 响应结构),属于 API 层;本库处理的是单个标识符字符串内部的校验位。 |
| ZJH-666-ZJH/moonmrz | ICAO 9303 机读区(护照 / 签证 MRZ)的 7-3-1 校验位 | 唯一的交集是"校验位"这个概念。它面向旅行证件 MRZ 文本,使用 ICAO 9303 的 7-3-1 加权方案;本库面向支付卡 / 银行账号 / 设备号 / 证券与法人标识,使用 Luhn、Verhoeff、Damm、ISO 7064 与 mod-97。两者的算法、输入格式、应用领域均不同。 |
moon testnode scripts/check-docs.mjsmoon run cmd/demopub enum CardBrand {
Visa
Mastercard
Amex
Discover
Jcb
DinersClub
UnionPay
Maestro
Unknown
}fn aadhaar_check_digit(first11 : String) -> Int?fn bsn_check_digit(first8 : String) -> Int?fn bsn_valid(s : String) -> Boolfn card_format(s : String) -> String?fn card_valid(s : String) -> Boolfn cf_check_char(first15 : String) -> String?fn cf_valid(s : String) -> Boolfn cn_id_birthdate(s : String) -> String?fn cn_id_check_char(first17 : String) -> String?fn cn_id_region(s : String) -> String?fn cn_id_valid(s : String) -> Boolfn cnpj_check_digits(first12 : String) -> String?fn cnpj_format(s : String) -> String?fn cnpj_valid(s : String) -> Boolfn cpf_check_digits(first9 : String) -> String?fn cpf_format(s : String) -> String?fn cpf_valid(s : String) -> Boolfn damm_check_digit(payload : String) -> Int?fn damm_valid(s : String) -> Boolfn ean13_valid(s : String) -> Boolfn ean8_valid(s : String) -> Boolfn gtin14_valid(s : String) -> Boolfn gtin_check_digit(payload : String) -> Int?fn gtin_valid(s : String) -> Boolfn iban_assemble(country : String, bban : String) -> String?fn iban_bban(s : String) -> String?fn iban_check_digits(country : String, bban : String) -> String?fn iban_country(s : String) -> String?fn iban_expected_length(cc : String) -> Int?fn iban_format(s : String) -> String?fn iban_normalize(s : String) -> Stringfn iban_valid(s : String) -> Boolfn imei_check_digit(first14 : String) -> Int?fn imei_serial(s : String) -> String?fn imei_tac(s : String) -> String?fn imei_valid(s : String) -> Boolfn isbn10_check_char(first9 : String) -> Char?fn isbn10_to_isbn13(s : String) -> String?fn isbn10_valid(s : String) -> Boolfn isbn13_check_digit(first12 : String) -> Int?fn isbn13_valid(s : String) -> Boolfn isin_check_digit(first11 : String) -> Int?fn isin_country(s : String) -> String?fn isin_valid(s : String) -> Boolfn issn_check_char(first7 : String) -> Char?fn issn_valid(s : String) -> Boolfn lei_check_digits(first18 : String) -> String?fn lei_lou(s : String) -> String?fn lei_valid(s : String) -> Boolfn luhn_check_digit(payload : String) -> Int?fn luhn_valid(s : String) -> Boolfn upca_valid(s : String) -> Boolfn upce_check_digit(first7 : String) -> Int?fn upce_expand(s : String) -> String?fn upce_valid(s : String) -> Boolfn uscc_check_char(first17 : String) -> String?fn uscc_division(s : String) -> String?fn uscc_valid(s : String) -> Boolfn verhoeff_check_digit(payload : String) -> Int?fn verhoeff_valid(s : String) -> Boolfn vin_check_char(first17 : String) -> String?fn vin_valid(s : String) -> Boolfn vin_vis(s : String) -> String?fn vin_wmi(s : String) -> String?Install
Download zipCheck-digit algorithms and identifier validation for MoonBit: Luhn, Verhoeff, Damm, payment cards, IBAN, IMEI, resident IDs, Aadhaar, VIN, ISIN, LEI, USCC, CPF, CNPJ, BSN, codice fiscale, GS1 retail barcodes (EAN/UPC/GTIN) and bibliographic numbers (ISBN, ISSN)