【入門編】PIC ‘9’とPIC ‘Z’の編集文字による数値から文字への変換挙動 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの「見た目」を整える魔法:PIC ‘9’と’Z’で数値の表情を変える

こんにちは!メインフレームの世界へようこそ。
JavaやCOBOLでバリバリ開発してきたあなたにとって、PL/Iは少し「古風で気難しい隣人」に見えるかもしれませんね。でも大丈夫。PL/Iは、一度仲良くなればこれほど柔軟で強力な相棒はいません。

今回は、基幹システムの現場で必ずと言っていいほど直面する「数値から文字への変換(編集)」について、少しだけ掘り下げてみましょう。帳票出力やデータ連携で、数値のゼロを消したり、符号を扱ったりするあの「魔法」の正体です。

1. なぜPL/Iで「見た目」を定義するのか?

COBOL経験者なら「PICTURE句」はお馴染みですよね。PL/Iも考え方は同じです。
コンピュータが計算に使う「純粋な数値(FIXED BINARYなど)」と、人間が読みやすい「文字としての数値(CHARACTER)」の間には、深い溝があります。

その溝を埋めるのが編集文字です。

  • `PIC ‘9’`:数値の「枠」そのもの。0もちゃんと表示します。
  • `PIC ‘Z’`:ゼロサプレス(不要な先行ゼロをスペースに置き換える)の魔法。

これらを使い分けることで、データの「見せ方」をコントロールするわけです。

2. 実践!ゼロサプレスと数値変換の現場

まずは、具体的なコード例を見てみましょう。このプログラムは、数値データを文字データに変換する際の典型的な挙動を示しています。

TEST_PROG: PROCEDURE OPTIONS(MAIN);

/ 変換元の数値データ(計算用) /
DCL NUM_VAL FIXED DECIMAL(5) INIT(123);
DCL ZERO_VAL FIXED DECIMAL(5) INIT(0);

/ 編集後の文字データ(出力用) /
DCL OUT_99999 PIC ‘99999’; / 00123 と表示される /
DCL OUT_ZZZZ9 PIC ‘ZZZZ9’; / 123 と表示される(スペース埋め) /

/ 数値を文字へ代入(ここで自動変換が走る) /
OUT_99999 = NUM_VAL;
OUT_ZZZZ9 = NUM_VAL;

/ 0の場合の挙動 /
DCL OUT_ZERO PIC ‘ZZZZZ’; / 全てゼロなら空白になる /
OUT_ZERO = ZERO_VAL;

PUT SKIP LIST(‘99999の結果: ‘ || OUT_99999);
PUT SKIP LIST(‘ZZZZ9の結果: ‘ || OUT_ZZZZ9);
PUT SKIP LIST(‘ゼロの結果: ‘ || OUT_ZERO);

END TEST_PROG;

ここがポイント!

  • PIC ‘9’ を使うと、数値が持っている桁数をすべて埋めようとします。銀行の通帳などで「000123円」のように厳密に桁を合わせたい時はこれです。
  • PIC ‘Z’ を使うと、先行するゼロが「空白」に置き換わります。「123円」とすっきり見せたい時に重宝しますよね。
  • 注意点: もし全部ゼロの時に `PIC ‘ZZZZZ’` を使うと、結果は「空文字(スペースのみ)」になります。「0」と表示させたい場合は、最後の桁だけ `9` にしておくのが現場の定石です。

3. 恐るべき「CONVERSION条件」とどう付き合うか?

PL/Iが「気難しい」と言われる最大の理由は、型変換に失敗した時の厳格さかもしれません。
数値以外の文字(例えば半角スペースやアルファベット)が入っている変数を、数値型の変数に代入しようとすると、システムはCONVERSION(変換)条件というエラーを投げます。

Javaなら例外処理(try-catch)で済みますが、PL/Iでは「ONユニット」という仕組みを使います。

/ 変換エラーが発生した時の処置をあらかじめ定義する /
ON CONVERSION BEGIN;
PUT SKIP LIST(‘警告:数値変換に失敗しました!’);
/ ここでデフォルト値を代入して処理を続行させるのが通のやり方 /
END;

レガシーな現場では、この「ONユニット」がいたるところに仕込まれています。「なぜわざわざこんなことを?」と思うかもしれませんが、これは「どんなデータが来ても絶対にシステムを止めてはいけない」という、メインフレームの歴史的な使命感から来るものなんです。

最後に:怖がる必要はありません

PL/Iのデータ宣言は、最初は呪文のように見えるかもしれません。でも、一つずつ紐解いていけば、それは「データの形を定義する設計図」そのものです。

もし、変換結果が思っていたのと違ったら、それは「データがあなたに何かを伝えようとしている」サインです。

  • 「数字の中にゴミが混ざっていませんか?」
  • 「桁数は足りていますか?」

そうやって一つずつ対話していくうちに、あなたも立派なメインフレーム・アーキテクトの仲間入りです。次は、符号(S)や小数点(V)の扱いについて、またじっくり語り合いましょう。

それでは、良いコーディングライフを!

タイトルとURLをコピーしました