Cobol 将字母转换为也包含数字的字符串中的数字

Cobol 将字母转换为也包含数字的字符串中的数字,cobol,Cobol,我意识到我以前也问过类似的问题,但整个事情比我想象的要复杂 为了切入正题,我需要将包含数字和字母的字符串转换为只包含数字的字符串,同时将已经存在的数字保持在正确的位置 字母需要转换到字母表+9中相应的位置。所以,A=10,B=11。。。。Z=35 基本上,一个字符串如下所示: GB00LOYD1023456789A1B2' 必须成为: 161100212429131023456789101112 我把两个例子中的字母都加粗了,这样你就能更清楚地看到它们之间的区别。根据输入,内容将比本例更长或更短

我意识到我以前也问过类似的问题,但整个事情比我想象的要复杂

为了切入正题,我需要将包含数字和字母的字符串转换为只包含数字的字符串,同时将已经存在的数字保持在正确的位置

字母需要转换到字母表+9中相应的位置。所以,A=10,B=11。。。。Z=35

基本上,一个字符串如下所示:
GB00LOYD1023456789A1B2'

必须成为:
161100212429131023456789101112

我把两个例子中的字母都加粗了,这样你就能更清楚地看到它们之间的区别。根据输入,内容将比本例更长或更短。字母将由数字替换,反之亦然

最好的方法是什么

最好的方法是什么

这是一个意见问题

INSPECT谓词的replacement选项要求replacement和replacement字符串的大小相同,因此这是正确的,因为您需要用两个字符替换一个字符。至少对于IBMCOBOL来说是这样

一种方法是循环输入字符串,并对每个字符进行类检查。类似于

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
有多种可用的。您可以用几个表查找来替换evaluate。在开始循环之前,可以将字符串的长度存储在字符串中。您可以存储在字符串中(posn:1),而不希望编译器会为您这样做


这只是徒手画,但我认为它传达了这个想法。

您的编码字符串将如何解码?模式是否始终为2-2-4-10--1-1-1(字母数字字母…),如果不是,例如,您的代码
161100212429131023456789101112
可以解释为
GB00LOYDAM456789ABC
。我相信你应该使用我给你的代码,它将数字编码为0n,因此你的字符串将成为
16110000212429130100002030405060708091011102
,可以很容易地解码回原始字符串。谢谢你,Magoo,我终于明白它是如何工作的了这与手头的问题无关,但是GnuCOBOL有一个内在的功能(扩展)
替换(subject、pattern、replacement、[pattern-2、replacement-2、…])
,其中模式和替换都可以是可变宽度。非常方便。谢谢你,这是一个非常清晰易懂的解决方案