在最初提出这个问题 6 年后,我在过去 2 周内多次遇到这个问题。我终于找到了一个实际的解决方案,以及如何正确解析 MICR 行。我为此编写了一些代码,它适用于我迄今为止扫描的 99.9% 的检查,所以我必须分享并确保人们理解应该如何完成。
11年来,我一直在做这项工作。我们一直使用 Magtek 支票扫描仪。最近我决定搬到成像扫描仪上,这样我们就可以扫描所有支票。我和帕尼尼支票扫描仪一起去了。不幸的是,他们的 API 并没有打破 MICR 线,但是我们的 Magtek 扫描仪是可编程的,可以给我们想要的任何东西。我创建了一个基本字符串,每次都可以与模式匹配。它总是会显示为: <aaaaaaaaa/bbbbbbbb/ccc> 其中 a 是路线号,b 是帐号,c 是支票号。一遍又一遍,我一直想知道扫描仪,只是一个简单的串行设备,如何在十年内每次都弄清楚并正确处理它。
我首先使用帕特里克自己的答案来构建一个我以前从未见过的 MICR 模式表。问题是我跑到了一个点,一个模式会与另一个检查非常匹配,并且数据会稍微偏离。然后我尝试根据路线编号进行操作,直到我遇到了来自美国银行的两张支票,这些支票具有相同的路线编号和完全不同的 MICR 线路。我很失望,我的脸沮丧地碰到了我的办公桌。
经过更多研究,正确的方法是从左到右解析 MICR 行。MICR 线是从左到右的,当然给我们带来最大麻烦的领域是 on-us 领域。我所有的示例片段都是 C# 代码。
从向后循环字符串开始:
for (int i = micr.Length - 1; i >= 0; i--)
循环时评估每个字符。如果您的第一个字符是金额字符,则为业务支票。阅读直到您获得另一个数量字符,然后保存该值。如果下一个字符是 on-us 符号,则假设支票号码位于 on-us 字段的最左侧。如果下一个字符是数字,请继续读取并用数字填充缓冲区(记住您正在向后工作!),直到您到达 on-us 字符。如果您的缓冲区只包含数字,那就是您的支票号码。如果它是空的,则继续前进并将整个 on-us 字段收集在缓冲区中,直到到达中转字符。到达中转字符后,请继续阅读并填充缓冲区,直到到达下一个中转字符。您的缓冲区现在是您的路由号码。如果是商业支票,你还有更多的字符要阅读。继续阅读,直到你达到另一个我们的角色。您现在已经到达了辅助 on-us 字段,它应该是支票号码。阅读直到你到达下一个 on-us 字符,这应该是你的字符串的结尾。您现在有了支票号码。
现在,查看您从常规 on-us 字段中剥离的值。如果您有支票号码,那么这就是您的帐号。如果您没有支票号码,那么您应该用空格分隔 on-us 字段,并假设您的最左侧数字集(数组元素 0)是您的支票号码。但是,如果在按空格分割后,数组中只有一个元素,这意味着 on-us 字段可能包含分隔项目的破折号。用破折号分割 on-us 字段,并假设您最左边的数组元素是支票号码,其余的是您的帐号。我见过一些在 on-us 字段中有多达 3 个破折号的例子,例如:nnnn-1234-56-7,其中 nnnn 是支票号码,其余的是帐号。
将您的帐号与支票号码分开后,去掉其中的所有杂项字符(空格、破折号等),您就完成了。
这是我所有 MICR 问题的解决方案。希望它可以帮助别人。
部分感谢本文档:http ://www.transact-tech.com/uploads/printers/files/100-9094-Rev-C-MICR-Programmers-Guide.pdf