2016-04-04 3 views
1

Я понимаю, что раньше я задавал аналогичный вопрос, но все это сложнее, чем я думал.Преобразование букв в числа в строке, которая также содержит числа

Чтобы перерезать преследование, мне нужно преобразовать строку, содержащую цифры и буквы в строку, содержащую только цифры, сохраняя числа, которые уже были там, в правильном положении.

Буквы должны быть преобразованы в соответствующие позиции в алфавите + 9. Таким образом, А = 10, B = 11 .... Z = 35.

Таким образом, в основном, строка, которая выглядит как это: 'GB00LOYD1023456789A1B2'

должны стать: '161100212429131023456789101112'.

Я выделил буквы в обоих примерах, чтобы вы могли видеть разницу более четко. В зависимости от ввода контент будет длиннее или короче, чем этот пример. Буквы будут чередоваться числами и наоборот.

Каков наилучший способ для этого?

+0

Как будет декодироваться ваша закодированная строка? Является ли шаблон всегда 2-2-4-10-1-1-1-1 (буквы-цифры-буквы ...) Если это не так, то ваш код '161100212429131023456789101112' может быть интерпретирован как' GB00LOYDAM456789ABC' , Я считаю, что вы должны использовать код, который я вам дал, который будет кодировать числа как 0n, и, следовательно, ваша строка станет «16110000212429130100020304050607080910011102», которая может быть легко декодирована обратно в исходную строку. – Magoo

+0

Спасибо, Magoo, я наконец понял, как это работает – Lena

ответ

3

Каков наилучший способ для этого?

Это вопрос мнения.

Опция REPLACING для глагола INSPECT требует замены и замены символьных строк одинакового размера, так что это правильно, потому что вам нужно заменить один символ на два. Это справедливо, по крайней мере, для 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 

Имеются варианты. Вы можете заменить оценку несколькими просмотрами таблиц. Вы можете сохранить длину строки в строке перед началом цикла. Вы можете сохранить встроенную строку (in-posn: 1), а не надеяться, что компилятор сделает это за вас.

Это только от руки, но я думаю, что это передает идею.

+0

Это касательно проблемы, но GnuCOBOL имеет внутреннюю функцию (расширение) 'SUBSTITUTE (тема, шаблон, замена, [pattern-2, replacement-2, ... ]) 'где шаблоны и замены могут быть переменной шириной. Супер удобный. –

+0

Спасибо, это очень четкое и понятное решение – Lena