COBOLの文字編集記述子を完全解説!PIC Z・$・*で帳票を美しく
生徒
「COBOLで計算した結果を印刷するとき、数字の前の『000』を消したり、¥マークを付けたりすることはできますか?」
先生
「もちろんです!COBOLには『文字編集記述子』という便利な機能があって、数字を人間が見やすい形に整えるのが得意なんですよ。」
生徒
「帳票出力の時に使う PIC Z とか PIC $ ってやつですね。具体的にはどう使い分けるんですか?」
先生
「事務処理でよく使う記号には決まったルールがあります。基本的な使い方を順番にマスターしていきましょう!」
1. 文字編集記述子とは?
COBOL(コボル)は、主に企業の事務処理や銀行のシステムなどで使われてきたプログラミング言語です。そのため、請求書や領収書といった「帳票(ちょうひょう)」を印刷する機能が非常に充実しています。この帳票を作るときに、計算された生データを「人間が読みやすい形式」に変換するための仕組みを文字編集記述子(へんしゅうきじゅつし)と呼びます。
例えば、コンピュータの内部では「0012345」という数字で持っていても、そのまま紙に印刷すると読みづらいですよね。これを「12,345」とコンマを入れたり、「\12,345」と通貨記号を付けたりするのが「編集」という作業です。COBOLでは変数の型を決める「PIC句(ピクチャ句)」の中に特定の記号を書くだけで、この編集を自動で行ってくれます。
2. ゼロ抑制(ゼロサプレス)の「Z」
最も基本的な記述子が「Z」です。これはゼロ抑制(ゼロサプレス)と呼ばれる機能で、数値の先頭にある無意味な「0」を空白(スペース)に置き換えます。例えば、5桁の領域に「100」を入れると通常は「00100」となりますが、Zを使うことで「 100」という自然な見た目にできます。
実務では、すべての桁をZにするのではなく、一番右の桁だけは「9」にしておくことが多いです。こうすることで、もし値が完全に「0」だった場合に、何も表示されないのではなく「0」と一文字表示されるようになり、誤解を防ぐことができます。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 KAZU-INPUT PIC 9(5) VALUE 150.
01 KAZU-OUTPUT PIC ZZZZ9.
PROCEDURE DIVISION.
MOVE KAZU-INPUT TO KAZU-OUTPUT.
DISPLAY "編集前: [" KAZU-INPUT "]"
DISPLAY "編集後: [" KAZU-OUTPUT "]"
STOP RUN.
編集前: [00150]
編集後: [ 150]
3. 通貨記号を表示する「$」
お金を扱うプログラムで欠かせないのが、通貨記号を表示する「$」です。日本のシステム設定ではこれが自動的に「\(円記号)」に置き換わることが一般的です。この記述子の凄いところは、数字の長さに合わせて記号の位置を動かせる浮動挿入(ふどうそうにゅう)という機能です。
「$」を複数並べて書くと、数字が始まる直前の位置にだけ記号を表示し、それより左側は空白にしてくれます。これにより、金額の改ざんを防ぎつつ、読みやすい位置に通貨記号を配置できます。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PRICE-VAL PIC 9(6) VALUE 12500.
01 PRICE-EDIT PIC $$$$$$9.
PROCEDURE DIVISION.
MOVE PRICE-VAL TO PRICE-EDIT.
DISPLAY "表示価格: " PRICE-EDIT.
STOP RUN.
表示価格: $12500
4. 不正防止の「*」(チェック保護)
「*(アスタリスク)」は、チェック保護と呼ばれる特別な編集に使われます。これは小切手や証書を発行する際、空いているスペースに勝手に数字を書き足されないように、ゼロ抑制した部分を空白ではなく「*」で埋める機能です。
「Z」が空白にするのに対し、「*」は「***123」のように埋めてくれるため、一目でここには数字が入っていないことが分かり、セキュリティ上の効果があります。これも事務処理を重視するCOBOLならではの非常に重要な記述子です。
5. コンマとピリオドによる桁区切り
大きな数字を扱う際、3桁ごとにコンマを入れるのは世界の共通ルールです。COBOLでは記述子の中に直接「,(コンマ)」を書くだけで、自動的に区切りを挿入してくれます。また、小数点が必要な場合は「.(ピリオド)」を使います。
これらは挿入記述子と呼ばれ、数字がその桁に存在する場合にだけ記号を表示するように「Z」や「$」と組み合わせて使うのが一般的です。例えば「PIC ZZZ,ZZ9」と定義すれば、1000以上の時にだけコンマが表示され、999以下の時はコンマの部分も空白になります。非常にスマートですね。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 KINGAKU PIC 9(7) VALUE 1234567.
01 KINGAKU-OUT PIC Z,ZZZ,ZZ9.
PROCEDURE DIVISION.
MOVE KINGAKU TO KINGAKU-OUT.
DISPLAY "整形結果: " KINGAKU-OUT.
STOP RUN.
整形結果: 1,234,567
6. プラス・マイナス符号の扱い「+, -」
数値データにはマイナスの概念もあります。赤字(マイナス)の時にだけマイナス記号を出したい、あるいはプラスの時も明示的に「+」を出したいという場合に、これらの記号を使います。
- -(マイナス):数値が負の時だけ「-」を表示し、正の時は空白にします。
- +(プラス):数値が正なら「+」、負なら「-」を必ず表示します。
これらも浮動挿入が可能で、数字の直前に符号を持ってくることができます。損益計算など、符号が重要な意味を持つ帳票では欠かせない設定項目です。
7. 編集記述子の重要なルール:計算はできない
最後に、プログラミング初心者が必ず覚えておくべき大切な注意点があります。それは、「編集記述子を使った変数(お皿)では、足し算や引き算などの計算はできない」ということです。
文字編集記述子を適用した変数は、コンピュータの中では「数値」ではなく「表示用の文字列」として扱われます。したがって、計算を行うときは「PIC 9(5)」のような純粋な数値変数で行い、最後に画面や紙に出力する直前に「MOVE」命令で編集用の変数にコピーする、という手順を踏みます。料理で例えると、「お鍋(数値変数)」で調理してから、「飾り付け用のお皿(編集記述子)」に盛り付けるというイメージです。
8. 日付やスラッシュの挿入「B, 0, /」
特定の文字を強制的に間に挟む記述子もあります。これらを使うと日付などの整形が非常に楽になります。
- B:空白を1文字入れます。
- 0:ゼロを1文字入れます。
- /:スラッシュを1文字入れます。
例えば、日付データ「20260112」を「2026/01/12」と表示したい場合は、変数の定義を「PIC 9999/99/99」とするだけで、MOVEするだけで自動的にスラッシュが入ります。一文字ずつ分解して繋ぎ直す手間が省けるため、プログラムがとてもシンプルになります。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 DAY-DATA PIC 9(8) VALUE 20260112.
01 DAY-EDIT PIC 9999/99/99.
PROCEDURE DIVISION.
MOVE DAY-DATA TO DAY-EDIT.
DISPLAY "本日付: " DAY-EDIT.
STOP RUN.
本日付: 2026/01/12