COBOLの帳票出力を完全攻略!数値項目のカンマ・小数点編集例を徹底解説
生徒
「COBOLで計算した結果を画面に出すと、数字が『0001234』みたいになって読みづらいです。普通の書類みたいにカンマを入れる方法はありますか?」
先生
「ありますよ!COBOLには『編集項目』という非常に便利な機能があって、記号を指定するだけで自動的にカンマや小数点を付けてくれるんです。」
生徒
「自動でやってくれるんですか!具体的にはどうやって設定するのか知りたいです。」
先生
「それでは、数値を見やすく整えるための編集方法を、具体的な例と一緒に見ていきましょう!」
1. COBOLの数値編集とは?
COBOL(コボル)というプログラミング言語は、銀行のシステムや会社の事務処理でよく使われています。こうした現場では、ただ数字を計算するだけでなく、その結果を「人間が見やすい形」で紙や画面に出力することが非常に重要です。
コンピュータは通常、数字を「0001000」のように桁を埋めて管理しますが、これをそのまま請求書に載せると読み間違いの原因になります。そこで、編集項目(へんしゅうこうもく)という特別な「データの箱」を使い、数字にカンマ(,)を入れたり、小数点を固定したり、余計なゼロを消したりします。これを「数値編集」と呼びます。
2. カンマ編集の基本:PICTURE句の書き方
COBOLで数字を扱うときは、データの種類や長さを「PICTURE(ピクチャ)句」で定義します。通常、計算に使う数字は「9」という記号で表しますが、表示用の編集項目では「カンマ(,)」を直接記述します。
例えば、「PIC 9,999,999」と定義した場所に「1234567」という数字を移動させると、自動的に「1,234,567」という見た目に変わります。まるで魔法のようですが、プログラムが裏側で文字を入れ替えてくれているのです。パソコンを触ったことがない方でも、Excel(エクセル)の「セルの書式設定」のようなものだと思えばイメージしやすいでしょう。
3. ゼロサプレス:余計な「0」を消す方法
「1,000円」を表示したいとき、もし箱が7桁分あったら「0,001,000」と表示されてしまいます。これでは不格好ですよね。この先頭にある不要な「0」を空白(スペース)に置き換える処理をゼロサプレスと呼びます。
COBOLでは、数字の「9」の代わりに「Z」という記号を使います。「PIC Z,ZZZ,ZZ9」と書くと、「Z」の部分にある先頭のゼロはすべて消えます。一番右側だけ「9」にしているのは、値が「0」のときに何も表示されない(真っ白になる)のを防ぎ、最低限「0」と出したいからです。事務処理の帳票では必須のテクニックです。
4. カンマ編集の具体的なプログラム例
実際に、プログラムの中でどのようにカンマ編集が行われるか見てみましょう。計算用の箱(変数)から、表示用の箱へデータを移す「MOVE(ムーブ)」という命令を使います。
DATA DIVISION.
WORKING-STORAGE SECTION.
* 計算用の変数(0を詰めて保持される)
01 WS-PRICE PIC 9(07) VALUE 1500300.
* 表示用の編集項目(カンマとゼロサプレスを指定)
01 WS-DISPLAY PIC Z,ZZZ,ZZ9.
PROCEDURE DIVISION.
* 計算用から表示用へデータを移動させる
MOVE WS-PRICE TO WS-DISPLAY.
* 画面に表示する
DISPLAY "金額は [" WS-DISPLAY "] 円です。"
STOP RUN.
このプログラムを実行すると、出力結果は以下のようになります。
金額は [1,500,300] 円です。
5. 小数点編集:正確な数値を伝える
次に、小数点の編集について解説します。お金の計算では円単位が多いですが、重さや長さ、あるいは利息の計算などでは小数点以下まで正確に出す必要があります。COBOLでは「.(ピリオド)」をPICTURE句に書き込むことで、小数点の位置を固定できます。
例えば、「PIC ZZZ.99」と定義すると、整数部分が3桁、小数部分が2桁の表示形式になります。注意点として、計算用の変数では「V」という記号を使って「仮想的な小数点」を指定しますが、表示用の変数では「実際のピリオド」を使います。これにより、桁がずれることなく整然とした帳票が作れます。
6. 小数点編集の具体的なプログラム例
平均値や比率を表示する際に便利な、小数点の編集例を紹介します。整数部分にゼロサプレスを使い、小数部分は必ず表示させる設定です。
DATA DIVISION.
WORKING-STORAGE SECTION.
* 比率を保持する計算用変数(小数点以下2桁)
01 WS-RATE-CALC PIC 9(3)V99 VALUE 012.34.
* 表示用の編集項目(ピリオドで区切る)
01 WS-RATE-DISP PIC ZZ9.99.
PROCEDURE DIVISION.
MOVE WS-RATE-CALC TO WS-RATE-DISP.
DISPLAY "比率は " WS-RATE-DISP " %です。"
* 値が小さい場合の例
MOVE 0.5 TO WS-RATE-CALC.
MOVE WS-RATE-CALC TO WS-RATE-DISP.
DISPLAY "修正後の比率は " WS-RATE-DISP " %です。"
STOP RUN.
実行結果は以下の通りです。
比率は 12.34 %です。
修正後の比率は 0.50 %です。
7. カンマと小数点の組み合わせ:複雑な表示
「1,234.56」のように、カンマと小数点を同時に使いたい場合も非常に多いです。この場合、PICTURE句を「PIC Z,ZZZ.99」のように組み合わせるだけです。COBOLは事務処理のプロフェッショナルですから、こうした複雑な要望にも簡単に応えられます。
データの長さが足りないと、大きな数字を入れたときに上の桁が切り捨てられてしまう「桁あふれ」という現象が起きます。定義するときは、あらかじめ想定される最大の数字よりも少し余裕を持って桁数を決めておくのが、トラブルを防ぐコツです。特に合計金額などを出す場所は要注意です。
8. 実践:帳票形式で並べてみよう
最後に、複数のデータを縦に並べて表示する、より実践的な例を見てみましょう。列が綺麗に揃う快感を味わってください。複数の編集項目を組み合わせることで、プロが作ったような美しい書類形式になります。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 ITEM-LINE.
05 ITEM-NAME PIC X(10).
05 FILLER PIC X(2).
05 ITEM-PRICE PIC Z,ZZZ,ZZ9.
05 FILLER PIC X(2).
05 ITEM-WEIGHT PIC ZZ9.9.
PROCEDURE DIVISION.
* 1行目のデータ設定
MOVE "RINGO" TO ITEM-NAME.
MOVE 1500 TO ITEM-PRICE.
MOVE 12.5 TO ITEM-WEIGHT.
DISPLAY ITEM-LINE.
* 2行目のデータ設定
MOVE "MERON" TO ITEM-NAME.
MOVE 120000 TO ITEM-PRICE.
MOVE 5.0 TO ITEM-WEIGHT.
DISPLAY ITEM-LINE.
STOP RUN.
このコードを実行すると、各項目が列ごとに美しく整列して出力されます。
RINGO 1,500 12.5
MERON 120,000 5.0
9. 初心者が間違えやすいポイント
数値編集において、プログラミング初心者が特によくやってしまうミスを2つお伝えします。
- 編集項目で計算しようとする: カンマやピリオドが入った「編集項目」は、あくまで「表示用(文字扱い)」です。足し算や引き算はできません。必ず「9」で定義した計算用の変数で計算を終えてから、最後に編集項目へMOVEしましょう。
- 桁数の不一致: 移動元の数字が「PIC 9(5)」なのに、移動先が「PIC ZZZ」だと、入りきらない数字が消えてしまいます。箱の大きさを合わせることが大切です。
この2点さえ気をつければ、COBOLの数値編集はあなたの強力な味方になります。事務処理プログラムの完成度をグッと高めるために、ぜひ活用してみてください!