IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Cobol Discussion :

Eliminer des zéros non significatifs


Sujet :

Cobol

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 11
    Points : 12
    Points
    12
    Par défaut Eliminer des zéros non significatifs
    Bonjour,

    mon pb est le suivant:
    je récupère un montant en base, et j'aimerais éliminer les zéros non significatifs et faire un justify left des nombres significatifs.

    Quelqu'un pourrait-il m'aider.

    ex :

    je récupère 000000012 et j'aimerais obtenir 12.


    Merci d'avance

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut zone occurseé
    je récupère un montant en base, et j'aimerais éliminer les zéros non significatifs et faire un justify left des nombres significatifs.
    Hmm... Redéfinir le montant par une zone occursée et tester caractère par caractère dans cette zone redéfinie. Les caractères différents de zéro sont placés dans une autre zone alphanumérique également occursée

    Il y a sans doute mieux mais je ne vois pas quoi pour le moment.

  3. #3
    Membre éclairé Avatar de Peut-êtreUneRéponse
    Homme Profil pro
    IT Specialist - IBM Z
    Inscrit en
    Décembre 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : IT Specialist - IBM Z
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 548
    Points : 801
    Points
    801
    Par défaut
    Tu peux aussi définir une zone groupe occursée de la longueur maximale de ta zone (dans mon exemple 10) que nous appellerons ZONE-DECHARGE.

    Puis une zone finale dans laquelle tu mettras les chiffres significatifs que tu définira en PICTURE de X afin que le contenu soit cadré à gauche: ZONE-DECHARGE-LEFT.

    Ainsi que 2 variables, I pour te déplacer dans la zone occursée et qui te permettra de déterminer la position du premier chiffre significatif et LONG qui permettra de calculer la longueur de la zone significative.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    01 ZONE-DECHARGE.
       05 ZONE-DECHARGE-OCCURS  OCCURS 10 TIMES.
           10 CHAR        PIC X.
    
    01 ZONE-DECHARGE-LEFT PIC X(10).
    01 LONG               PIC 9(02).
    01 I                  PIC 9(02).
    Dans la procédure division tu alimentes ta zone groupe,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PROCEDURE DIVISION.
         MOVE ta-zone TO ZONE-DECHARGE.
    Puis tu inspectes caractère par caractère le contenu de ta zone groupe en incrémentant ton indice de 1 à chaque caractère. Tu sorts du test lorsque ton indice dépasse la longueur maximale de la zone ou lorsque tu détectes le premier octet différent de zéro:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        PERFORM VARYING I FROM 1 BY 1
                UNTIL I > 9 OR
                CHAR (I) NOT = 0
           ADD 1 TO I
        END-PERFORM.
    Quand tu sorts du test tu as en zone mémoire I la position du 1er chiffre significatif qui t'intéresse. Tu calcules la longueur de la zone significative:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        SUBTRATC I FROM 10 GIVING LONG.
    Tu peux maintenant faire un MOVE relatif des chiffres significatifs dans ta zone finale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        MOVE ZONE-DECHARGE(I:LONG) TO ZONE-DECHARGE-LEFT
    Bien-sûr c'est à adapter en fontion de ton pb.

    .

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Picture d'édition
    si c'est pour de l'édition tu peux utliser ceci :

    PIC 9(3) donne en PIC ZZZ
    002 2
    012 12

    En rajoutant un justify left sur pic zzz peut que on arrivera à cadrer à gauche

  5. #5
    Membre éclairé Avatar de Peut-êtreUneRéponse
    Homme Profil pro
    IT Specialist - IBM Z
    Inscrit en
    Décembre 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : IT Specialist - IBM Z
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 548
    Points : 801
    Points
    801
    Par défaut
    Sous MVS, en COBOL il n'existe que la clause:

    Elle permet de justier à droite les données dans une zone mais uniquement déclarée avec une PICTURE alphanumérique. Cela ne fonctionne pas sur les PICTURE d'édition

    Note pour moi même, à rajouter dans mon cours "description des données"

    .

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Peut-êtreUneRéponse,

    Je m'en doutais bien un peu mais n'en étais pas sûr. Mais, qui sait ? Avec les évolutions du langage, un JUSTIFY-LEFT aurait pu être supporté depuis que je ne programme plus en Cobol. Cependant, après vérification dans la doc de Big Blue -- mais non testé par mes soins -- la clause JUSTIFY-LEFT serait a priori supportée et il paraîtrait qu'elle n'agirait que si précisée sur une définition de groupe de zones.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        05  MONGROUPE LEFT-JUSTIFY.
             10  MAZONENUM           PIC   9(11).
    D'après ce que j'ai compris, le contenu de "MAZONENUM" serait alors cadré à gauche suite à une instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MOVE "12345" TO MONGROUPE.
    Et je trouverais normal que cette valeur soit cadrée à gauche puisque zone de groupe. Toutefois, je me doute de ce qui se passerait si j'utilisais directement MAZONENUM dans le programme suite à une telle instruction ?

  7. #7
    Membre éclairé Avatar de Peut-êtreUneRéponse
    Homme Profil pro
    IT Specialist - IBM Z
    Inscrit en
    Décembre 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : IT Specialist - IBM Z
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 548
    Points : 801
    Points
    801
    Par défaut
    Mercure, ça m'intéresse. Où as-tu trouver ça? Quelles sont tes références car sur mon bon vieux Language Reference COBOL for os/390 & VM, COBOL set for AIX et VisualAge COBOL il n'en est pas mention.

    De plus sous Z/OS 170 ma compil plante.

    Peut-être pour un autre environnement? Windows par exemple?

    .

  8. #8
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Sur un autre fil j'avais proposé une solution à un problème voisin mais elle est fausse !
    STRING avec valeurs numériques
    En fait elle ne marche qu'avec un seul chiffre ...

  9. #9
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    une picture d'édition ne peut être qu'en reception. Cependant on
    pourra la manipuler grace à l'astuce suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    01  emis    pic 9(5) value 12.  [ donc emis contient 00012]
    
    01  receptX.
        05  recept pic Z(4)9.
        
    move emis to recept    [ donc recept contient bbb12 ]
    
    move receptx to .......

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Peut-êtreUneRéponse,

    J'ai trouvé cette info dans la doc "WebSphere Development Studio: ILE COBOL Reference" qui concerne le langage Cobol sur AS400. Suite à ta question, j'ai approfondi le sujet et me suis rendu compte que cette justification ne pouvait fonctionner en fait que sur les instructions ACCEPT et DISPLAY, et encore en COBOL/2, sur ce matériel et non pas comme je l'ai exposé dans mon post précédent.

    Cette doc nous indique d'ailleurs des infos contradictoires :
    The ILE COBOL compiler accepts and applies the following to the appropriate fields if they are specified with a group item. The COBOL/2 compiler generates a severe error message.
    – REQUIRED
    – SECURE
    LEFT-JUSTIFY
    – RIGHT-JUSTIFY
    – SPACE-FILL
    – TRAILING-SIGN
    – UPDATE
    – ZERO-FILL
    The COBOL/2 compiler justifies the signed numeric data (displayed and
    accepted) to the left
    , and the ILE COBOL compiler justifies these data items to the right.
    Donc, pour répondre correctement à Maubeuge59, essayer de jouer avec "JUSTIFY" pour cadrer du numérique à gauche est peine perdue et à mes yeux, la seule façon de faire consiste à décortiquer la zone caractère par caractère selon ta méthode ou celle que j'ai proposée en premier lieu qui revient sensiblement au même.

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    HRS,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    move receptx to .......
    Ton exemple donne bbb12 dans receptx et non 12bbb comme le voudrait Maubeuge59.

  12. #12
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    je complète

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
           IDENTIFICATION DIVISION.
           PROGRAM-ID. TEST4.
           ENVIRONMENT DIVISION.
           WORKING-STORAGE SECTION.
           01  EMIS   PIC 9(5) VALUE 12.
           01  RECEPTX.
               05  RECEPT  PIC Z(4)9.
           01  MAN        PIC X(5).
           01  RESU        PIC X(5).
           PROCEDURE DIVISION.
           DEB.
               MOVE EMIS TO RECEPT
               UNSTRING RECEPTX DELIMITED BY ALL SPACE INTO MAN RESU
               DISPLAY "RESU" RESU
               GOBACK RETURNING 0.

  13. #13
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Maintenant, ça colle !

    En effet, il était indispensable de compléter l'exemple avec UNSTRING et les deux zones réceptrices.

  14. #14
    Membre éclairé Avatar de Peut-êtreUneRéponse
    Homme Profil pro
    IT Specialist - IBM Z
    Inscrit en
    Décembre 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : IT Specialist - IBM Z
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 548
    Points : 801
    Points
    801
    Par défaut
    Merci Mercure pour les infos plus haut

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 13
    Points : 16
    Points
    16
    Par défaut zéros non significatifs
    solution avec nombre ne comportant pas de zero significatif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     WORKING-STORAGE SECTION.
      01   ZONE   PIC  X(12) VALUE "000000000142".
      01   CTR    PIC  99    VALUE 0.
      01   RESU   PIC  X(12). 
     PROCEDURE       DIVISION.
     DEB.
    * cadrage num à gauche sans zeros non signif pour nbrs entiers sans 0  
          INSPECT ZONE TALLYING CTR FOR 
          ALL ZEROS.
    *       DISPLAY CTR. 
           ADD 1 TO CTR
           UNSTRING ZONE INTO RESU WITH POINTER CTR.
    *       DISPLAY RESU.
    salut

    valmi32 :

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 13
    Points : 16
    Points
    16
    Par défaut ALIGNEMENT
    Voici une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
      01   ZONE   PIC  X(12) VALUE SPACES.
      01   CTR    PIC  99    VALUE 0.
      01   RESU   PIC  X(12). 
      01   ZE     VALUE "123456789".
        03  E OCCURS 9  PIC X.
     PROCEDURE       DIVISION.
    * cadrage num à gauche sans zeros non signif pour nbrs entiers  
     DEB. 
    * avec ces 3 exemples--------------------------------*
    
           MOVE "000002459000" TO ZONE PERFORM  CAD-G.
           MOVE "001000200011" TO ZONE PERFORM  CAD-G.
           MOVE "000000000012" TO ZONE.      
     CAD-G.       
           UNSTRING ZONE delimited by E(1) or E(2) or E(3) or E(4) or E(5) 
           or E(6) or E(7) or E(8) or E(9)
           INTO RESU COUNT CTR.
    *       DISPLAY RESU.
    *       DISPLAY CTR. 
           ADD 1 TO CTR
           MOVE SPACES TO RESU
           UNSTRING ZONE INTO RESU WITH POINTER CTR.
           DISPLAY RESU.
    salut
    valmi32 :

  17. #17
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Un moyen qui tient compte des zéros significatifs, testé avec Enterprise Cobol z/OS, en utilisant les reference modifiers (Move DATA(1:lg) to ... )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
           DATA DIVISION.                                                   
          *--------------                                                   
           WORKING-STORAGE SECTION.                                         
          *========================                                         
           01.                                                              
              05  WS-I1                     PIC S9(4) BINARY.               
              05  WS-DATA1                  PIC X(18).                      
              05  WS-DATA2                  PIC X(18).                      
          *-------------------                                              
           PROCEDURE DIVISION.                                              
          *-------------------                                              
               ACCEPT WS-DATA1       FROM SYSIN                            
               MOVE   SPACE          TO   WS-DATA2                         
               MOVE   ZERO           TO   WS-I1                            
               INSPECT WS-DATA1 TALLYING WS-I1 FOR LEADING '0'              
               IF WS-I1 > 0 AND < LENGTH OF WS-DATA1                        
                  MOVE WS-DATA1( WS-I1 + 1 : LENGTH OF WS-DATA1 - WS-I1 )   
                                      TO   WS-DATA2                         
               END-IF                                                       
               DISPLAY '*------------------*'                                
               DISPLAY '*' WS-DATA1 '*'                                     
               DISPLAY '*' WS-DATA2 '*'                                     
               DISPLAY '*------------------*'                                
               GOBACK.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Enlever les zéros non significatifs
    Par Keke des Iles dans le forum Delphi
    Réponses: 9
    Dernier message: 17/03/2017, 00h02
  2. Afficher des zéros non significatifs.
    Par pieral85 dans le forum Général Python
    Réponses: 15
    Dernier message: 01/03/2011, 00h45
  3. Réponses: 1
    Dernier message: 03/01/2009, 19h30
  4. garder les zéros non significatif
    Par Michelk12 dans le forum Informix
    Réponses: 3
    Dernier message: 15/12/2007, 14h54
  5. Réponses: 3
    Dernier message: 12/09/2006, 12h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo