カテゴリ: COBOL 更新日: 2026/08/20

COBOLのEDITING記述子を完全解説!初心者でもわかるPIC Z・\*・\$による整形出力

EDITING記述子(PIC Z, \*, \$など)で整形出力
EDITING記述子(PIC Z, \*, \$など)で整形出力

先生と生徒の会話形式で理解しよう

生徒

「先生、COBOLで数字をきれいに表示する方法ってありますか? たとえばカンマを入れたり、前にドルマークを付けたりとか…」

先生

「とても良い質問ですね。COBOLではPIC句の中で“編集記述子(EDITING記述子)”という機能を使って、数字の見た目を整えることができるんです。」

生徒

「編集記述子?なんだか難しそうですね…」

先生

「大丈夫。使い方を覚えれば、誰でも簡単にできるようになりますよ。今日はPIC Z*$などを使って、きれいな数値の整形出力を学びましょう!」

1. EDITING記述子とは?数値を見やすく整える魔法の記号

1. EDITING記述子とは?数値を見やすく整える魔法の記号
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(ゼロ)を消して表示する方法:ゼロサプレス

2. PIC Zで先頭の0(ゼロ)を消して表示する方法:ゼロサプレス
2. PIC Zで先頭の0(ゼロ)を消して表示する方法:ゼロサプレス

COBOLで数値を扱う際、そのまま表示すると00456のように、本来は不要な「0」が頭に付いてしまいます。これを専門用語で「ゼロ抑制(ゼロサプレス)」と呼び、編集記号Zを使うことで、先頭の0を自然な空白(スペース)に置き換えることができます。

プログラミング未経験の方でも分かりやすいよう、身近な「商品の価格表示」を例に、具体的なコードを見ていきましょう。5桁の領域に456円という数値が入っているケースを想定します。


IDENTIFICATION DIVISION.
PROGRAM-ID. EDIT-Z-DEMO.

DATA DIVISION.
WORKING-STORAGE SECTION.
* 元の数値データ(5桁で00456が入っている)
01  PRICE        PIC 9(5) VALUE 00456.
* 表示用のデータ項目(先頭4桁をZで定義)
01  PRICE-DISP   PIC ZZZZ9.

PROCEDURE DIVISION.
    * 実際の数値を表示用の項目にコピー(転記)する
    MOVE PRICE TO PRICE-DISP
    DISPLAY "表示結果:[" PRICE-DISP "]"
    STOP RUN.

このプログラムを実行すると、出力結果は以下のようになります。


表示結果:[  456]

実行結果を見ると、00456の先頭にある2つの「0」が消えて、空白になっているのが分かります。一方で、一番右側の「6」に対応する部分は9と定義しているため、数値がそのまま表示されます。

このように、「数字の桁数は確保したいけれど、先頭の余計な0は見せたくない」という場面でZは非常に重宝します。請求書や伝票の金額表示など、読みやすさが求められるシステム開発では必須のテクニックです。

3. 編集用文字「,(カンマ)」で数値を3桁区切りにする方法

3. 編集用文字「,(カンマ)」で数値を3桁区切りにする方法
3. 編集用文字「,(カンマ)」で数値を3桁区切りにする方法

家計簿や仕事の書類でも、大きな数字は3桁ごとにカンマ「,」がついていると、一目で「いくらか」が分かりやすくなりますよね。COBOLでは、このカンマ入りの表示を「編集用文字」を使って驚くほど簡単に実現できます。

プログラミング未経験の方でも安心してください。やり方は簡単で、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-AMOUNT
    DISPLAY "売上金額(変換後):" SALES-DISPLAY
    STOP RUN.

このプログラムを実行すると、画面には次のように表示されます。


売上金額(変換前):1234567
売上金額(変換後): 1,234,567

初心者向けの解説:ここがポイント!

