Метод замены строки в RPG IV

В RPG IV, как я могу взять строку и исключить все экземпляры определенного символа или заменить их другим? Это похоже на замену строки встроенными методами в других языках программирования. Пример: взять 021-123450-23-4 и скрыть до 021123450234


person lalala2007    schedule 30.04.2009    source источник


Ответы (4)


Правильный синтаксис для %xlate:

%XLATE(от:до:строка{:начальная позиция})

Чтобы заменить все дефисы амперсандами:

new_string = %xlate('-':'&':строка);

Чтобы удалить все дефисы:

Вы не можете удалить символ с помощью &xlate. 7.1 дает нам %scanrpl, но до этого используйте что-то вроде этого:

for i = 1 to %len(string);
    char = %subst(string:i:1);
    if char <> '-';
        new_string += char;
    endif;
endfor;
person Paul Morgan    schedule 12.05.2009

Взгляните на следующие статьи:

Это должно помочь.

person Mike Wills    schedule 30.04.2009

У меня такая же проблема. поэтому я написал свою собственную RPG-процедуру, которая делает это за меня:

     **
     **
     D************************************************************************
     D*                                                                      *
     D*  Procedure 'skReplace' -- Replaces text in 'text' string,            *
     D*                           searching for 'find' string,               *
     D*                           replacing with 'new' string.               *
     D*                           All occurances are replaced, not just one. *
     D*  Parameters: @txt = 'text' string                                    *
     D*              @fnd = 'find' string                                    *
     D*              @new = 'new' string (that replaces 'find' in 'source')  *
     D*                                                                      *
     D*  Update history:                                                     *
     D*  2013-04    Created by Shawn Kovac.                                  *
     D*                                                                      *
     D************************************************************************
     D*
     P skReplace       B
     D skReplace       PI           999A   Varying
     D    @txt                      999A   VALUE Varying
     D    @fnd                      999A   VALUE Varying
     D    @new                      999A   VALUE Varying
     D    @pos         S              3  0
     D*
      /free
       if (%Len(@fnd) = 0); // text to find cannot be empty.
          return @txt;
       endif;
       @pos = 1;
       dou (@pos = 0);
           @pos = %scan(@fnd: @txt: @pos);
           if (@pos > 0);
               @txt = %replace( @new : @txt : @pos : %Len(@fnd) );
               @pos = @pos + %Len(@new);
               if (@pos > %Len(@txt));
                   @pos = 0;
               endif;
           endif;
       enddo;

       return @txt;

      /end-free
     P skReplace       E
     **
     **

Поскольку RPG очень требовательна к тому, в каком столбце находится что-либо, при копировании и повторном использовании этого кода вам может потребоваться изменить вставленный текст, поэтому перед «D*», «**» и «P skReplace» есть 5 пробелов. ..'. Шесть пробелов перед ‘/free’. И весь код между строками «/ free» имеет 7 или более пробелов.

Я приветствую любые предложения по улучшению этого кода. У меня также есть процедуры для левого, правого и среднего, если они кому-то нужны. Просто msg мне, если вы делаете. Я рад поделиться ими. Я знаю, что в RPG есть функция '%subst', но многие языки программирования привередливы, так как они будут ошибаться, если параметры недействительны. Мой вместо этого дает больше гибкости, например, Left('aoeu', -1) возвращает 'aoe' (на 1 символ меньше полной строки), а Right('aoeu', -1) возвращает 'oeu' (правая часть строки после удаления 1 символа). Моя процедура Mid также допускает отрицательную начальную позицию, а также индексацию с конца строки, что мне показалось полезным. Но они бесплатны для всех, кто хочет потратить время, чтобы попросить их у меня.

Удачного кодирования!

person Shawn Kovac    schedule 27.03.2014

Чтобы удалить персонажа, вы можете использовать это

strRes = %scanrpl('-':'':strSrc);
person RomanCh    schedule 02.06.2016