我如何 'convert' 字母转数字?
How do I 'convert' letters to numbers?
我正在编写一个将常规银行帐号转换为 IBAN 号码的程序。此过程的一部分意味着我需要将字母(在 Bank-ID、Branch-ID 和 ISO-Country-CODE 等字段中)转换为与其在字母表中的位置对应的数字 + 9。所以 A=10,B=11 , Z=35。
所以基本上,以下银行 ID:"LOYD" 将变为“21243413”。
稍后我需要将这些数字放入一个字符串中,以便用它进行计算。
现在,如果输入的 bank-ID 总是等长且总是字母,我会把它放在我剩余的工作存储中:
LETTERS PIC X(36) VALUE '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
然后我会这样写:
INITIALIZE BANK-CODE-NR
PERFORM VARYING LOOP-COUNTR FROM 1 BY 1 UNTIL
LOOP-COUNTR > 4
INSPECT LETTERS
TALLYING BANK-CODE-NR(LOOP-COUNTER) FOR
CHARACTERS BEFORE INITIAL BANK-CD IN
COPYBOOK(LOOP-COUNTR:1)
END-PERFORM
但在这种情况下,银行 ID 可能有四个位置长,甚至更长。另外,我正在处理 PIC N 字段,这意味着 INSPECT 不起作用。
编辑以获取额外信息
我正在使用一本包含国民的字帖。
它的结构如下:
01 Input-IBAN.
05 COUNTRY-CODE PIC N(02).
05 BANK-ID PIC N(10).
05 BRANCH-ID PIC N(10).
05 ACCOUNT-NR PIC N(28).
05 Output-IBAN PIC N(34).
这是一个被调用的程序。
IDENTIFICATION DIVISION.
PROGRAM-ID. Q36201076.
AUTHOR. Magoo.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
WORKING-STORAGE SECTION.
01 LETTERS.
03 LETTER-STRING PIC X(36) VALUE
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".
03 FILLER REDEFINES LETTER-STRING.
05 LETTER-CHARACTER PIC X(01) OCCURS 36.
01 BANK-CODE.
03 BANK-CODE-CHARACTER PIC X(01) OCCURS 4.
01 BANK-CODE-CONVERTED.
03 BANK-CODE-NUMBER PIC 9(02) OCCURS 4.
01 wORK-VARIABLES.
03 LETTER-INDEX PIC 9(02).
03 BANK-INDEX PIC 9(01).
03 REPLACED-COUNT PIC 9(01) VALUE 0.
PROCEDURE DIVISION.
MAIN-RTN.
MOVE "LOYD" TO BANK-CODE.
PERFORM
VARYING LETTER-INDEX FROM 1 BY 1
UNTIL (LETTER-INDEX > 36) OR (REPLACED-COUNT = 4)
PERFORM
VARYING BANK-INDEX FROM 1 BY 1
UNTIL (BANK-INDEX > 4) OR (REPLACED-COUNT = 4)
IF BANK-CODE-CHARACTER(BANK-INDEX) = LETTER-CHARACTER(LETTER-INDEX)
SUBTRACT 1
FROM LETTER-INDEX
GIVING BANK-CODE-NUMBER(BANK-INDEX)
ADD 1 TO REPLACED-COUNT
END-IF
END-PERFORM
END-PERFORM.
DISPLAY BANK-CODE "-->" BANK-CODE-CONVERTED.
ACCEPT BANK-CODE.
STOP RUN.
没什么特别复杂的。简单的重新声明。
我正在编写一个将常规银行帐号转换为 IBAN 号码的程序。此过程的一部分意味着我需要将字母(在 Bank-ID、Branch-ID 和 ISO-Country-CODE 等字段中)转换为与其在字母表中的位置对应的数字 + 9。所以 A=10,B=11 , Z=35。
所以基本上,以下银行 ID:"LOYD" 将变为“21243413”。
稍后我需要将这些数字放入一个字符串中,以便用它进行计算。
现在,如果输入的 bank-ID 总是等长且总是字母,我会把它放在我剩余的工作存储中:
LETTERS PIC X(36) VALUE '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
然后我会这样写:
INITIALIZE BANK-CODE-NR
PERFORM VARYING LOOP-COUNTR FROM 1 BY 1 UNTIL
LOOP-COUNTR > 4
INSPECT LETTERS
TALLYING BANK-CODE-NR(LOOP-COUNTER) FOR
CHARACTERS BEFORE INITIAL BANK-CD IN
COPYBOOK(LOOP-COUNTR:1)
END-PERFORM
但在这种情况下,银行 ID 可能有四个位置长,甚至更长。另外,我正在处理 PIC N 字段,这意味着 INSPECT 不起作用。
编辑以获取额外信息
我正在使用一本包含国民的字帖。 它的结构如下:
01 Input-IBAN. 05 COUNTRY-CODE PIC N(02). 05 BANK-ID PIC N(10). 05 BRANCH-ID PIC N(10). 05 ACCOUNT-NR PIC N(28). 05 Output-IBAN PIC N(34).
这是一个被调用的程序。
IDENTIFICATION DIVISION.
PROGRAM-ID. Q36201076.
AUTHOR. Magoo.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
WORKING-STORAGE SECTION.
01 LETTERS.
03 LETTER-STRING PIC X(36) VALUE
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".
03 FILLER REDEFINES LETTER-STRING.
05 LETTER-CHARACTER PIC X(01) OCCURS 36.
01 BANK-CODE.
03 BANK-CODE-CHARACTER PIC X(01) OCCURS 4.
01 BANK-CODE-CONVERTED.
03 BANK-CODE-NUMBER PIC 9(02) OCCURS 4.
01 wORK-VARIABLES.
03 LETTER-INDEX PIC 9(02).
03 BANK-INDEX PIC 9(01).
03 REPLACED-COUNT PIC 9(01) VALUE 0.
PROCEDURE DIVISION.
MAIN-RTN.
MOVE "LOYD" TO BANK-CODE.
PERFORM
VARYING LETTER-INDEX FROM 1 BY 1
UNTIL (LETTER-INDEX > 36) OR (REPLACED-COUNT = 4)
PERFORM
VARYING BANK-INDEX FROM 1 BY 1
UNTIL (BANK-INDEX > 4) OR (REPLACED-COUNT = 4)
IF BANK-CODE-CHARACTER(BANK-INDEX) = LETTER-CHARACTER(LETTER-INDEX)
SUBTRACT 1
FROM LETTER-INDEX
GIVING BANK-CODE-NUMBER(BANK-INDEX)
ADD 1 TO REPLACED-COUNT
END-IF
END-PERFORM
END-PERFORM.
DISPLAY BANK-CODE "-->" BANK-CODE-CONVERTED.
ACCEPT BANK-CODE.
STOP RUN.
没什么特别复杂的。简单的重新声明。