RPGLEでのキャスト処理(数値→文字列)についてです。
数値を文字列化して出力したいケースは、多くあると思います。
自分がわかる範囲で、そのバリエーションをまとめてみました。
(1) %CHAR関数を使う
- %CHARを使うことで、数値を簡単に文字列変換してくれます。
- しかし、ゼロパディングされ、カンマ区切りで整形されるわけではありません。
D W@DEC1 S 9S 0 INZ(*ZERO) D* /FREE W@DEC1 = 12345; W@MSSG = %CHAR(W@DEC1) + ' 円です。 '; DSPLY W@MSSG; // 12345 円です。 /END-FREE
(2) %EDITW関数を使う
- 下記のソースは、D仕様書で宣言タイプをC(固定情報定義)し、%EDITWで文字列変換した例です。
- 書式でカンマ区切りや符号を定義すれば、その通り出力されますが、フル桁の数値でない場合には空白になってしまいます。
D FORMAT1 C ' , , - 円です。 ' D* /FREE W@DEC1 = 123456789; W@MSSG = %EDITW(W@DEC1:FORMAT1); DSPLY W@MSSG; // 123,456,789 円です。 W@DEC1 = 12345; W@MSSG = %EDITW(W@DEC1:FORMAT1); DSPLY W@MSSG; // 12,345 円です。 W@DEC1 = -500; W@MSSG = %EDITW(W@DEC1:FORMAT1); DSPLY W@MSSG; // 500- 円です。 /END-FREE
(3) %EDITC関数を使う
- 下記は、%EDITCで文字列変換した例です。
- %EDITCではオプションを指定できます。
- オプション'X'では、ゼロ・パディングしてキャストしてくれます。
- オプション'N'では、カンマ区切り。フル桁でない場合には、その桁をブランクへ変換。
- オプション'Y'では、日付変換してくれます。便利!!
- 個人的には、 %TRIM(%EDITC(W@DEC1:'N')) でブランクを詰めてやるやり方をよく使います(メッセージなどで)。
/FREE W@DEC1 = 777; W@MSSG = %EDITC(W@DEC1:'X') + ' 円です。 '; DSPLY W@MSSG; // 000000777 円です。 W@DEC1 = 123456789; W@MSSG = %EDITC(W@DEC1:'N') + ' 円です。 '; DSPLY W@MSSG; // 123,456,789 円です。 W@DEC1 = 12345; W@MSSG = %EDITC(W@DEC1:'N') + ' 円です。 '; DSPLY W@MSSG; // 12,345 円です。 W@DEC1 = 12345; W@MSSG = %TRIM(%EDITC(W@DEC1:'N')) + ' 円です。 '; DSPLY W@MSSG; // 12,345 円です。 W@DEC1 = -123456789; W@MSSG = %EDITC(W@DEC1:'N') + ' 円です。 '; DSPLY W@MSSG; // -123,456,789 円です。 W@DEC2 = 20160824; W@MSSG = %EDITC(W@DEC2:'Y'); DSPLY W@MSSG; // 2016/08/24 /END-FREE
(4) データ構造を使う(番外)
- こちらは番外です。キャストではありませんが、RPGのDS定義を使って表現する方法です。
- 数値を文字列変換しているわけではなく、その数値とミックスしたDSで文字列を形成しています。
- よって、カンマ区切り等に変換されるわけではありません。
D FORMAT2 1 19 D TEXT1 1 9S 0 D TEXT2 10 19 INZ(' 円です。 ') D* /FREE TEXT1 = 123456789; DSPLY FORMAT2; // 123456789 円です。 /END-FREE
最終的なサンプル・コードは、こちらです。
サンプルPGM
H DATEDIT(*YMD/) D MAIN PR EXTPGM('SAMPLE38') D MAIN PI D* D W@DEC1 S 9S 0 INZ(*ZERO) D W@DEC2 S 8S 0 INZ(*ZERO) D W@MSSG S 50 INZ(*BLANK) D* D FORMAT1 C ' , , - 円です。 ' D* D DS D FORMAT2 1 19 D TEXT1 1 9S 0 D TEXT2 10 19 INZ(' 円です。 ') D* /FREE //+++++++++++++++++++++++++++++++ // %CHAR 関数を使う //+++++++++++++++++++++++++++++++ W@DEC1 = 12345; W@MSSG = %CHAR(W@DEC1) + ' 円です。 '; DSPLY W@MSSG; //+++++++++++++++++++++++++++++++ // %EDITW 関数を使う //+++++++++++++++++++++++++++++++ W@DEC1 = 123456789; W@MSSG = %EDITW(W@DEC1:FORMAT1); DSPLY W@MSSG; W@DEC1 = 12345; W@MSSG = %EDITW(W@DEC1:FORMAT1); DSPLY W@MSSG; W@DEC1 = -500; W@MSSG = %EDITW(W@DEC1:FORMAT1); DSPLY W@MSSG; //+++++++++++++++++++++++++++++++ // %EDITC 関数を使う //+++++++++++++++++++++++++++++++ W@DEC1 = 777; W@MSSG = %EDITC(W@DEC1:'X') + ' 円です。 '; DSPLY W@MSSG; W@DEC1 = 123456789; W@MSSG = %EDITC(W@DEC1:'N') + ' 円です。 '; DSPLY W@MSSG; W@DEC1 = 12345; W@MSSG = %EDITC(W@DEC1:'N') + ' 円です。 '; DSPLY W@MSSG; W@DEC1 = 12345; W@MSSG = %TRIM(%EDITC(W@DEC1:'N')) + ' 円です。 '; DSPLY W@MSSG; W@DEC1 = -123456789; W@MSSG = %EDITC(W@DEC1:'N') + ' 円です。 '; DSPLY W@MSSG; W@DEC2 = 20160824; W@MSSG = %EDITC(W@DEC2:'Y'); DSPLY W@MSSG; //+++++++++++++++++++++++++++++++ // データ構造を使う //+++++++++++++++++++++++++++++++ TEXT1 = 123456789; DSPLY FORMAT2; *INLR = *ON; RETURN; /END-FREE
実行結果
> CALL PGM(TIGEROBJ/SAMPLE38) DSPLY 12345 円です。 DSPLY 123,456,789 円です。 DSPLY 12,345 円です。 DSPLY 500- 円です。 DSPLY 000000777 円です。 DSPLY 123,456,789 円です。 DSPLY 12,345 円です。 DSPLY 12,345 円です。 DSPLY -123,456,789 円です。 DSPLY 2016/08/24 DSPLY 123456789 円です。