代码之家  ›  专栏  ›  技术社区  ›  Lena

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

  •  1
  • Lena  · 技术社区  · 8 年前

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

    为了直截了当,我需要转换一个包含数字的字符串 字母转换成只包含数字的字符串,同时将已经存在的数字保持在正确的位置。

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

    所以,基本上,一个字符串看起来像这样: ' GB 00 LOYD 1023456789 A 1 B 2'

    必须成为: ' 1611 00 21242913 1023456789 10 1 11 2' .

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

    最好的方法是什么?

    1 回复  |  直到 8 年前
        1
  •  3
  •   cschneid    8 年前

    最好的方法是什么?

    这是一个意见问题。

    INSPECT动词的REPLACING选项要求替换和替换的字符串大小相同,因此这是正确的,因为您需要用两个字符替换一个字符。这至少对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
    

    有可用的变体。您可以用几个表查找来替换求值。您可以在开始循环之前将的长度存储在字符串中。您可以存储在字符串(posn:1)中,而不是希望编译器为您这样做。

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