タイガー!タイガー!じれったいぞー!(SE編)

AS400,WAS,GlassFish,Java,JavaEE,JSF等の開発における日々の気づきをまとめたブログ(備忘録)。

【AS400】RPGLE-数値→文字列変換

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 円です。