В RPG IV, как я могу взять строку и исключить все экземпляры определенного символа или заменить их другим? Это похоже на замену строки встроенными методами в других языках программирования. Пример: взять 021-123450-23-4 и скрыть до 021123450234
Метод замены строки в RPG IV
Ответы (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;
Взгляните на следующие статьи:
- http://www.itjungle.com/fhg/fhg030409-story01.html
- http://www.itjungle.com/fhg/fhg022509-story01.html
Это должно помочь.
У меня такая же проблема. поэтому я написал свою собственную 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 также допускает отрицательную начальную позицию, а также индексацию с конца строки, что мне показалось полезным. Но они бесплатны для всех, кто хочет потратить время, чтобы попросить их у меня.
Удачного кодирования!
Чтобы удалить персонажа, вы можете использовать это
strRes = %scanrpl('-':'':strSrc);