Nilai numerik yang tersimpan di dalam field selalu tampil mentah, misalnya 0001234.5 dengan nol pengisi, padahal laporan ditujukan kepada manusia yang terbiasa membaca 1.234,50. Topik ini membahas picture hasil edit, yaitu picture yang dirancang untuk tampilan, beserta simbol supresi nol, pemisah, tanda, dan perlindungan cek yang tersedia di dalamnya.
Picture data dan picture edit#
Picture yang hanya memuat X, A, dan 9 disebut picture data karena fieldnya menyimpan nilai, sedangkan picture yang memuat simbol seperti Z, koma, dan tanda disebut picture edit karena fieldnya hanya digunakan untuk menampilkan nilai. Field hasil edit menempati memori sesuai jumlah simbolnya, tetapi kategorinya bukan numeric, sehingga field tersebut tidak sah untuk aritmetika. Pola kerjanya selalu dua langkah, yaitu nilai disimpan pada field PIC 9 atau PIC S9, kemudian dipindahkan dengan MOVE ke field hasil edit saat akan ditampilkan.
* tidak-dijalankan
01 TOTAL-EDIT PIC ZZZ9.99.
PROCEDURE DIVISION.
ADD 1 TO TOTAL-EDITCompiler menolak pernyataan ADD 1 TO TOTAL-EDIT di atas dengan pesan error error: 'TOTAL-EDIT' is not a numeric name, sehingga kesalahan semacam ini tertangkap saat kompilasi, sebelum program berjalan. Pemindahan nilai terlalu besar ke field hasil edit berlaku seperti MOVE biasa, yaitu digit kiri terpotong tanpa pesan, sehingga lebar field edit juga harus dihitung dari nilai maksimum yang mungkin.
Lebar field hasil edit dihitung dari jumlah simbolnya sebagaimana field data. Simbol yang memakan lebih dari satu karakter dihitung sesuai panjangnya, sehingga akhiran CR menambah dua posisi dan setiap koma menambah satu posisi. Kebiasaan yang baik adalah menurunkan picture edit langsung dari picture data yang menyimpan nilainya, lalu menambahkan simbol pemisah dan tanda pada ukuran yang masih menampung nilai maksimum.
Supresi nol dengan koma dan titik#
Simbol Z menekan nol di depan menjadi spasi, simbol koma menyisipkan pemisah ribuan, dan simbol titik menampilkan tanda desimal pada posisi V. Gabungan ketiganya mengubah 001234.50 menjadi 1.234,50 atau 1,234.50 tergantung pada gaya yang dipilih. Program berikut memformat nilai 1234.50 dan -1234.50 dengan beberapa picture hasil edit yang lazim digunakan untuk nilai uang.
IDENTIFICATION DIVISION.
PROGRAM-ID. FORMAT-UANG.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NILAI-POS PIC S9(6)V99 VALUE 1234.5.
01 NILAI-NEG PIC S9(6)V99 VALUE -1234.5.
01 T-BIASA PIC ZZZZZ9.99.
01 T-KOMA PIC ZZZ,ZZ9.99.
01 T-PLUS PIC +ZZZ,ZZ9.99.
01 T-MIN PIC -ZZZ,ZZ9.99.
01 T-MIN-POS PIC -ZZZ,ZZ9.99.
01 T-CR PIC ZZZ,ZZ9.99CR.
01 T-DB PIC ZZZ,ZZ9.99DB.
PROCEDURE DIVISION.
MOVE NILAI-POS TO T-BIASA
MOVE NILAI-POS TO T-KOMA
MOVE NILAI-POS TO T-PLUS
MOVE NILAI-NEG TO T-MIN
MOVE NILAI-POS TO T-MIN-POS
MOVE NILAI-NEG TO T-CR
MOVE NILAI-NEG TO T-DB
DISPLAY "Z saja : [" T-BIASA "]"
DISPLAY "Koma ribu + titik : [" T-KOMA "]"
DISPLAY "Tanda + : [" T-PLUS "]"
DISPLAY "Tanda -, nilai neg : [" T-MIN "]"
DISPLAY "Tanda -, nilai pos : [" T-MIN-POS "]"
DISPLAY "Akhiran CR : [" T-CR "]"
DISPLAY "Akhiran DB : [" T-DB "]"
STOP RUN.Z saja : [ 1234.50]
Koma ribu + titik : [ 1,234.50]
Tanda + : [+ 1,234.50]
Tanda -, nilai neg : [- 1,234.50]
Tanda -, nilai pos : [ 1,234.50]
Akhiran CR : [ 1,234.50CR]
Akhiran DB : [ 1,234.50DB]Baris pertama menunjukkan bahwa ZZZZZ9.99 hanya menekan nol di depan, sehingga 1234.50 tampil dengan dua spasi pengisi tanpa koma. Baris kedua menambahkan koma ribuan sehingga terbaca 1,234.50. Simbol plus selalu menampilkan tanda, baik plus maupun minus, sedangkan simbol minus hanya menampilkan minus untuk nilai negatif dan spasi untuk nilai positif, sebagaimana ditunjukkan dua baris bertanda minus. Akhiran CR dan DB tampil pada nilai negatif dan menjadi dua spasi ketika nilai positif.
Reproduksi keluaran di atas dengan perintah berikut, lalu jalankan ./format-uang.
# kompilasi program menjadi eksekutabel
cobc -x format-uang.cblTanda, akhiran CR dan DB, serta simbol penyisip lainnya#
Selain simbol yang sudah dicoba, picture edit menyediakan simbol penyisip (insertion) untuk kebutuhan tampilan tertentu. Simbol B menyisipkan spasi, simbol 0 menyisipkan nol sungguhan, dan simbol garis miring menyisipkan / pada posisinya. Simbol bintang menyediakan check protection, yaitu perlindungan cek, dengan mengganti nol depan menjadi bintang agar angka pada cek tidak mudah dipalsukan. Persen tidak memiliki simbol sendiri dan cukup ditampilkan sebagai literal terpisah pada DISPLAY.
| Simbol | Fungsi |
|---|---|
Z | menekan nol depan menjadi spasi |
, | menyisipkan koma pemisah ribuan |
. | menampilkan titik desimal pada posisi V |
+ | menampilkan plus untuk positif dan minus untuk negatif |
- | menampilkan minus untuk negatif dan spasi untuk positif |
CR, DB | akhiran dua karakter untuk nilai negatif |
* | mengisi posisi kosong dengan bintang sebagai perlindungan cek |
B | menyisipkan spasi |
0 | menyisipkan nol sungguhan |
/ | menyisipkan garis miring |
Program berikut mencoba simbol-simbol tersebut dalam satu program utuh.
IDENTIFICATION DIVISION.
PROGRAM-ID. FORMAT-LAIN.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 ANGKA-KECIL PIC 9(3) VALUE 7.
01 ANGKA-BESAR PIC 9(6) VALUE 123456.
01 TANGGAL-ANGKA PIC 9(6) VALUE 260315.
01 BULAN PIC 99 VALUE 3.
01 T-BINTANG PIC ****9.99.
01 T-SPASI PIC 999B999.
01 T-GARIS PIC 99/99/99.
01 T-NOL PIC ZZZ9.00.
01 T-BULAN PIC 09.
01 T-PERSEN PIC ZZ9.
01 NILAI-STS PIC S9(4) SIGN TRAILING SEPARATE VALUE -42.
PROCEDURE DIVISION.
MOVE 12.5 TO T-BINTANG
MOVE ANGKA-BESAR TO T-SPASI
MOVE TANGGAL-ANGKA TO T-GARIS
MOVE ANGKA-KECIL TO T-NOL
MOVE BULAN TO T-BULAN
MOVE 87 TO T-PERSEN
DISPLAY "Cek proteksi * : [" T-BINTANG "]"
DISPLAY "Penyisip B : [" T-SPASI "]"
DISPLAY "Penyisip / : [" T-GARIS "]"
DISPLAY "Penyisip .00 : [" T-NOL "]"
DISPLAY "Penyisip 0 : [" T-BULAN "]"
DISPLAY "Persen : [" T-PERSEN "%]"
DISPLAY "Tanda pisah : [" NILAI-STS "]"
STOP RUN.Cek proteksi * : [***12.50]
Penyisip B : [123 456]
Penyisip / : [26/03/15]
Penyisip .00 : [ 7.00]
Penyisip 0 : [03]
Persen : [ 87%]
Tanda pisah : [0042-]Setiap baris mengonfirmasi satu simbol. Nilai 12.5 pada PIC ****9.99 tampil ***12.50 karena tiga posisi kiri yang kosong diisi bintang, bukan spasi. Penyisip B membentuk 123 456, penyisip garis miring membentuk tampilan tanggal 26/03/15, dan simbol 0 pada PIC 09 melengkapi bulan 3 menjadi 03. Baris terakhir memperlihatkan klausa sign trailing separate pada field data, yaitu tanda yang disimpan sebagai karakter terpisah di ujung sehingga -42 tampil 0042- dan fieldnya menempati lima byte, bukan empat.
Reproduksi keluaran di atas dengan perintah berikut, lalu jalankan ./format-lain.
# kompilasi program menjadi eksekutabel
cobc -x format-lain.cblKesalahan umum#
- Melakukan aritmetika langsung pada field hasil edit. Pernyataan seperti
ADD 1 TO TOTAL-EDITditolak compiler dengan pesanerror: 'TOTAL-EDIT' is not a numeric name. Simpan nilai pada field numeric, lalu pindahkan ke field hasil edit hanya saat menampilkan. - Lupa bahwa akhiran CR dan DB menambah dua posisi. Field
PIC ZZZ,ZZ9.99CRmenempati 12 posisi meskipun bagian angkanya hanya 10, sehingga perhitungan lebar baris laporan meleset bila akhirannya tidak dihitung. - Menghitung lebar field edit tanpa memperhitungkan tanda. Simbol plus dan minus masing-masing menambah satu posisi di depan, sehingga nilai maksimum harus muat pada sisa posisinya atau digit kiri terpotong tanpa peringatan.
Ringkasan#
- Field hasil edit hanya untuk tampilan dan tidak dapat menjadi operand aritmetika, sedangkan nilai tetap disimpan pada field
PIC 9atauPIC S9. - Simbol Z menekan nol depan menjadi spasi, koma dan titik menyisipkan pemisah, serta bintang memberi perlindungan cek dengan pengisi bintang.
- Simbol plus selalu menampilkan tanda, simbol minus hanya untuk nilai negatif, dan akhiran CR atau DB menandai nilai negatif dengan dua karakter.
- Simbol penyisip B, 0, dan garis miring membentuk tampilan spasi, nol tetap, dan tanggal sesuai posisinya di dalam picture.
Referensi#
- GnuCOBOL Manual — Free Software Foundation — Dokumen manual GnuCOBOL yang memuat daftar lengkap simbol picture edit dan aturannya.
- IBM Enterprise COBOL for z/OS documentation — IBM — Dokumentasi resmi yang memuat halaman PICTURE clause untuk simbol edit, CR, DB, dan SIGN SEPARATE.