Les mots d'édition, imprimer un nombre exactement comme on le veut
Un montant en euros, une date, un SIRET, un numéro de téléphone ou un chèque protégé par des astérisques : les règles du mot d'édition, caractère par caractère, et 38 exemples dont chaque résultat a été imprimé sur un IBM i 7.5, en RPG III, en RPG IV et avec %EDITW.
En une phrase
Un mot d'édition est un gabarit écrit entre apostrophes qui décrit, caractère par caractère, comment imprimer une zone numérique : chaque blanc reçoit un chiffre, et tous les autres caractères disent où supprimer les zéros, où mettre la virgule, le symbole monétaire ou le signe.
Où l'écrire
Quand aucun code d'édition (1 à 4, A à D, J à Q, X à Z) ne donne la présentation voulue, on la décrit soi-même. Le mot prend la place de la constante sur la ligne de la zone, ce qui interdit d'y mettre aussi un code d'édition.
| Où | Comment |
|---|---|
| RPG III (RPG/400) | Spécification O : nom de la zone en 32-37, colonne 38 (code d'édition) à blanc, position de fin en 40-43, mot d'édition entre apostrophes en 45-70, donc 24 caractères au plus. |
| RPG IV colonné | Spécification O : nom de la zone en 30-43, colonne 44 à blanc, position de fin en 47-51, mot d'édition en 53-80 (26 caractères au plus), ou le nom d'une constante nommée : 115 caractères au plus. |
| RPG full free | Pas de spécification O en format libre : la fonction %EDITW(zone : mot) rend le texte édité, à placer où l'on veut. |
| DDS (écran, état) | Le mot-clé EDTWRD('mot') sur une zone numérique d'un DSPF ou d'un PRTF. |
Dans les exemples de cette page, ␢ représente un blanc, comme dans le manuel IBM. Dans le source, on tape un vrai espace.
Les trois parties d'un mot d'édition
IBM découpe un mot d'édition en trois parties, de gauche à droite. Exemple : la zone vaut 1,23, ou -1,23.
␢,␢␢␢,␢␢0.␢␢corps&30&DAY&CRsigne
- Le corps va du début du mot jusqu'au dernier caractère qui peut recevoir un chiffre (un blanc, ou le 0 ou l'astérisque d'arrêt). Il doit compter au moins autant de positions de chiffres que la zone a de chiffres.
- Le signe se termine par
CRou par-. Tout ce qui suit le corps jusqu'au signe n'est imprimé que si le nombre est négatif : ici,&30&DAY&CRdonne « ␢30␢DAY␢CR » pour -1,23 et dix blancs pour 1,23. - L'extension suit le signe ; elle est imprimée dans tous les cas. Sans signe, elle suit directement le corps : c'est ainsi qu'on imprime « € » ou « % » derrière un nombre.
Les caractères qui ont un sens
| Caractère | Où | Effet |
|---|---|---|
␢ (blanc) | Corps | Reçoit un chiffre. C'est une « position de chiffre ». |
0 | Corps | Le premier 0 arrête la suppression des zéros : à sa droite, les zéros sont imprimés. Il compte aussi comme position de chiffre. Les 0 suivants sont des constantes. |
* | Corps | Comme le 0, mais les zéros supprimés à sa gauche sont remplacés par des astérisques (protection d'un chèque). Un seul arrêt par mot : le premier 0 ou le premier *. |
$ (ou CURSYM) | Corps | Collé devant le 0 d'arrêt : symbole flottant, imprimé juste avant le premier chiffre. En première position : symbole fixe. Ailleurs : une constante. |
. et , | Corps | Recopiés tels quels, mais effacés s'ils sont à gauche du premier chiffre imprimé. |
& | Partout | Imprime un blanc. C'est le seul moyen d'avoir un blanc dans le signe ou l'extension. |
CR ou - | Signe | Imprimés seulement si le nombre est négatif, avec tout ce qui les précède depuis le dernier chiffre. Le - doit être le dernier caractère du mot. |
autre caractère | Corps | Une constante : imprimée si un chiffre est imprimé à sa gauche, sinon effacée. |
autre caractère | Extension | Imprimé dans tous les cas. |
Compter les positions
- Seuls les blancs du corps et le 0 (ou *) d'arrêt comptent comme positions de chiffres ; le symbole monétaire flottant ne compte pas.
- S'il y a plus de positions que de chiffres, la zone est complétée par des zéros à gauche avant l'édition.
- Pour imprimer les zéros de tête, il faut une position de plus que la zone, avec le 0 en première position.
Les exemples, imprimés sur IBM i
Chaque mot a été appliqué à la valeur, à son opposé et à zéro, sur une zone décimale condensée de la longueur indiquée (« 9,2 » : 9 chiffres dont 2 décimales). Les trois programmes du banc, en RPG III, en RPG IV colonné et en full free avec %EDITW, ont imprimé exactement les mêmes résultats.
Le corps : blancs, point et virgule
| Mot d'édition | Zone | Valeur | Positif | Négatif | Zéro |
|---|---|---|---|---|---|
'␢␢␢␢␢␢␢' |
7,0 | 72 | ␢␢␢␢␢72 |
␢␢␢␢␢72 |
␢␢␢␢␢␢␢ |
'␢␢␢␢␢␢␢.␢␢' |
9,2 | 0,12 | ␢␢␢␢␢␢␢␢12 |
␢␢␢␢␢␢␢␢12 |
␢␢␢␢␢␢␢␢␢␢ |
| Le point disparaît : aucun chiffre significatif à sa gauche. | |||||
'␢␢␢␢␢␢␢.␢␢' |
9,2 | 1,23 | ␢␢␢␢␢␢1.23 |
␢␢␢␢␢␢1.23 |
␢␢␢␢␢␢␢␢␢␢ |
'␢,␢␢␢,␢␢␢.␢␢' |
9,2 | 1234567,89 | 1,234,567.89 |
1,234,567.89 |
␢␢␢␢␢␢␢␢␢␢␢␢ |
'␢,␢␢␢,␢␢␢.␢␢' |
9,2 | 4,56 | ␢␢␢␢␢␢␢␢4.56 |
␢␢␢␢␢␢␢␢4.56 |
␢␢␢␢␢␢␢␢␢␢␢␢ |
| Les virgules à gauche du premier chiffre deviennent des blancs. | |||||
Arrêter la suppression des zéros : le 0
| Mot d'édition | Zone | Valeur | Positif | Négatif | Zéro |
|---|---|---|---|---|---|
'␢␢␢␢␢␢0.␢␢' |
9,2 | 0,01 | ␢␢␢␢␢␢␢.01 |
␢␢␢␢␢␢␢.01 |
␢␢␢␢␢␢␢.00 |
'␢␢␢,␢␢0␢.␢␢' |
8,2 | 0,12 | ␢␢␢␢␢␢␢0.12 |
␢␢␢␢␢␢␢0.12 |
␢␢␢␢␢␢␢0.00 |
'␢␢␢,␢␢0␢.␢␢' |
8,2 | 1,23 | ␢␢␢␢␢␢␢1.23 |
␢␢␢␢␢␢␢1.23 |
␢␢␢␢␢␢␢0.00 |
'␢0␢,␢␢␢.␢␢' |
8,2 | 1,23 | ␢␢0,001.23 |
␢␢0,001.23 |
␢␢0,000.00 |
| Le 0 avance l'arrêt : la virgule est imprimée. | |||||
'0␢␢␢' |
4,0 | 156 | ␢156 |
␢156 |
␢000 |
'0␢␢␢␢' |
4,0 | 156 | ␢0156 |
␢0156 |
␢0000 |
| Une position de plus que la zone : le zéro de tête apparaît. | |||||
'␢␢0.␢␢000' |
5,2 | 12,34 | ␢12.34000 |
␢12.34000 |
␢␢␢.00000 |
| Les 0 qui suivent le premier sont des constantes. | |||||
Protéger un montant : l'astérisque
| Mot d'édition | Zone | Valeur | Positif | Négatif | Zéro |
|---|---|---|---|---|---|
'*␢␢␢␢␢␢.␢␢' |
9,2 | 1,23 | *000001.23 |
*000001.23 |
*000000.00 |
'␢␢␢␢␢*␢.␢␢' |
9,2 | 1,23 | ******1.23 |
******1.23 |
******0.00 |
'␢␢␢␢␢*␢.␢␢**' |
9,2 | 563,42 | ****563.42** |
****563.42** |
******0.00** |
| Le second astérisque est une constante. | |||||
'␢␢*.␢␢000' |
5,2 | 12,34 | *12.34000 |
*12.34000 |
***.00000 |
Le symbole monétaire, fixe ou flottant
| Mot d'édition | Zone | Valeur | Positif | Négatif | Zéro |
|---|---|---|---|---|---|
'␢␢,␢␢␢,␢$0.␢␢' |
9,2 | 1234,56 | ␢␢␢␢$1,234.56 |
␢␢␢␢$1,234.56 |
␢␢␢␢␢␢␢␢␢$.00 |
| $ flottant : collé au premier chiffre. | |||||
'$␢,␢␢␢,␢␢0.␢␢' |
9,2 | 1234,56 | $␢␢␢␢1,234.56 |
$␢␢␢␢1,234.56 |
$␢␢␢␢␢␢␢␢␢.00 |
| $ fixe : toujours en première position. | |||||
'$␢,␢␢␢,*␢␢.␢␢' |
9,2 | 1234,56 | $****1,234.56 |
$****1,234.56 |
$*******00.00 |
'$␢␢␢␢␢␢**DOLLARS&␢␢&CTS' |
9,2 | 123,45 | $****123*DOLLARS␢45␢CTS |
$****123*DOLLARS␢45␢CTS |
$********DOLLARS␢00␢CTS |
| Le chèque américain du manuel IBM. | |||||
'$␢␢␢␢␢␢␢&DOLLARS&␢␢&CTS' |
9,2 | 0,06 | $␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢6␢CTS |
$␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢6␢CTS |
$␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢CTS |
Constantes et &
| Mot d'édition | Zone | Valeur | Positif | Négatif | Zéro |
|---|---|---|---|---|---|
'0AREA&␢␢␢&NO.&␢␢␢-␢␢␢␢' |
10,0 | 4165551212 | ␢AREA␢416␢NO.␢555-1212 |
␢AREA␢416␢NO.␢555-1212 |
␢AREA␢000␢NO.␢000-0000 |
| Le 0 en tête est nécessaire pour imprimer AREA. | |||||
'␢␢/␢␢/␢␢␢␢' |
8,0 | 5092026 | ␢5/09/2026 |
␢5/09/2026 |
␢␢␢␢␢␢␢␢␢␢ |
| Date JJMMAAAA : le zéro de tête disparaît. | |||||
'0␢␢/␢␢/␢␢␢␢' |
8,0 | 5092026 | ␢05/09/2026 |
␢05/09/2026 |
␢00/00/0000 |
| Un 0 en tête le garde. | |||||
'␢␢h␢␢m␢␢s' |
6,0 | 80530 | ␢8h05m30s |
␢8h05m30s |
␢␢␢␢␢␢␢␢s |
'0␢␢h␢␢m␢␢s' |
6,0 | 80530 | ␢08h05m30s |
␢08h05m30s |
␢00h00m00s |
Le signe : CR et -
| Mot d'édition | Zone | Valeur | Positif | Négatif | Zéro |
|---|---|---|---|---|---|
'␢␢␢␢␢␢␢.␢␢-' |
9,2 | 1,23 | ␢␢␢␢␢␢1.23␢ |
␢␢␢␢␢␢1.23- |
␢␢␢␢␢␢␢␢␢␢␢ |
'␢␢␢␢␢␢␢.␢␢CR' |
9,2 | 1,23 | ␢␢␢␢␢␢1.23␢␢ |
␢␢␢␢␢␢1.23CR |
␢␢␢␢␢␢␢␢␢␢␢␢ |
'␢,␢␢␢,␢␢0.␢␢&30&DAY&CR' |
9,2 | 1,23 | ␢␢␢␢␢␢␢␢1.23␢␢␢␢␢␢␢␢␢␢ |
␢␢␢␢␢␢␢␢1.23␢30␢DAY␢CR |
␢␢␢␢␢␢␢␢␢.00␢␢␢␢␢␢␢␢␢␢ |
| Tout ce qui précède CR n'est imprimé que si le nombre est négatif. | |||||
L'extension : ce qui suit le signe
| Mot d'édition | Zone | Valeur | Positif | Négatif | Zéro |
|---|---|---|---|---|---|
'␢,␢␢0.␢␢&CR&NET' |
6,2 | 1,23 | ␢␢␢␢1.23␢␢␢␢NET |
␢␢␢␢1.23␢CR␢NET |
␢␢␢␢␢.00␢␢␢␢NET |
| NET est imprimé dans tous les cas. | |||||
'␢␢0.␢␢&SECRET' |
5,2 | 123,45 | 123.45␢␢␢␢␢ET |
123.45␢SECRET |
␢␢␢.00␢␢␢␢␢ET |
| Le CR de SECRET est pris pour le signe. | |||||
'␢␢0.␢␢&CR&&SECRET' |
5,2 | 123,45 | 123.45␢␢␢␢␢SECRET |
123.45␢CR␢␢SECRET |
␢␢␢.00␢␢␢␢␢SECRET |
| Le remède : un CR avant. | |||||
À la française
| Mot d'édition | Zone | Valeur | Positif | Négatif | Zéro |
|---|---|---|---|---|---|
'␢␢␢&␢␢␢&␢␢0,␢␢' |
10,2 | 12345678,90 | ␢12␢345␢678,90 |
␢12␢345␢678,90 |
␢␢␢␢␢␢␢␢␢␢␢,00 |
| Espace comme séparateur de milliers. | |||||
'␢␢␢.␢␢␢.␢␢0,␢␢' |
10,2 | 12345678,90 | ␢12.345.678,90 |
␢12.345.678,90 |
␢␢␢␢␢␢␢␢␢␢␢,00 |
'␢␢␢.␢␢␢.␢␢0,␢␢-' |
10,2 | 1234,50 | ␢␢␢␢␢␢1.234,50␢ |
␢␢␢␢␢␢1.234,50- |
␢␢␢␢␢␢␢␢␢␢␢,00␢ |
'0␢␢&␢␢&␢␢&␢␢&␢␢' |
10,0 | 612345678 | ␢06␢12␢34␢56␢78 |
␢06␢12␢34␢56␢78 |
␢00␢00␢00␢00␢00 |
| Numéro de téléphone. | |||||
'␢␢␢&␢␢␢&␢␢␢&␢␢␢␢␢' |
14,0 | 73282932000074 | 732␢829␢320␢00074 |
732␢829␢320␢00074 |
␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢ |
| Numéro SIRET. | |||||
'␢␢0,␢␢&%' |
5,2 | 12,5 | ␢12,50␢% |
␢12,50␢% |
␢␢␢,00␢% |
L'euro, la virgule et DECEDIT
Le symbole monétaire est le $, sauf si le programme en choisit un autre : colonne 18
de la spécification H en RPG III, mot-clé CURSYM('€') en RPG IV et en full free. Le
€ devient alors flottant ou fixe, comme le $. Pour la virgule, en
revanche, rien à régler : un mot d'édition imprime le point et la virgule là où on les a écrits.
Le programme ci-dessous demande aussi la virgule décimale (colonne 21 de la spécification H à
J en RPG III, DECEDIT('0,') en RPG IV) : seul le code d'édition J en
tient compte.
| Mot ou code | Zone | Valeur | Positif | Négatif | Zéro |
|---|---|---|---|---|---|
'␢␢␢.␢␢␢.␢€0,␢␢' |
10,2 | 1234,5 | ␢␢␢␢␢€1.234,50 |
␢␢␢␢␢€1.234,50 |
␢␢␢␢␢␢␢␢␢␢€,00 |
'€␢␢.␢␢␢.␢␢0,␢␢' |
10,2 | 1234,5 | €␢␢␢␢␢1.234,50 |
€␢␢␢␢␢1.234,50 |
€␢␢␢␢␢␢␢␢␢␢,00 |
'␢␢␢.␢␢␢.␢␢0,␢␢' |
10,2 | 1234,5 | ␢␢␢␢␢␢1.234,50 |
␢␢␢␢␢␢1.234,50 |
␢␢␢␢␢␢␢␢␢␢␢,00 |
'␢␢␢␢␢␢␢␢.␢␢' |
10,2 | 1,23 | ␢␢␢␢␢␢␢1.23 |
␢␢␢␢␢␢␢1.23 |
␢␢␢␢␢␢␢␢␢␢␢ |
EDTCDE J |
10,2 | 1234,5 | 1.234,50 |
1.234,50- |
0,00 |
Le mot '␢␢␢␢␢␢␢␢.␢␢' garde son point avec DECEDIT('0,'), alors que le code J
imprime 1.234,50 et 0,00. Si l'on veut des montants à la française, on les écrit donc dans le mot :
'␢␢␢.␢␢␢.␢␢0,␢␢'. L'euro peut aussi être une simple constante dans l'extension,
sans CURSYM : '␢␢.␢␢␢.␢␢0,␢␢&€', comme dans le relevé ci-dessous.
Exemple complet RELEVE
Un relevé de compte, en RPG III, RPG IV et full free
Le même petit programme en trois versions : il calcule la TVA et le net à payer, puis imprime un relevé dont chaque nombre passe par un mot d'édition. Une date, un numéro de client avec ses zéros, un SIRET et un téléphone groupés par des blancs, des montants suivis de € (extension), un avoir suivi de CR (signe), un net à payer protégé par des astérisques. Les trois versions impriment le même état, au caractère près :

RELEVÉ DE COMPTE Date : 22/10/2026
Client : 004127 DUPONT QUINCAILLERIE
SIRET : 732 829 320 00074 Tél : 04 67 12 34 56
Facture 26-0412 Montant HT : 1.234,50 €
TVA 20,00 % : 246,90 €
Total TTC : 1.481,40 €
Avoir 26-0007 Montant : 150,00 CR
Net à payer : *****1.331,40 €
RPG III RELEVE3
H RELEVE
FQSYSPRT O F 80 PRINTER
I 73282932000074 C KSIRET
C Z-ADD22102026 DATREL 80
C Z-ADD4127 CLIENT 60
C Z-ADDKSIRET SIRET 140
C Z-ADD467123456 TEL 100
C Z-ADD1234.50 HT 92
C Z-ADD20 TAUX 42
C HT MULT TAUX W 134
C W DIV 100 TVA 92H
C HT ADD TVA TTC 92
C Z-SUB150 AVOIR 92
C TTC ADD AVOIR SOLDE 92
C EXCPTRELEVE
C SETON LR
OQSYSPRT E 1 RELEVE
O 16 'RELEVÉ DE COMPTE'
O 58 'Date :'
O DATREL 70 '0 / / '
OQSYSPRT E 1 RELEVE
O 10 'Client :'
O CLIENT 18 '0 '
O 40 'DUPONT QUINCAILLERIE'
OQSYSPRT E 1 RELEVE
O 10 'SIRET :'
O SIRET 28 ' & & & '
O 45 'Tél :'
O TEL 60 '0 & & & & '
OQSYSPRT E 1 RELEVE
O 15 'Facture 26-0412'
O 35 'Montant HT :'
O HT 52 ' . . 0, &€'
OQSYSPRT E 1 RELEVE
O 23 'TVA'
O TAUX 31 ' 0, &%'
O 35 ':'
O TVA 52 ' . . 0, &€'
OQSYSPRT E 1 RELEVE
O 35 'Total TTC :'
O TTC 52 ' . . 0, &€'
OQSYSPRT E 1 RELEVE
O 15 'Avoir 26-0007'
O 35 'Montant :'
O AVOIR 53 ' . . 0, &CR'
OQSYSPRT E 1 RELEVE
O 35 'Net à payer :'
O SOLDE 52 ' . .* , &€'
I 73282932000074 C KSIRET- Le SIRET a 14 chiffres, trop pour le facteur 2 d'un Z-ADD (10 colonnes) : il passe par une constante nommée, déclarée en spécification I.
OQSYSPRT E 1 RELEVE- Une ligne de l'état, imprimée par
EXCPT RELEVE, puis un saut d'une ligne (colonne 18). Les huit lignes portent le même nom : un seul EXCPT les imprime toutes. O HT 52 ' . . 0, &€'- La zone en 32-37, la position de fin 52 en 40-43, le mot d'édition à partir de la colonne 45. La colonne 38 reste vide : c'est là qu'irait un code d'édition.
O AVOIR 53 ' . . 0, &CR'- Un caractère de plus que les montants : avec la fin en 53, les chiffres restent alignés en colonne 50.


CRTRPGPGM PGM(JOBIEDT/RELEVE3) SRCFILE(JOBIEDT/QRPGSRC)
CALL PGM(JOBIEDT/RELEVE3)
RPG IV colonné RELEVE4
FQSYSPRT O F 80 PRINTER
DDATREL S 8P 0
DCLIENT S 6P 0
DSIRET S 14P 0
DTEL S 10P 0
DHT S 9P 2
DTAUX S 4P 2
DTVA S 9P 2
DTTC S 9P 2
DAVOIR S 9P 2
DSOLDE S 9P 2
C EVAL DATREL = 22102026
C EVAL CLIENT = 4127
C EVAL SIRET = 73282932000074
C EVAL TEL = 467123456
C EVAL HT = 1234.50
C EVAL TAUX = 20
C EVAL(H) TVA = HT * TAUX / 100
C EVAL TTC = HT + TVA
C EVAL AVOIR = -150
C EVAL SOLDE = TTC + AVOIR
C EXCEPT RELEVE
C EVAL *INLR = *ON
OQSYSPRT E RELEVE 1
O 16 'RELEVÉ DE COMPTE'
O 58 'Date :'
O DATREL 70 '0 / / '
OQSYSPRT E RELEVE 1
O 10 'Client :'
O CLIENT 18 '0 '
O 40 'DUPONT QUINCAILLERIE'
OQSYSPRT E RELEVE 1
O 10 'SIRET :'
O SIRET 28 ' & & & '
O 45 'Tél :'
O TEL 60 '0 & & & & '
OQSYSPRT E RELEVE 1
O 15 'Facture 26-0412'
O 35 'Montant HT :'
O HT 52 ' . . 0, &€'
OQSYSPRT E RELEVE 1
O 23 'TVA'
O TAUX 31 ' 0, &%'
O 35 ':'
O TVA 52 ' . . 0, &€'
OQSYSPRT E RELEVE 1
O 35 'Total TTC :'
O TTC 52 ' . . 0, &€'
OQSYSPRT E RELEVE 1
O 15 'Avoir 26-0007'
O 35 'Montant :'
O AVOIR 53 ' . . 0, &CR'
OQSYSPRT E RELEVE 1
O 35 'Net à payer :'
O SOLDE 52 ' . .* , &€'
DHT S 9P 2- Les zones sont déclarées en spécification D ; les calculs passent par EVAL, et
EVAL(H)arrondit la TVA. O HT 52 ' . . 0, &€'- La zone en 30-43, la fin en 47-51, le mot à partir de la colonne 53.

CRTBNDRPG PGM(JOBIEDT/RELEVE4) SRCFILE(JOBIEDT/QRPGLESRC)
Full free RELEVEF
**FREE
// Relevé de compte : les zones numériques sont éditées par %EDITW.
dcl-f QSYSPRT printer(80);
dcl-ds ligne len(80) end-ds;
dcl-s datrel packed(8:0); // Date du relevé (JJMMAAAA)
dcl-s client packed(6:0); // Numéro de client
dcl-s siret packed(14:0); // Numéro SIRET
dcl-s tel packed(10:0); // Téléphone
dcl-s ht packed(9:2); // Montant hors taxes
dcl-s taux packed(4:2); // Taux de TVA
dcl-s tva packed(9:2); // Montant de la TVA
dcl-s ttc packed(9:2); // Total TTC
dcl-s avoir packed(9:2); // Avoir (négatif)
dcl-s solde packed(9:2); // Net à payer
datrel = 22102026;
client = 4127;
siret = 73282932000074;
tel = 467123456;
ht = 1234.50;
taux = 20;
eval(h) tva = ht * taux / 100;
ttc = ht + tva;
avoir = -150;
solde = ttc + avoir;
ligne = *blanks;
%subst(ligne:1:16) = 'RELEVÉ DE COMPTE';
%subst(ligne:53:6) = 'Date :';
%subst(ligne:60:11) = %editw(datrel:'0 / / ');
write QSYSPRT ligne;
ligne = *blanks;
%subst(ligne:3:8) = 'Client :';
%subst(ligne:12:7) = %editw(client:'0 ');
%subst(ligne:21:20) = 'DUPONT QUINCAILLERIE';
write QSYSPRT ligne;
ligne = *blanks;
%subst(ligne:3:8) = 'SIRET :';
%subst(ligne:12:17) = %editw(siret:' & & & ');
%subst(ligne:41:5) = 'Tél :';
%subst(ligne:46:15) = %editw(tel:'0 & & & & ');
write QSYSPRT ligne;
ligne = *blanks;
%subst(ligne:1:15) = 'Facture 26-0412';
%subst(ligne:23:13) = 'Montant HT :';
%subst(ligne:38:15) = %editw(ht:' . . 0, &€');
write QSYSPRT ligne;
ligne = *blanks;
%subst(ligne:21:3) = 'TVA';
%subst(ligne:24:8) = %editw(taux:' 0, &%');
%subst(ligne:35:1) = ':';
%subst(ligne:38:15) = %editw(tva:' . . 0, &€');
write QSYSPRT ligne;
ligne = *blanks;
%subst(ligne:23:13) = 'Total TTC :';
%subst(ligne:38:15) = %editw(ttc:' . . 0, &€');
write QSYSPRT ligne;
ligne = *blanks;
%subst(ligne:1:15) = 'Avoir 26-0007';
%subst(ligne:23:13) = 'Montant :';
%subst(ligne:38:16) = %editw(avoir:' . . 0, &CR');
write QSYSPRT ligne;
ligne = *blanks;
%subst(ligne:23:13) = 'Net à payer :';
%subst(ligne:38:15) = %editw(solde:' . .* , &€');
write QSYSPRT ligne;
*inlr = *on;
dcl-f QSYSPRT printer(80);etdcl-ds ligne len(80) end-ds;- Un fichier imprimante décrit par le programme : en format libre, on écrit une structure de données de la longueur de la ligne.
%subst(ligne:38:15) = %editw(ht:' . . 0, &€');- %EDITW rend une chaîne de la longueur du mot ; on la place à la colonne voulue, ici de 38 à 52 comme la position de fin 52 de la spécification O.
CRTBNDRPG PGM(JOBIEDT/RELEVEF) SRCFILE(JOBIEDT/QRPGLESRC)
Les pièges, vérifiés sur le banc
- Le CR caché dans un mot.
'␢␢0.␢␢&SECRET'imprime « 123.45␢␢␢␢␢ET » pour un nombre positif : le compilateur a lu le CR de SECRET comme le signe. Le remède du manuel IBM, un vrai CR avant :'␢␢0.␢␢&CR&&SECRET'. - Le - au milieu n'est pas un signe. Dans
'0AREA&␢␢␢&NO.&␢␢␢-␢␢␢␢', le - n'est pas en dernière position : c'est une constante, imprimée même pour un nombre positif. - Zéro, c'est souvent tout blanc. Sans 0 ni * d'arrêt, une zone à zéro
s'imprime en blancs. L'heure
'␢␢h␢␢m␢␢s'à zéro donne même « ␢␢␢␢␢␢␢␢s » : h et m sont des constantes du corps, effacées, mais le s final est l'extension, toujours imprimée. - Le zéro de tête. La date 05/09/2026 rangée dans un nombre vaut 5092026 :
'␢␢/␢␢/␢␢␢␢'imprime « ␢5/09/2026 ». Il faut le 0 en tête et une position de plus :'0␢␢/␢␢/␢␢␢␢'. - Pas assez de positions. Un mot de 9 positions pour une zone de 10 chiffres est
refusé à la compilation :
RNF8004en RPG IV (« Le mot d'édition comporte 9 caractères remplaçables mais 10 sont requis »), QRG8004 en RPG III (« Pas assez de caractères de remplacement dans le mot d'édition »). - La colonne 21 du RPG III change aussi les littéraux. Avec
Jen colonne 21 de la spécification H, le compilateur RPG III attend la virgule dans les nombres du source : la constante1234.5est refusée (QRG4172, « Littéral incorrect »), il faut écrire1234,5. Le mot d'édition, lui, ne change pas.
Sources
Les exemples ont été compilés et exécutés sur un IBM i 7.5 (voir la méthode). Les règles viennent de ces sources, consultées le 22 octobre 2026 :
- ILE RPG Reference (SC09-2508-12), chapitre « Edit Words », IBM, IBM i 7.5 (PDF). Les trois parties d'un mot d'édition (corps, signe, extension), le rôle du blanc, du 0, de l'astérisque, du symbole monétaire fixe ou flottant, du & et de CR ou - ; le mot en colonnes 53 à 80 (26 caractères au plus), ou dans une constante nommée, 115 caractères au plus ; %EDITW.
- IBM i Programming : DDS for display files, IBM (PDF). Le mot-clé EDTWRD, le mot d'édition d'une zone d'écran.
- RPG Tutorial : Output Edit Words, Jay Moseley. La leçon dont cette page reprend la forme : les règles, puis un tableau d'exemples avec le résultat positif et négatif.
Questions fréquentes
Qu'est-ce qu'un mot d'édition en RPG ?
Un gabarit, écrit entre apostrophes, qui décrit comment imprimer une zone numérique : chaque blanc reçoit un chiffre, le premier 0 ou le premier astérisque arrête la suppression des zéros, & donne un blanc, CR ou - n'apparaît que pour un nombre négatif, et les autres caractères sont recopiés.
Où écrit-on le mot d'édition ?
Sur la spécification O, à la place d'une constante : colonnes 45 à 70 en RPG III, avec la colonne 38 (code d'édition) à blanc ; colonnes 53 à 80 en RPG IV, avec la colonne 44 à blanc. En format libre, on utilise la fonction %EDITW(zone : mot).
Quelle différence entre un code d'édition et un mot d'édition ?
Un code d'édition (1 à 4, A à D, J à Q, X à Z) est une présentation toute faite. Le mot d'édition décrit la présentation caractère par caractère : un numéro de téléphone, un SIRET, une heure, un montant suivi de € ou protégé par des astérisques.
Pourquoi le compilateur refuse-t-il mon mot d'édition ?
Le plus souvent, il compte moins de positions de chiffres (blancs, plus le premier 0 ou *) que la zone n'a de chiffres : RNF8004 en RPG IV, QRG8004 en RPG III. Ajoutez un blanc par chiffre manquant.
DECEDIT ou l'inversion J changent-ils un mot d'édition ?
Non. Le point et la virgule d'un mot d'édition sont imprimés tels qu'ils sont écrits. DECEDIT en RPG IV et la colonne 21 de la spécification H en RPG III ne changent que les codes d'édition.
Comment garder le zéro de tête d'une date ou d'une heure ?
En écrivant un 0 en première position et une position de plus que la zone : '0 / / ' imprime 05/09/2026 là où ' / / ' imprime 5/09/2026.