Метод замены строк в RPG IV - PullRequest
1 голос
/ 30 апреля 2009

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

Ответы [ 4 ]

4 голосов
/ 12 мая 2009

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

% XLATE (от: до: строки {: StartPos})

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

new_string =% xlate ('-': '&': string);

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

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

for i = 1 to %len(string);
    char = %subst(string:i:1);
    if char <> '-';
        new_string += char;
    endif;
endfor;
3 голосов
/ 30 апреля 2009

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

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

2 голосов
/ 27 марта 2014

У меня была такая же проблема. поэтому я написал свою собственную процедуру 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 *», «**» и «5» должно быть 5 пробелов P skReplace ... '. Шесть пробелов перед '/ free'. И весь код между строками '/ free' имеет 7 или более пробелов.

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

Счастливого кодирования!

0 голосов
/ 03 июня 2016

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

strRes = %scanrpl('-':'':strSrc);
...