COBOLのEDITING記述子を完全解説!初心者でもわかるPIC Z・\*・\$による整形出力
生徒
「先生、COBOLで数字をきれいに表示する方法ってありますか? たとえばカンマを入れたり、前にドルマークを付けたりとか…」
先生
「とても良い質問ですね。COBOLではPIC句の中で“編集記述子(EDITING記述子)”という機能を使って、数字の見た目を整えることができるんです。」
生徒
「編集記述子?なんだか難しそうですね…」
先生
「大丈夫。使い方を覚えれば、誰でも簡単にできるようになりますよ。今日はPIC Z、*、$などを使って、きれいな数値の整形出力を学びましょう!」
1. EDITING記述子とは?数値を見やすく整える魔法の記号
COBOLのEDITING記述子(編集記述子)とは、プログラムが扱う「生のデータ」を、人間が見て理解しやすい「表示用のフォーマット」に変換する仕組みのことです。
プログラミング未経験の方でも、Excelの「セルの書式設定」をイメージすると分かりやすいでしょう。例えば、コンピュータ内部では「0001234」と保持されている数値も、そのままでは読みにくいですよね。編集記述子を使えば、自動でカンマを打つ、先頭の不要なゼロを消す、金額記号を添えるといった整形が、PIC句(ピクチャ句)に記号を書き加えるだけで実現できます。
内部データ:
0012500編集記述子を適用後:
\12,500(一目で金額だとわかります!)
COBOLでよく使われる代表的な編集記述子(記号)には、以下のようなものがあります。
| 記号 | 役割(編集機能) | 活用シーン |
|---|---|---|
| Z | ゼロ抑制(先頭の不要な0を空白にする) | 出席番号や数量の表示 |
| 9 | 数字(そのまま表示) | 桁数を固定したい場合 |
| , | コンマ挿入(3桁区切りのカンマを入れる) | 売上高や家計簿などの金額 |
| * | アスタリスク充填(空白を「*」で埋める) | 小切手の不正改ざん防止 |
| $ | 通貨記号(先頭にドル記号などを付ける) | 海外通貨の請求書出力 |
| + / - | 符号表示(プラス・マイナスの表示) | 収支報告や温度計のデータ |
もっともシンプルな比較サンプルを見てみましょう。「そのまま表示(9)」と「編集記述子を使った表示(Z)」の違いを確認してください。
IDENTIFICATION DIVISION.
PROGRAM-ID. INTRO-EDITING.
DATA DIVISION.
WORKING-STORAGE SECTION.
* 1. 整形前のデータ(5桁の数字)
01 RAW-DATA PIC 9(5) VALUE 00123.
* 2. 編集記述子 Z を使った表示用変数
01 EDIT-DATA PIC ZZZZ9.
PROCEDURE DIVISION.
* データを表示用変数にコピー(この瞬間に整形される)
MOVE RAW-DATA TO EDIT-DATA
DISPLAY "そのまま表示:" RAW-DATA
DISPLAY "整形して表示:" EDIT-DATA
STOP RUN.
そのまま表示:00123
整形して表示: 123
このように、PIC句に少し工夫を凝らすだけで、ユーザーにとって親切なシステム画面や帳票を作ることができるのが、COBOLの大きな強みです。それでは、各記号の具体的な使い方を順番にマスターしていきましょう。
2. PIC Zで先頭の0を消して表示する
まずは、最も基本的なZの使い方を見てみましょう。これは数値の先頭にある不要な「0」を消して、空白にしてくれます。
IDENTIFICATION DIVISION.
PROGRAM-ID. EDIT-Z-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PRICE PIC 9(5) VALUE 00456.
01 PRICE-DISP PIC ZZZZ9.
PROCEDURE DIVISION.
MOVE PRICE TO PRICE-DISP
DISPLAY "表示結果:" PRICE-DISP
STOP RUN.
このプログラムの出力は次のようになります。
表示結果: 456
数字の前にあった0が消えて、きれいに表示されています。先頭の0を消して空白にするのがZの役割です。
3. PIC ,(カンマ)で3桁区切りにする
次に、金額などでよく使う3桁ごとのカンマ区切りの表示をしてみましょう。これもPIC句に「,」を入れるだけです。
IDENTIFICATION DIVISION.
PROGRAM-ID. EDIT-COMMA-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SALES-AMOUNT PIC 9(7) VALUE 1234567.
01 SALES-DISPLAY PIC ZZ,ZZZ,ZZ9.
PROCEDURE DIVISION.
MOVE SALES-AMOUNT TO SALES-DISPLAY
DISPLAY "売上金額:" SALES-DISPLAY
STOP RUN.
出力結果はこうなります。
売上金額: 1,234,567
自動的にカンマが入って見やすくなっています。会計処理や帳票出力では必須の機能です。
4. PIC *(アスタリスク)で空白を*に置き換える
金額などを印刷するとき、空白部分を「*」で埋めたい場合があります。これは改ざん防止や見た目を整える目的で使われます。そのときに使うのが*です。
IDENTIFICATION DIVISION.
PROGRAM-ID. EDIT-STAR-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 AMOUNT PIC 9(5) VALUE 123.
01 AMOUNT-EDITED PIC **,**9.
PROCEDURE DIVISION.
MOVE AMOUNT TO AMOUNT-EDITED
DISPLAY "出力結果:" AMOUNT-EDITED
STOP RUN.
実行結果は次のようになります。
出力結果:**1,23
このように、空白が「*」で埋められ、きれいに整った印象になります。帳票印刷などで「見せ方」を工夫したいときに使われます。
5. PIC $(ドル記号)で金額表示を行う
金額データに「ドルマーク」や「円記号」を付けたいときは、$を使います。これを指定すると、自動的に金額の前に「$」が付きます。
IDENTIFICATION DIVISION.
PROGRAM-ID. EDIT-DOLLAR-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PRICE PIC 9(6) VALUE 12345.
01 PRICE-DISP PIC $ZZ,ZZ9.
PROCEDURE DIVISION.
MOVE PRICE TO PRICE-DISP
DISPLAY "商品価格:" PRICE-DISP
STOP RUN.
実行結果は次の通りです。
商品価格:$12,345
簡単に「$」付きの金額表示ができます。日本円で使う場合は、「¥」を文字列として付けてもOKです。
6. 符号(+ / -)を表示する
数値がプラスかマイナスかを見せたいときは、「+」や「-」を編集記述子に含めます。
IDENTIFICATION DIVISION.
PROGRAM-ID. EDIT-SIGN-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 BALANCE PIC S9(5) VALUE -2500.
01 BALANCE-DISP PIC +ZZ,ZZ9.
PROCEDURE DIVISION.
MOVE BALANCE TO BALANCE-DISP
DISPLAY "残高:" BALANCE-DISP
STOP RUN.
出力結果は次のようになります。
残高:-2,500
符号が自動で付いているのがわかります。会計処理などでは、この形式がよく使われます。
7. 編集記述子の組み合わせでプロ並みの出力を作る
ここまで紹介した記述子は、組み合わせることでより高度な整形ができます。たとえば、ドルマーク付きでカンマ区切り、さらに不要な0を消す、というようなことも可能です。
IDENTIFICATION DIVISION.
PROGRAM-ID. EDIT-COMBO-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SALES-TOTAL PIC 9(7) VALUE 0004567.
01 SALES-FORMAT PIC $**,***,ZZ9.
PROCEDURE DIVISION.
MOVE SALES-TOTAL TO SALES-FORMAT
DISPLAY "売上合計:" SALES-FORMAT
STOP RUN.
出力結果:
売上合計:$**4,567
このように、複数の編集記述子を組み合わせて使うことで、見やすくて実用的な表示を作ることができます。
8. 実務での活用例
実際の企業システムでは、帳票やレポート、画面出力などでこれらの編集記述子がよく使われます。特に金融システムや販売管理システムでは、数字の桁数が多くなるため、見やすさと信頼性が重要です。
たとえば売上報告書などで「$***12,345」と表示すれば、ぱっと見ただけで桁や金額が明確に分かります。こうした細かい表示の工夫が、業務の正確性を高めるのです。
9. まとめ:COBOLの編集記述子で美しい数値出力を作ろう
COBOLのEDITING記述子を使うことで、数字をきれいに整形して出力できます。Zで0を消し、,で桁区切り、*や$でデザイン性を加えれば、実務で使える見やすい帳票を作ることができます。これらをマスターすることで、COBOLの数値表示の幅が大きく広がります。
まとめ
ここまで、COBOLにおける「EDITING記述子(編集記述子)」の基本から応用までを詳しく解説してきました。数値データの扱いに長けたCOBOLにとって、単に計算を行うだけでなく「人間が見やすい形に整えて出力する」という工程は、非常に重要な役割を担っています。
編集記述子の役割と重要性
プログラム内部で保持されている数値データは、計算効率を優先するため、符号(S)や想定小数点(V)を含んだ形式になっています。しかし、これをそのまま画面や紙の帳票に出力しても、エンドユーザーにとっては非常に読みづらいものになってしまいます。そこで登場するのが、PIC句(ピクチャ句)を用いた編集記述子です。
特に、金融系や公共系のレガシーシステムが現役で稼働している現場では、金額の改ざん防止(アスタリスク埋め)や、厳密なカンマ区切り、正しい通貨記号の付与といった「表示の信頼性」が強く求められます。今回学んだZ、,、*、$、+といった記号を適切に使い分けることで、バグのない、かつ視認性の高いシステムを構築することができるようになります。
実務で使える!さらに高度な編集のテクニック
記事本編でも組み合わせの例を紹介しましたが、実務では「もし値が0だった場合にどう見せるか」という点がよく議論になります。たとえば、PIC ZZZ9と指定した場合、値が「0」のときは「 0」と表示されますが、すべてを空白にしたい場合はPIC ZZZZ(またはPIC Z(4))と記述します。このように、要件定義に合わせて一文字単位で制御できるのがCOBOLの強みです。
C#での数値フォーマットとの比較
現代的なオブジェクト指向言語であるC#などでも、数値を整形する機能は備わっています。COBOLの編集記述子がどのようにモダンな言語に反映されているか、比較用のサンプルコードを見てみましょう。
using System;
class Program
{
static void Main()
{
long salesAmount = 1234567;
decimal price = 12345.67m;
// C#でのカンマ区切り出力(COBOLのPIC ZZ,ZZZ,ZZ9に相当)
Console.WriteLine($"売上金額:{salesAmount:N0}");
// C#での通貨表示(COBOLのPIC $ZZ,ZZ9.99に相当)
// 実行環境のロケールに合わせて¥や$が自動付与されます
Console.WriteLine($"商品価格:{price:C}");
// ゼロ埋め(カスタム書式)
int code = 45;
Console.WriteLine($"商品コード:{code:D5}");
}
}
C#を実行した結果は以下の通りです。
売上金額:1,234,567
商品価格:¥12,346
商品コード:00045
C#ではメソッドやフォーマット識別子を使って動的に整形を行いますが、COBOLは「データ定義そのものに表示形式を組み込む」という設計思想を持っています。この違いを理解しておくと、他言語へのリプレース案件や、外部システムとの連携時にも非常に役立ちます。
COBOLでの応用:ゼロサプレスとチェック保護
あらためて、COBOLでよく使われるテクニックを整理した総合的なサンプルプログラムを確認しておきましょう。特に「チェック保護(アスタリスク)」と「ゼロサプレス(Z)」の挙動の違いに注目してください。
IDENTIFICATION DIVISION.
PROGRAM-ID. EDIT-SUMMARY.
DATA DIVISION.
WORKING-STORAGE SECTION.
* 元の数値データ
01 VAL-NUM PIC 9(6) VALUE 000789.
* 1. ゼロサプレス(先頭の0を空白に)
01 DISP-Z PIC ZZZ,ZZ9.
* 2. チェック保護(先頭の0を*に:小切手印刷などで使用)
01 DISP-STAR PIC ***,**9.
* 3. 通貨記号(フローティング・ドル:金額の直前に$を置く)
01 DISP-DOLLAR PIC $$,$$9.
PROCEDURE DIVISION.
MOVE VAL-NUM TO DISP-Z
DISPLAY "ゼロサプレス結果 :[" DISP-Z "]"
MOVE VAL-NUM TO DISP-STAR
DISPLAY "チェック保護結果 :[" DISP-STAR "]"
MOVE VAL-NUM TO DISP-DOLLAR
DISPLAY "ドル記号フローティング:[" DISP-DOLLAR "]"
STOP RUN.
出力結果は以下のようになります。
ゼロサプレス結果 :[ 789]
チェック保護結果 :[***,789]
ドル記号フローティング:[ $789]
このように、$記号を複数並べる「フローティング(浮動)」記述を使うと、数字の桁数に合わせて通貨記号が右に寄って表示されるため、非常にプロフェッショナルな見た目になります。これもCOBOLが事務処理に特化した言語と言われる所以ですね。
生徒
「先生、ありがとうございます!編集記述子を使うだけで、あんなにバラバラだった数字が、まるでプロの帳票みたいに整いました。特にPIC $$,$$9のように記号を並べるだけで、ドルマークが数字のすぐ横に移動してくれるのは驚きました。」
先生
「そこに気づきましたか!それは『浮動挿入』というテクニックですね。固定の場所に記号を置くのではなく、数値の大きさに合わせて位置が変わる仕組みです。これもCOBOLが長年、銀行や企業の経理システムで愛されてきた理由の一つなんですよ。」
生徒
「なるほど…。でも、もし間違えてPIC 99,999で定義したところに、もっと大きな数字をMOVEしちゃったらどうなるんですか?」
先生
「いい着眼点です。桁溢れ(オーバーフロー)が発生して、上位の桁が消えてしまうことがあります。だからCOBOLプログラマは、データの最大値を常に予測して、余裕を持った桁数で編集記述子を設計する必要があるんです。」
生徒
「プログラムの書き方だけでなく、データの『出口』までしっかり考えるのが大事なんですね。アスタリスクで埋めるのも、ただの飾りじゃなくて改ざん防止っていう意味があると知って、COBOLの奥深さを感じました!」
先生
「その通り。表示の美しさはシステムの信頼性に直結します。次は、もっと複雑な条件分岐や計算結果の丸め処理についても学んでいきましょうか。」