将包含数字的字符串中的字母转换为数字
Converting letters to numbers in a string that also contains numbers
我意识到我以前问过类似的问题,但整个事情比我想象的要复杂。
切入正题,我需要将包含数字 和 字母的字符串转换为仅包含数字的字符串,同时保留已经存在的数字,正确的位置。
这些字母需要转换到它们在字母表中的相应位置 + 9。所以,A = 10, B= 11.... Z = 35.
所以,基本上,一个看起来像这样的字符串:
'<strong>GB</strong>00<strong>LOYD</strong>1023456789<strong>A</strong>1<strong>B</strong>2'
必须变成:
'<strong>1611</strong>00<strong>21242913</strong>1023456789<strong>10</strong>1<strong>11</strong>2'
.
我将两个示例中的字母都加粗了,这样您可以更清楚地看出区别。根据输入,内容将比此示例更长或更短。字母将由数字交替出现,反之亦然。
最好的方法是什么?
What's the best way to do this?
见仁见智。
INSPECT 动词的REPLACING 选项要求替换和替换的字符串大小相同,所以这是正确的,因为您需要用两个字符替换一个字符。至少对于 IBM COBOL 是这样。
一种 的方法是遍历您的输入字符串并对每个字符进行 class 检查。像...
01 Stuff.
05 in-posn pic s999 packed-decimal value +0.
05 out-posn pic s999 packed-decimal value +1.
05 in-string pic x(022) value 'GB00LOYD1023456789A1B2'.
05 out-string pic x(100) value spaces.
05 replacer pic x(002) value spaces.
perform varying in-posn from 1 by 1
until in-posn > length of in-string
if in-string(in-posn:1) alphabetic
evaluate in-string(in-posn:1)
when 'A' move '10' to replacer
when 'B' move '11' to replacer
.
.
.
when 'Z' move '35' to replacer
end-evaluate
string replacer delimited size
into out-string
pointer out-posn
end-string
else
string in-string(in-posn:1) delimited size
into out-string
pointer out-posn
end-string
end-if
end-perform
有可用的变体。您可以用几个 table 查找替换评估。您可以在开始循环之前存储 in-string 的长度。您可以存储 in-string(in-posn:1) 而不是希望编译器会为您做这件事。
这只是写意,但我认为它传达了这个想法。
我意识到我以前问过类似的问题,但整个事情比我想象的要复杂。
切入正题,我需要将包含数字 和 字母的字符串转换为仅包含数字的字符串,同时保留已经存在的数字,正确的位置。
这些字母需要转换到它们在字母表中的相应位置 + 9。所以,A = 10, B= 11.... Z = 35.
所以,基本上,一个看起来像这样的字符串:
'<strong>GB</strong>00<strong>LOYD</strong>1023456789<strong>A</strong>1<strong>B</strong>2'
必须变成:
'<strong>1611</strong>00<strong>21242913</strong>1023456789<strong>10</strong>1<strong>11</strong>2'
.
我将两个示例中的字母都加粗了,这样您可以更清楚地看出区别。根据输入,内容将比此示例更长或更短。字母将由数字交替出现,反之亦然。
最好的方法是什么?
What's the best way to do this?
见仁见智。
INSPECT 动词的REPLACING 选项要求替换和替换的字符串大小相同,所以这是正确的,因为您需要用两个字符替换一个字符。至少对于 IBM COBOL 是这样。
一种 的方法是遍历您的输入字符串并对每个字符进行 class 检查。像...
01 Stuff.
05 in-posn pic s999 packed-decimal value +0.
05 out-posn pic s999 packed-decimal value +1.
05 in-string pic x(022) value 'GB00LOYD1023456789A1B2'.
05 out-string pic x(100) value spaces.
05 replacer pic x(002) value spaces.
perform varying in-posn from 1 by 1
until in-posn > length of in-string
if in-string(in-posn:1) alphabetic
evaluate in-string(in-posn:1)
when 'A' move '10' to replacer
when 'B' move '11' to replacer
.
.
.
when 'Z' move '35' to replacer
end-evaluate
string replacer delimited size
into out-string
pointer out-posn
end-string
else
string in-string(in-posn:1) delimited size
into out-string
pointer out-posn
end-string
end-if
end-perform
有可用的变体。您可以用几个 table 查找替换评估。您可以在开始循环之前存储 in-string 的长度。您可以存储 in-string(in-posn:1) 而不是希望编译器会为您做这件事。
这只是写意,但我认为它传达了这个想法。