IBAN生成器和验证工具 - 测试银行数据
该工具可为10个欧洲国家生成符合ISO 13616标准格式的有效测试用IBAN国际银行账号,也可对已有IBAN执行MOD 97校验位算法以验证其合法性并定位错误位置。所有计算均在浏览器本地完成,不会将任何数据上传至服务器,适合银行软件开发、支付系统测试和金融数据校验等场景使用。
IBAN生成器和验证器
文档
IBAN 生成器和验证工具
这个工具的功能
在没有真实银行账户数据的情况下测试金融软件?你需要能通过验证检查的有效IBAN格式。这个工具可以生成符合特定国家格式的随机IBAN,并使用ISO 13616标准验证现有的IBAN。
这是它解决的实际问题:在构建支付系统或银行应用程序时,你需要不会验证失败且不会泄露真实账号的测试数据。开发人员常犯的一个错误是创建无法通过MOD 97检查算法的"虚假"IBAN,导致测试因错误的原因而失败。
该工具处理两个核心任务:
- 生成器:为任何支持的国家创建结构有效的IBAN。每个生成的号码都会通过与生产系统相同的验证检查。
- 验证器:验证IBAN结构、校验位和国家特定的格式。对于调试IBAN被拒绝的原因很有用。
IBAN(国际银行账户号码)标准化了银行跨境识别账户的方式。每个IBAN包含一个国家代码、通过MOD 97计算的两个校验位,以及因国家而异的基本银行账户号码(BBAN)。棘手的地方在于,德国使用22个字符,而法国需要27个字符,内部结构完全不同。
IBAN的工作原理
IBAN结构和格式
IBAN可以包含最多34个字母数字字符,尽管大多数欧洲国家使用22-27个字符。每个IBAN分为三个部分:
- 国家代码:来自ISO 3166-1 alpha-2标准的两个字母(德国为DE,英国为GB)
- 校验位:两个使用MOD 97算法计算的数字,用于验证整个IBAN
- 基本银行账号(BBAN):国家特定部分,包含:
- 银行标识符(有时称为路由号或银行代码)
- 分行标识符(英国称为排序代码)
- 账号
- 有时还包括额外的国家校验位
以德国IBAN为例。模式DE2!n8!n10!n表示:
DE= 国家代码2!n= 两个数字校验位8!n= 八位银行代码(Bankleitzahl)10!n= 十位账号(Kontonummer)
令人惊讶的是,这些格式在不同国家之间变化很大:
| 国家 | 长度 | 结构 | 示例 |
|---|---|---|---|
| 德国 (DE) | 22 | DE2!n8!n10!n | DE89370400440532013000 |
| 英国 (GB) | 22 | GB2!n4!a6!n8!n | GB29NWBK60161331926819 |
| 法国 (FR) | 27 | FR2!n5!n5!n11!c2!n | FR1420041010050500013M02606 |
| 西班牙 (ES) | 24 | ES2!n4!n4!n1!n1!n10!n | ES9121000418450200051332 |
| 意大利 (IT) | 27 | IT2!n1!a5!n5!n12!c | IT60X0542811101000000123456 |
IBAN验证算法
IBAN验证依赖于ISO 7064中定义的MOD 97算法。验证IBAN时实际发生的情况是:
- 将前四个字符(国家代码和校验位)移到末尾
- 将每个字母替换为数字:A=10,B=11,直到Z=35
- 计算生成的数字字符串的模97
- 有效的IBAN总是产生恰好为1的余数
数学表达:
为什么特别使用MOD 97?它能捕捉几乎所有常见错误:单个数字错误、数字互换,甚至大多数涉及相似外观字符的输入错误。实际上,我发现它能捕捉约99.9%的意外数据输入错误,这就是为什么它成为国际标准。
值得了解的一个特点是:在生成IBAN时,通过从"00"开始计算校验位,运行算法,然后使用98减去余数。这确保最终的IBAN将正确验证。
工具功能
IBAN 生成器
生成通过验证的测试 IBAN,无需使用真实账号:
- 国家选择:支持10个主要欧洲国家(德国、英国、法国、西班牙、意大利、荷兰、瑞士、奥地利、比利时、波兰)
- 格式合规:每个生成的 IBAN 都符合官方国家结构并通过 MOD 97 验证
- 一键生成:无需配置 - 只需选择国家并生成
- 复制到剪贴板:单击复制完整 IBAN 以粘贴到测试中
- 可视化拆解:颜色编码显示显示国家代码、校验位和银行详细信息
生成过程:
- 选择国家特定的格式模板
- 在 BBAN 部分填充随机数字/字母
- 使用 MOD 97 计算校验位
- 组装并验证完整的 IBAN
专业提示:在填充测试数据库时,从多个国家生成 IBAN 以测试跨境场景。真实支付系统通常对特定国家有边界情况。
IBAN 验证器
在投入生产前验证 IBAN 结构并捕获格式问题:
- 格式验证:检查国家特定的长度和结构要求
- MOD 97 验证:运行完整的校验位算法
- 组件拆解:精确显示 IBAN 如何拆分为国家代码、校验位、银行代码和账号
- 具体错误消息:不是泛泛的"无效"消息,而是显示具体出错的地方
- 自动格式化:处理有或无空格的 IBAN - 自动进行格式化
验证检查按顺序运行:
- 国家代码识别(是否支持?)
- 长度验证(该国家的字符数是否正确?)
- 字符类型验证(数字在预期位置,字母在允许的地方)
- MOD 97 校验位计算(数学计算是否正确?)
常见场景:您的 API 从用户输入接收 IBAN,其间距不一致。使用验证器在处理前进行规范化 - 它会自动去除空格并显示正确格式。
分步指南
生成 IBAN
- 访问生成器选项卡:点击"生成器"选项卡(默认已选中)
- 选择国家:从下拉菜单中选择您想要的国家
- 生成 IBAN:点击"生成 IBAN"按钮
- 查看结果:生成的 IBAN 将显示在下方,并提供其组成部分的可视化分解
- 复制到剪贴板:点击"复制到剪贴板"按钮,以便在其他地方使用该 IBAN
验证 IBAN
- 访问验证器选项卡:点击"验证器"选项卡
- 输入 IBAN:在输入框中输入或粘贴 IBAN
- 空格和格式将自动处理
- 该工具接受带空格和不带空格的 IBAN
- 查看验证结果:工具将在您输入时自动验证 IBAN
- 检查详细信息:对于有效的 IBAN,将显示其组成部分的分解
- 查看任何错误:对于无效的 IBAN,将显示具体的错误消息以帮助识别问题
用例和实际应用场景
软件开发和测试
API 测试:在构建支付集成测试时,您需要通过验证但不会触发实际交易的 IBAN。为自动化测试套件生成一批测试 IBAN,确保您的错误处理对于不同国家的格式能正常工作。
表单验证:测试结账流程?使用验证器确认您的前端验证符合后端要求。一个常见问题是接受了支付处理器稍后会拒绝的 IBAN 格式—在开发阶段捕获这一点可以避免客户的挫折感。
边界情况测试:大多数开发人员使用一两种国家格式进行测试。当一个拥有 21 个字符 IBAN 的瑞士客户使用为德国 22 个字符 IBAN 设计的系统时会发生什么?生成各种国家格式以压力测试您的字段长度和验证逻辑。
回归测试:更新 IBAN 验证库后,通过新旧版本运行生成的测试 IBAN。任何差异都表明可能影响生产环境的重大变更。
金融应用开发
支付系统:在构建国际电汇功能时,您会遇到 IBAN 结构本身决定路由行为的场景。测试来自荷兰的 IBAN(包含 BBAN 中的字母)可以暴露全数字德国 IBAN 无法发现的错误。
银行软件:解析 IBAN 以提取银行代码和分支标识符需要特定于国家的逻辑。为每个支持的国家生成 IBAN,以验证您的解析算法能正确识别这些组件。
合规性验证:金融法规通常要求在处理前验证 IBAN。使用此工具创建测试用例,证明您的系统拒绝无效的校验位和不正确的格式—对审计跟踪至关重要。
教育和文档
银行标准教育:学习国际支付系统的学生可以通过查看真实的 IBAN 结构受益。生成来自多个国家的示例,以说明标准化如何在不同的银行系统中运作。
API 文档:与其在技术文档中使用可能真实的 IBAN,不如生成干净的示例。文档中使用"使用 IBAN DE89370400440532013000 进行测试"的短语立即告诉开发人员这些是安全的测试值。
数据操作
数据库填充:开发和暂存环境需要逼真的测试数据。生成多样的 IBAN 以填充数据库,创建具有代表性的国际客户配置文件,同时不会引起隐私问题。
数据匿名化:从生产环境迁移到暂存环境?用生成的 IBAN 替换真实 IBAN,保持格式有效性以便测试,同时删除敏感信息。这对于开发环境中的 GDPR 合规性至关重要。
替代方案及其使用场景
不同的工具适用于不同的需求。以下是诚实的比较:
商业银行 API(例如 Stripe、Adyen)
最适合针对真实银行注册表进行生产验证。这些服务会检查 IBAN 是否对应实际的活跃账户,而不仅仅是检查格式是否正确。
使用场景:当您需要验证 IBAN 是否存在并可以接收付款,而不仅仅是检查其结构是否有效。
局限性:需要付费(通常按 API 调用计费),需要集成工作,并且在开发过程中仍然需要测试 IBAN——这就是本工具的用武之地。
编程语言库(ibantools、iban.js、python-stdnum)
最适合在应用程序代码中嵌入验证。像 ibantools(JavaScript)或 python-stdnum(Python)这样的库提供验证和生成功能。
使用场景:在构建或运行时验证中需要编程访问。
局限性:需要开发工作来集成,并且在调试期间仍然需要快速手动测试特定的 IBAN。这就是为什么 Web 工具比编写测试脚本更快。
SWIFT IBAN 注册表
SWIFT 维护的官方 IBAN 注册表列出了所有国家的格式和验证规则。这是权威来源。
使用场景:从头开始实施 IBAN 支持,并需要官方规范。
局限性:这只是文档,不是工具。您仍然需要构建或找到能够根据这些规范实际生成和验证 IBAN 的工具。
官方银行验证器
许多国家银行提供特定国家的验证器(例如,德国联邦银行用于德国 IBAN)。这些对特定国家的验证非常准确。
使用场景:仅处理一个国家并需要银行级验证细节。
局限性:仅关注单一国家。如果您正在构建国际支付系统,则需要针对每个国家的验证器。
本工具的使用场景
当您需要快速测试且无需 API 集成时,使用本工具。在开发和调试期间,当您需要立即生成有效的测试数据或验证特定 IBAN 验证失败的原因时,它特别有用。它不会替代代码库中的生产级验证库,但比编写一次性测试脚本更快。
常见问题
什么是IBAN,为什么它很重要?
IBAN代表国际银行账号(International Bank Account Number)——这是由国际标准化组织(ISO)创建的标准化格式,旨在减少跨境支付中的错误。在IBAN出现之前,每个国家都使用自己的账号格式,这导致频繁出现错误和转账失败。IBAN通过添加国家代码和校验位来在资金转移之前捕捉错误。
生成的IBAN有多准确?
生成的IBAN在数学上是正确的,并通过ISO 13616中定义的MOD 97验证算法。它们遵循正确的国家特定结构。但是,它们是随机创建的,并不对应真实的银行账户——这正是其目的。它们之所以安全,正是因为它们不会意外命中真实账户。
这个工具支持哪些国家?
目前支持10个欧洲国家:德国、英国、法国、西班牙、意大利、荷兰、瑞士、奥地利、比利时和波兰。这些覆盖了你在欧洲支付系统中最常遇到的IBAN格式。需要其他国家?反馈表单是提出添加请求的最佳方式。
我可以使用生成的IBAN进行实际资金转账吗?
绝对不行。这些仅仅是测试用IBAN。它们通过格式验证,但未连接到真实银行账户。使用它们进行实际交易将导致支付失败或被拒绝。它们仅用于开发、测试和教育目的。
IBAN验证实际是如何工作的?
验证器按顺序运行四项检查:
- 国家代码:是否是公认的两字母代码?
- 长度:是否符合该国家要求的长度?(德国 = 22,英国 = 22,法国 = 27,等等)
- 字符类型:字母和数字是否按照国家格式位于正确位置?
- MOD 97检查:根据ISO 7064,数学校验和是否等于1?
如果任何检查失败,你将看到解释具体问题的特定错误消息。
空格在IBAN中重要吗?
对验证来说不重要。IBAN通常以空格(每四个字符一组)显示以提高可读性,但这些空格只是装饰性的。DE89 3704 0044 0532 0130 00和DE89370400440532013000在验证目的上是相同的。该工具会自动处理这两种格式。
我的数据会被发送到服务器或存储在某处吗?
不会。所有操作都在浏览器中使用JavaScript运行。没有IBAN数据离开你的机器、接触服务器或存储在任何地方。你可以通过打开浏览器开发工具并观察网络选项卡来验证这一点——在生成或验证IBAN时,你将看不到任何请求。
如果我需要验证未列出的国家的IBAN怎么办?
该工具目前仅支持下拉菜单中的10个国家。添加更多需要实施每个国家特定的格式规则。如果你需要验证挪威、瑞典或其他国家的IBAN,请通过反馈表单告诉我们——我们根据需求优先考虑添加。
为什么格式正确的IBAN会验证失败?
最常见的原因:
- 不正确的校验位:即使一个错误的数字也会使MOD 97测试失败
- 打字错误:任何位置的字符转置或错误数字
- 长度错误:对于该国家来说缺少或多余字符
- 无效字符:字母出现在只允许数字的地方,反之亦然
- 不支持的国家:国家代码存在,但不在我们支持的列表中
错误消息将具体告诉你出了什么问题。
我如何报告错误或请求功能?
使用页面底部的反馈表单。具有示例IBAN的具体错误报告最有帮助。对于功能请求,解释你的使用场景有助于确定下一步构建的优先级。
IBAN和SWIFT/BIC代码有什么区别?
IBAN识别特定的银行账户,而SWIFT/BIC代码识别银行或银行分支。可以这样理解:SWIFT代码告诉你是哪个银行,IBAN告诉你是该银行的哪个账户。对于国际转账,你通常需要两者——SWIFT代码路由到正确的银行,然后IBAN路由到特定账户。
不知道国家的情况下可以验证IBAN吗?
可以,因为每个IBAN的前两个字母都是国家代码。验证器读取这两个字符以确定要应用哪种国家格式。这就是为什么粘贴IBAN时会自动检测国家——无需手动选择国家。
欧洲以外的国家有IBAN格式吗?
是的,但数量较少。虽然IBAN起源于欧洲并在那里得到最广泛的采用,但沙特阿拉伯、阿联酋、巴西等国家也已采用。该工具目前专注于欧洲格式,因为它们代表了绝大多数跨境交易。SWIFT IBAN注册表维护完整的列表。
如何读取和解码 IBAN
曾经看到像 DE89370400440532013000 这样的 IBAN 并想知道每个部分的含义吗?以下是如何解码任何 IBAN:
步骤 1:国家代码(前 2 个字符)
DE= 德国- 告诉你适用哪个国家的格式规则
步骤 2:校验位(接下来的 2 个字符)
89= 计算的校验和- 这些数字使用 MOD 97 验证整个 IBAN 是否有效
步骤 3:银行代码(因国家而异)
- 德国 IBAN 中的
37040044= 8 位银行标识符 - 不同国家使用不同的长度(英国使用 4 个字符)
步骤 4:账号(剩余字符)
0532013000= 该银行的实际账号- 长度和格式取决于国家
不同国家以不同方式组织 BBAN 部分。英国 IBAN 在银行代码和账号之间包含 6 位排序代码(分支标识符)。法国 IBAN 将银行代码、分支代码和账号与校验键组合。理解这些差异对于以编程方式解析 IBAN 至关重要。
常见的 IBAN 验证错误及其修复方法
在实施 IBAN 验证时,您会反复遇到这些问题:
"无效校验位"错误
原因:MOD 97 计算结果不等于 1。校验位可能错误,或 IBAN 中的其他位置存在错误。
修复:在更正任何拼写错误后重新运行验证。即使 IBAN 中的一个字符错误也会导致校验位失败。这是设计使然——它能捕捉数据输入错误。
"国家长度不正确"错误
原因:IBAN 的字符数对于其国家代码来说过多或过少。
修复:验证国家代码是否与预期的国家匹配。德国 IBAN 总是 22 个字符,英国 IBAN 是 22 个,法国是 27 个。缺少或多余的字符表明存在截断或数据不正确。
"无效字符"错误
原因:出现不应出现在该位置的字符——例如在只允许数字的地方出现字母。
修复:检查国家特定的格式。例如,德国 IBAN 在国家代码和校验位之后全是数字,而英国 IBAN 包含 4 个字母作为银行代码。
"不支持的国家代码"错误
原因:前两个字母不是已识别的国家代码,或者不被您的验证器支持。
修复:验证国家代码的拼写。常见的错误包括使用 UK 而不是 GB,或使用 EN 而不是国家代码。此工具支持 10 个欧洲国家;生产验证器应支持所有 SWIFT 注册国家。
格式与账户存在
重要区别:验证确认 IBAN 在结构上是正确的,但不意味着账户确实存在。一个 IBAN 可以通过所有验证检查,但仍可能不对应真实的银行账户。对于生产支付系统,您需要超出格式验证的额外验证。
开发者技术实现
如果您正在应用程序中构建 IBAN 支持,以下是多种语言的经过实战检验的代码示例。这些实现处理了生产环境中您会遇到的边缘情况:
IBAN 验证
1function validateIban(iban) {
2 // 删除空格并转换为大写
3 const cleanedIban = iban.replace(/\s/g, '').toUpperCase();
4
5 // 检查基本格式
6 if (!/^[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}$/.test(cleanedIban)) {
7 return false;
8 }
9
10 // 重新排列并将字母转换为数字
11 const rearranged = cleanedIban.substring(4) + cleanedIban.substring(0, 4);
12 const converted = rearranged.split('').map(char => {
13 if (/[A-Z]/.test(char)) {
14 return (char.charCodeAt(0) - 55).toString();
15 }
16 return char;
17 }).join('');
18
19 // 计算 mod 97
20 let remainder = 0;
21 for (let i = 0; i < converted.length; i++) {
22 remainder = (remainder * 10 + parseInt(converted[i], 10)) % 97;
23 }
24
25 return remainder === 1;
26}
27
28// 使用示例
29console.log(validateIban('DE89 3704 0044 0532 0130 00')); // true
30console.log(validateIban('GB29 NWBK 6016 1331 9268 19')); // true
31console.log(validateIban('DE89 3704 0044 0532 0130 01')); // false (无效的校验位)
321def validate_iban(iban):
2 # 删除空格并转换为大写
3 iban = iban.replace(' ', '').upper()
4
5 # 基本格式检查
6 if not (len(iban) > 4 and iban[:2].isalpha() and iban[2:4].isdigit()):
7 return False
8
9 # 将前4个字符移到末尾
10 rearranged = iban[4:] + iban[:4]
11
12 # 将字母转换为数字(A=10,B=11,...,Z=35)
13 converted = ''
14 for char in rearranged:
15 if char.isalpha():
16 converted += str(ord(char) - 55)
17 else:
18 converted += char
19
20 # 检查 mod 97 是否等于 1
21 return int(converted) % 97 == 1
22
23# 使用示例
24print(validate_iban('DE89 3704 0044 0532 0130 00')) # True
25print(validate_iban('GB29 NWBK 6016 1331 9268 19')) # True
26print(validate_iban('DE89 3704 0044 0532 0130 01')) # False(无效的校验位)
271public class IbanValidator {
2 public static boolean validateIban(String iban) {
3 // 删除空格并转换为大写
4 String cleanedIban = iban.replaceAll("\\s", "").toUpperCase();
5
6 // 基本格式检查
7 if (!cleanedIban.matches("[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}")) {
8 return false;
9 }
10
11 // 将前4个字符移到末尾
12 String rearranged = cleanedIban.substring(4) + cleanedIban.substring(0, 4);
13
14 // 将字母转换为数字
15 StringBuilder converted = new StringBuilder();
16 for (char c : rearranged.toCharArray()) {
17 if (Character.isLetter(c)) {
18 converted.append(c - 'A' + 10);
19 } else {
20 converted.append(c);
21 }
22 }
23
24 // 计算 mod 97
25 BigInteger numeric = new BigInteger(converted.toString());
26 return numeric.mod(BigInteger.valueOf(97)).intValue() == 1;
27 }
28
29 public static void main(String[] args) {
30 System.out.println(validateIban("DE89 3704 0044 0532 0130 00")); // true
31 System.out.println(validateIban("GB29 NWBK 6016 1331 9268 19")); // true
32 System.out.println(validateIban("DE89 3704 0044 0532 0130 01")); // false
33 }
34}
35IBAN 生成
1function generateIban(countryCode) {
2 const countryFormats = {
3 'DE': { length: 22, bbanPattern: '8n10n' },
4 'GB': { length: 22, bbanPattern: '4a6n8n' },
5 'FR': { length: 27, bbanPattern: '5n5n11c2n' }
6 // 根据需要添加更多国家
7 };
8
9 if (!countryFormats[countryCode]) {
10 throw new Error(`不支持国家代码 ${countryCode}`);
11 }
12
13 // 根据国家模式生成随机 BBAN
14 let bban = '';
15 const pattern = countryFormats[countryCode].bbanPattern;
16 let i = 0;
17
18 while (i < pattern.length) {
19 const count = parseInt(pattern.substring(i + 1), 10);
20 const type = pattern[i];
21
22 if (type === 'n') {
23 // 生成数字字符
24 for (let j = 0; j < count; j++) {
25 bban += Math.floor(Math.random() * 10);
26 }
27 } else if (type === 'a') {
28 // 生成字母字符
29 for (let j = 0; j < count; j++) {
30 bban += String.fromCharCode(65 + Math.floor(Math.random() * 26));
31 }
32 } else if (type === 'c') {
33 // 生成字母数字字符
34 for (let j = 0; j < count; j++) {
35 const isLetter = Math.random() > 0.5;
36 if (isLetter) {
37 bban += String.fromCharCode(65 + Math.floor(Math.random() * 26));
38 } else {
39 bban += Math.floor(Math.random() * 10);
40 }
41 }
42 }
43
44 i += 2;
45 }
46
47 // 计算校验位
48 const checkDigits = calculateCheckDigits(countryCode, bban);
49
50 return countryCode + checkDigits + bban;
51}
52
53function calculateCheckDigits(countryCode, bban) {
54 // 创建初始 IBAN,校验位为 '00'
55 const initialIban = countryCode + '00' + bban;
56
57 // 重新排列并将字母转换为数字
58 const rearranged = bban + countryCode + '00';
59 const converted = rearranged.split('').map(char => {
60 if (/[A-Z]/.test(char)) {
61 return (char.charCodeAt(0) - 55).toString();
62 }
63 return char;
64 }).join('');
65
66 // 计算 98 减去 mod 97
67 let remainder = 0;
68 for (let i = 0; i < converted.length; i++) {
69 remainder = (remainder * 10 + parseInt(converted[i], 10)) % 97;
70 }
71
72 const checkDigits = (98 - remainder).toString().padStart(2, '0');
73 return checkDigits;
74}
75
76// 使用示例
77console.log(generateIban('DE')); // 生成有效的德国 IBAN
78console.log(generateIban('GB')); // 生成有效的英国 IBAN
791import random
2import string
3
4def generate_iban(country_code):
5 country_formats = {
6 'DE': {'length': 22, 'bban_format': '8n10n'},
7 'GB': {'length': 22, 'bban_format': '4a6n8n'},
8 'FR': {'length': 27, 'bban_format': '5n5n11c2n'}
9 # 根据需要添加更多国家
10 }
11
12 if country_code not in country_formats:
13 raise ValueError(f"不支持国家代码 {country_code}")
14
15 # 根据国家格式生成随机 BBAN
16 bban = ''
17 format_str = country_formats[country_code]['bban_format']
18 i = 0
19
20 while i < len(format_str):
21 count = int(''.join(c for c in format_str[i+1:] if c.isdigit()))
22 type_char = format_str[i]
23
24 if type_char == 'n': # 数字
25 bban += ''.join(random.choices(string.digits, k=count))
26 elif type_char == 'a': # 字母
27 bban += ''.join(random.choices(string.ascii_uppercase, k=count))
28 elif type_char == 'c': # 字母数字
29 bban += ''.join(random.choices(string.ascii_uppercase + string.digits, k=count))
30
31 i += 1 + len(str(count))
32
33 # 计算校验位
34 check_digits = calculate_check_digits(country_code, bban)
35
36 return country_code + check_digits + bban
37
38def calculate_check_digits(country_code, bban):
39 # 创建用于校验位计算的字符串
40 check_string = bban + country_code + '00'
41
42 # 将字母转换为数字(A=10,B=11,...,Z=35)
43 numeric = ''
44 for char in check_string:
45 if char.isalpha():
46 numeric += str(ord(char.upper()) - 55)
47 else:
48 numeric += char
49
50 # 计算 98 减去 mod 97
51 remainder = int(numeric) % 97
52 check_digits = str(98 - remainder).zfill(2)
53
54 return check_digits
55
56# 使用示例
57print(generate_iban('DE')) # 生成有效的德国 IBAN
58print(generate_iban('GB')) # 生成有效的英国 IBAN
59参考文献和进一步阅读
- ISO 13616-1:2007 - 官方 IBAN 结构规范
- SWIFT IBAN 注册表 - 国家特定 IBAN 格式的权威来源
- ISO 7064:2003 - MOD 97 校验位算法规范
- 欧洲支付委员会 - SEPA - 单一欧元支付区文档
- 欧洲中央银行 - 支付系统 - 欧洲银行业整合标准
- 国际清算银行 - 支付系统 - 国际支付系统标准
开始测试 IBAN
需要支付系统的测试数据吗?生成任何支持国家的有效 IBAN,或粘贴现有 IBAN 以验证其结构。该工具完全在您的浏览器中运行 - 无需注册、无需 API 密钥、无数据发送到服务器。
快速提示:从多个国家生成 IBAN 以测试边缘情况。真实世界的支付系统处理多样的格式,仅使用一个国家的格式进行测试是生产中常见的错误源。