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

时间:2016-04-04 16:18:18

标签: cobol

我意识到我之前曾问过类似的问题,但整件事情比我想象的要复杂得多。

要切入追逐,我需要将包含数字字母的字符串转换为仅包含数字的字符串,同时将已存在的数字保存在正确的位置。

字母需要转换为Alphabet + 9中的相应位置。因此,A = 10,B = 11 .... Z = 35。

所以,基本上,这个字符串看起来像这样: 'GB00LOYD1023456789A1B2'

必须成为: '161100212429131023456789101112'

我在两个例子中加粗了字母,这样你就能更清楚地看到差异。根据输入,内容将比此示例更长或更短。字母将以数字交替,反之亦然。

最好的方法是什么?

1 个答案:

答案 0 :(得分:3)

  

最好的方法是什么?

这是一个意见问题。

INSPECT动词的REPLACING选项要求替换和替换的字符串大小相同,因此您需要将一个字符替换为两个字符。至少对于IBM COBOL来说这是真的。

这样做的方法是循环输入字符串并对每个字符进行类检查。有点像...

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。您可以在开始循环之前存储in-string的长度。你可以存储in-string(in-posn:1),而不是希望编译器会为你做这些。

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