注目してほしいのは、SALES-DISPLAYの定義に使われている「Z」という文字です。これは「ゼロサプレス」と呼ばれる機能で、もし数字が小さくて桁が余った場合に、不要な「0」を表示せずに「空白」に置き換えてくれる魔法の文字です。

この「Z」と「,」を組み合わせることで、「0,001,234」のような不自然な表示を防ぎ、私たちが普段見慣れている「1,234」という綺麗な形式で出力できます。金融システムや請求書発行システムなど、正確で見やすい数値が求められる現場では欠かせないテクニックです。

4. 金額の改ざん防止に役立つ!PIC *(アスタリスク)で空白を埋める方法

4. 金額の改ざん防止に役立つ!PIC *(アスタリスク)で空白を埋める方法
4. 金額の改ざん防止に役立つ!PIC *(アスタリスク)で空白を埋める方法

銀行の小切手や企業の請求書などをイメージしてみてください。金額の前に不自然な空白があると、後から数字を書き加えられてしまうリスク(改ざん)があります。COBOLでは、こうしたセキュリティ対策や視認性向上のために、空白部分を自動的に「*(アスタリスク)」で埋める機能が備わっています。

プログラミング未経験の方でも、この「アスタリスク編集」を使えば、プロが作る帳票のような「安全で美しい出力」が簡単に実現できます。具体的には、編集用項目のPIC句に*を記述するだけで、ゼロ抑制(不要な0を消す機能)と同時に、消えた部分をアスタリスクで埋めてくれます。


IDENTIFICATION DIVISION.
PROGRAM-ID. EDIT-STAR-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
* 元の数値(5桁のうち3桁を使用)
01  WS-AMOUNT         PIC 9(5) VALUE 123.
* 編集後の出力用(アスタリスクで埋め、カンマも付与)
01  WS-AMOUNT-EDITED  PIC **,**9.

PROCEDURE DIVISION.
MAIN-RTN.
    * 数値を編集用項目に転記するだけで自動変換されます
    MOVE WS-AMOUNT TO WS-AMOUNT-EDITED
    DISPLAY "加工前の値:" WS-AMOUNT
    DISPLAY "加工後の出力:" WS-AMOUNT-EDITED
    STOP RUN.

上記のプログラムを実行した結果は、以下の通りです。


加工前の値:00123
加工後の出力:**123

【解説:ここがポイント!】
元の数値 123 は5桁の枠に対して2桁分(先頭の00)が余っています。通常、これを出力すると 00123 や空白を含む 123 になりますが、PIC **,**9 を指定することで、余った左側のスペースがすべて * に置き換わっています。

このようにCOBOLの編集記号を使いこなすことで、複雑な計算ロジックを書くことなく、たった1行の定義だけで「改ざんできない安全な帳票レイアウト」を作成できるのがCOBOLの大きな強みです。

5. PIC $(ドル記号)で金額表示を行う:通貨編集用文字の活用

5. PIC $(ドル記号)で金額表示を行う:通貨編集用文字の活用
5. PIC $(ドル記号)で金額表示を行う:通貨編集用文字の活用

プログラミングで家計簿や在庫管理システムを作る際、数字の前に「$(ドル)」や「¥(円)」といった通貨記号がついていると、一目で金額だと分かりやすくなりますよね。COBOLでは、PIC句に「$」を記述するだけで、数字を自動的に通貨形式に整えてくれる便利な機能があります。

例えば、データとしては「12345」というただの数字であっても、表示用の項目に「$」を指定して代入(MOVE)するだけで、適切な位置にドルマークを配置し、必要に応じてカンマ区切りも同時に行うことができます。これは「編集用文字」と呼ばれるCOBOLの得意分野です。

プログラミングが初めての方でも分かりやすい、シンプルなサンプルコードを見てみましょう。


IDENTIFICATION DIVISION.
PROGRAM-ID. EDIT-DOLLAR-DEMO.

