RPG IV では、どのように文字列を取得し、特定の文字のすべてのインスタンスを削除したり、それらを別のものに置き換えたりできますか? これは、他のプログラミング言語に組み込まれている文字列置換メソッドに似ています。例: 021-123450-23-4 を 021123450234 に変換
5 に答える
%xlate の正しい構文は次のとおりです。
%XLATE(from:to:string{: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;
以下の記事をご覧ください。
- 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' の前に 6 つのスペースがあります。また、「/free」行の間のすべてのコードには、7 つ以上のスペースがあります。
このコードを改善するための提案を歓迎します。必要に応じて、Left、Right、Mid の手順も用意しています。もしそうなら、私にメッセージを送ってください。それらを共有できてうれしいです。RPG に '%subst' 関数があることは知っていますが、多くのプログラミング言語は、パラメーターが無効な場合にエラーが発生するなど、うるさいです。たとえば、Left('aoeu', -1) は 'aoe' (文字列全体から 1 文字短い) を返し、Right('aoeu', -1) は 'oeu' (右側の部分) を返します。 1 文字が削除された後の文字列の)。私の Mid プロシージャは、負の開始位置も許可し、文字列の末尾からインデックスを作成することもできます。これは私にとって便利であることがわかりました。しかし、時間をかけて私に依頼したい人は誰でも無料で利用できます。
ハッピーコーディング!
文字を削除するには、これを使用できます
strRes = %scanrpl('-':'':strSrc);