校验码工具 - CheckUtil

由来

校验码广泛用于条形码、身份证号、银行卡号等场景,用于检测输入错误。CheckUtil 提供了 EAN/UPC 条形码校验位和 Verhoeff 校验位算法,以及常用的格式校验方法。

方法

EAN/UPC 校验位

from hutool import CheckUtil

# 计算校验位
CheckUtil.ean_digit('400599871650')   # '2'
CheckUtil.ean_digit('1234567890123')  # '1'

# 验证条形码
CheckUtil.verify_ean('4005998000007')   # True
CheckUtil.verify_ean('4005998000000')   # False

Verhoeff 校验位

Verhoeff 算法基于二面体群 D₅,可检测所有单字符错误和相邻换位错误,优于传统模 10 校验:

# 计算校验位
CheckUtil.verhoeff_digit('123456654321')  # '9'
CheckUtil.verhoeff_digit('1')             # '5'

# 验证
CheckUtil.verify_verhoeff('1234566543219')  # True
CheckUtil.verify_verhoeff('1234566543210')  # False

# 生成带校验位的 ID
CheckUtil.build_verhoeff_id('Foo', 1)          # 'Foo00011'
CheckUtil.build_verhoeff_id('ORD', 123, length=6)  # 'ORD000123...'

格式校验

# MAC 地址
CheckUtil.is_mac('00:1A:2B:3C:4D:5E')  # True
CheckUtil.is_mac('00-1A-2B-3C-4D-5E')  # True
CheckUtil.is_mac('invalid')             # False

# 中文字符
CheckUtil.is_chinese('你好世界')    # True
CheckUtil.is_chinese('你好world')   # False

# 英文字母
CheckUtil.is_english('Hello')      # True
CheckUtil.is_english('Hello123')   # False

# 符号
CheckUtil.is_symbol('!@#$%')       # True
CheckUtil.is_symbol('!@#abc')      # False

# URL
CheckUtil.contains_url('visit https://example.com now')  # True
CheckUtil.contains_url('no url here')                     # False

# 空白行
CheckUtil.is_blank_line('   ')  # True
CheckUtil.is_blank_line('hello') # False

# QQ 号
CheckUtil.is_qq('123456789')   # True(5-11 位,不以 0 开头)
CheckUtil.is_qq('01234')       # False

# 日期时间
CheckUtil.is_date_time('2024-01-15 08:30:00')  # True
CheckUtil.is_date_time('2024-13-01 00:00:00')  # False

# 邮编
CheckUtil.is_post_code('100000')  # True
CheckUtil.is_post_code('1234')    # False

# 手机号
CheckUtil.is_phone_number('13812345678')  # True
CheckUtil.is_phone_number('12345678')     # False

# 银行卡号
CheckUtil.is_bank_card('6222021234567890123')  # True

# 日期
CheckUtil.is_date('2024-01-15')     # True
CheckUtil.is_date('2024/01/15')     # True

# IP 地址
CheckUtil.is_ip('192.168.1.1')      # True
CheckUtil.is_ip('::1')              # True

# Unicode 字符
CheckUtil.is_unicode('\\u4e2d')     # True

# DPD 校验位
CheckUtil.dpd_check_digit('12345')  # 校验位

Validator 验证器

Validator 提供 is_* 判断和 validate_* 校验(失败抛 ValidateException)两套方法:

from hutool import Validator

# is_* 系列 — 返回 bool
Validator.is_email('test@example.com')           # True
Validator.is_ipv4('192.168.1.1')                 # True
Validator.is_ipv6('::1')                         # True
Validator.is_url('https://example.com')           # True
Validator.is_uuid('550e8400-e29b-41d4-a716-446655440000')  # True
Validator.is_mobile('13812345678')               # True
Validator.is_plate_number('京A12345')             # True
Validator.is_car_vin('LSGJA52U7AH000001')       # True
Validator.is_birthday('1990-01-15')              # True
Validator.is_chinese_name('张三')                 # True
Validator.is_credit_code('91350100M000100Y43')   # True
Validator.is_citizen_id('110101199001011234')    # True
Validator.is_money('123.45')                     # True
Validator.is_general('hello_123')                # True
Validator.is_general_with_chinese('你好abc')      # True
Validator.is_word('Hello')                       # True
Validator.is_hex('FF00FF')                       # True
Validator.is_letter('abc')                       # True
Validator.is_number('123')                       # True
Validator.is_zip_code('100000')                  # True
Validator.is_between(5, 1, 10)                   # True
Validator.is_null(None)                          # True
Validator.is_not_null('abc')                     # True
Validator.is_empty([])                           # True
Validator.is_not_empty([1])                      # True
Validator.has_chinese('你好')                     # True
Validator.has_number('abc123')                   # True

validate_* 系列

# 校验通过返回 None,失败抛 ValidateException
Validator.validate_email('test@example.com')     # None
Validator.validate_mobile('13812345678')          # None
Validator.validate_not_empty('abc')               # None
Validator.validate_not_null('abc')                # None
Validator.validate_between(5, 1, 10)              # None
Validator.validate_upper_case('ABC')              # None
Validator.validate_lower_case('abc')              # None

# 自定义错误信息
Validator.validate_email('invalid', '邮箱格式错误')
# 抛出 ValidateException: 邮箱格式错误

索引校验

# checkIndexLimit — 索引范围校验
CheckUtil.check_index_limit(5, 10)  # True(5 < 10)
CheckUtil.check_index_limit(10, 10) # False(10 >= 10)

正则匹配校验

# validateMatchRegex — 正则匹配校验
Validator.validate_match_regex('abc123', r'^[a-z0-9]+$')  # True

备注

更多方法请参阅 API 参考 文档。