%EDITW
Éditer un nombre avec un mot d'édition
Présente un nombre sous forme de texte selon un mot d'édition écrit sur mesure : chaque blanc reçoit un chiffre, les autres caractères sont recopiés.
Syntaxe
%EDITW(nombre : mot d'édition)
nombre- Une zone ou une expression numérique entière ou décimale.
mot d'édition- Une constante caractère qui décrit la forme du résultat : chaque blanc représente un chiffre, tout autre caractère (point, virgule, barre oblique, lettre…) est recopié. Un
0sert de repère d'affichage des zéros. Un suffixe comme-ouCRn'apparaît que si le nombre est négatif. - Résultat
- Une chaîne de la longueur du mot d'édition. Si le mot compte moins de positions que de chiffres, la compilation échoue (RNF8004).
À quoi ça sert
Quand aucun code d'édition ne convient (un numéro écrit avec des points, une heure « 08h05m30s », un montant suivi de CR), on écrit soi-même la forme voulue. Le mot d'édition se lit comme un gabarit : on place des blancs là où vont les chiffres, et les autres caractères restent tels quels.
Exemple 1 : Montants avec suffixe
**free
// %EDITW : un mot d'edition sur mesure - un blanc = un chiffre, le reste est recopie tel quel.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s solde packed(7:2) inz(1234.50);
dcl-s dette packed(7:2) inz(-1234.50);
dcl-s nul packed(7:2) inz(0);
snd-msg 'Solde : [' + %editw(solde : ' . , ') + ']';
snd-msg 'Dette, suffixe - : [' + %editw(dette : ' . , -') + ']';
snd-msg 'Solde, suffixe - : [' + %editw(solde : ' . , -') + ']';
snd-msg 'Dette, suffixe CR : [' + %editw(dette : ' . , CR') + ']';
snd-msg 'Zero : [' + %editw(nul : ' . , ') + ']';
snd-msg 'Zero avec repere 0 : [' + %editw(nul : ' . 0, ') + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Solde : [ 1.234,50]
Dette, suffixe - : [ 1.234,50-]
Solde, suffixe - : [ 1.234,50 ]
Dette, suffixe CR : [ 1.234,50CR]
Zero : [ ]
Zero avec repere 0 : [ ,00]
Le mot ' . , ' réserve sept positions : le point et la virgule sont recopiés. Le suffixe - ou CR n'apparaît que pour la dette (négatif) ; pour le solde positif, il est remplacé par des blancs.
Un montant à zéro donne des blancs partout. Avec un 0 juste avant la virgule, la partie droite reste affichée : ,00.
Exemple 2 : Heure, date et zéros de tête
**free
// %EDITW : le zero de tete disparait ; un 0 en tete du mot le conserve.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s matin packed(6:0) inz(80530);
dcl-s soir packed(6:0) inz(143005);
dcl-s jour packed(8:0) inz(5092026);
snd-msg 'Heure 08:05:30, mot sans 0 : [' + %editw(matin : ' h m s') + ']';
snd-msg 'Heure 14:30:05, mot sans 0 : [' + %editw(soir : ' h m s') + ']';
snd-msg 'Heure 08:05:30, mot avec 0 : [' + %editw(matin : '0 h m s') + ']';
snd-msg 'Date 05/09/2026, mot sans 0 : [' + %editw(jour : ' / / ') + ']';
snd-msg 'Date 05/09/2026, mot avec 0 : [' + %editw(jour : '0 / / ') + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Heure 08:05:30, mot sans 0 : [ 8h05m30s]
Heure 14:30:05, mot sans 0 : [14h30m05s]
Heure 08:05:30, mot avec 0 : [ 08h05m30s]
Date 05/09/2026, mot sans 0 : [ 5/09/2026]
Date 05/09/2026, mot avec 0 : [ 05/09/2026]
C'est le piège : l'heure 08:05:30, stockée sous forme d'un nombre, s'affiche 8h05m30s avec le mot ' h m s', et la date 05/09/2026 devient 5/09/2026. En commençant le mot par un 0, le zéro de tête est conservé ( 08h05m30s), au prix d'un blanc supplémentaire devant.
Une heure à deux chiffres (14h30m05s) passe sans problème dans le premier mot.
Le piège
Un nombre n'a pas de zéro de tête. L'heure 08:05:30 mise dans un packed(6:0) vaut 80530 ; l'édition écrit alors 8h05m30s et le jour 05 devient 5. Un 0 placé au début du mot d'édition garde le zéro de tête, mais il faut supprimer le blanc qui en résulte si on veut un format strict. Pour les dates et heures, un vrai type date ou time avec %CHAR(…: *EUR) est plus sûr.
Autre limite : chaque chiffre doit avoir sa place, sinon le compilateur refuse le mot avec RNF8004 (« le mot d'édition comporte 6 caractères remplaçables mais 7 … »).