DATA DIVISION.
WORKING-STORAGE SECTION.
* 元の数字データ(5桁の数値)
01  PRICE         PIC 9(5) VALUE 12345.
* 表示用のデータ($マークとカンマ、ゼロ抑制を組み合わせた形式)
01  PRICE-DISP    PIC $ZZ,ZZ9.

PROCEDURE DIVISION.
    * 数字を表示用項目にコピーすると、自動で整形されます
    MOVE PRICE TO PRICE-DISP
    DISPLAY "商品価格(成型後):" PRICE-DISP
    STOP RUN.

実行結果:


商品価格(成型後):$12,345

初心者向けの解説ポイント

  • PIC $ZZ,ZZ9の意味: 「$」は通貨記号を表示し、「Z」は数字のゼロが先頭に来た場合に空白に置き換える(ゼロ抑制)という意味です。これにより、「$00,100」ではなく「$ 100」のように自然な見た目になります。
  • 自動整形: MOVE文で値を移すだけで、COBOLが裏側で「記号の付与」と「桁区切り」を同時に処理してくれます。
  • 日本円の場合: 日本のシステムでは、PIC句に直接「\」を指定するか、記号を文字として連結する方法が一般的です。まずは基本の「$」で、数字が見やすい「金額データ」に変わる感覚を掴んでみましょう。

6. 符号(+ / -)を表示する

6. 符号(+ / -)を表示する
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. 編集記述子の組み合わせでプロ並みの出力を作る

7. 編集記述子の組み合わせでプロ並みの出力を作る
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. 実務での活用例

8. 実務での活用例
8. 実務での活用例

実際の企業システムでは、帳票やレポート、画面出力などでこれらの編集記述子がよく使われます。特に金融システムや販売管理システムでは、数字の桁数が多くなるため、見やすさ信頼性が重要です。

たとえば売上報告書などで「$***12,345」と表示すれば、ぱっと見ただけで桁や金額が明確に分かります。こうした細かい表示の工夫が、業務の正確性を高めるのです。

9. まとめ:COBOLの編集記述子で美しい数値出力を作ろう

9. まとめ:COBOLの編集記述子で美しい数値出力を作ろう
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の奥深さを感じました!」

先生

「その通り。表示の美しさはシステムの信頼性に直結します。次は、もっと複雑な条件分岐や計算結果の丸め処理についても学んでいきましょうか。」

カテゴリの一覧へ
新着記事
New1
C#
C#のLINQでWhere・Select・OrderByを使う方法を完全解説!初心者でもわかる基本操作
New2
C#
C#プログラムの実行方法まとめ!Visual Studio・コマンドライン・.NET CLIの使い方
New3
Azure
Azure DDoS ProtectionとAzure WAFの違いとは?アプリレイヤーまで守る最強の防御策を徹底解説
New4
C#
C#でHello Worldを表示する方法を完全ガイド!初心者でも1行から始められる入門講座
人気記事
No.1
Java&Spring記事人気No1
C#
C#のWPFとは?XAMLでGUI開発を基礎から完全解説!初心者向けの入門ガイド
No.2
Java&Spring記事人気No2
Azure
Azure SQL Database購入モデル比較!vCoreとDTUの違いと選び方を初心者向けに解説
No.3
Java&Spring記事人気No3
Azure
Azure ExpressRouteとBGPプロトコルを徹底解説!ルート広報の仕組みとルーティング設計の基本
No.4
Java&Spring記事人気No4
C#
C#の文字列を数値に変換する方法(int.Parse・TryParse)をわかりやすく解説!
No.5
Java&Spring記事人気No5
C#
C#のforeachループを完全ガイド!初心者でもわかるコレクション操作の基本
No.6
Java&Spring記事人気No6
C#
C#の日付型(DateTime)と基本的な使い方を解説|初心者向け入門ガイド
No.7
Java&Spring記事人気No7
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.8
Java&Spring記事人気No8
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説