Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 15 sur 15
  1. #1
    Nouveau Membre du Club
    Inscrit en
    mars 2006
    Messages
    552
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 552
    Points : 33
    Points
    33

    Par défaut sprintf "%011d" erreur resultat négatif

    Bonjour,

    J'ai une chaine de caractéres toto qui peut etre de longeur variable.
    toto=54929379001
    toto=456123
    toto=004566

    Je souhaiterai que ma chaine toto soit au maximum sur 11 caractéres. Si ce n'est pas le cas, alors le caractére "0" s'affiche sur la gauche.

    Code :
    1
    2
    3
     
    $toto = sprintf  "%011d", $toto;
    print ">$NumCompte_Destinataire<\n";
    cette formule fonctionne la ligne 2 et 3, mais dans le cas où ma valeur toto=54929379001, car le resultat est alors le suivant >-0000000001<.

    Par contre si je remplace le 5 par un 0. Alors ça fonctionne de nouveau
    toto=04929379001

    Merci pour votre aide

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    16 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 16 545
    Points : 465 273
    Points
    465 273

    Par défaut

    Bonjour,

    Exprime toi mieux car je ne comprends rien à ta demande et exemples.

    Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !

  3. #3
    Nouveau Membre du Club
    Inscrit en
    mars 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 43
    Points : 25
    Points
    25

    Par défaut

    bonjour,

    C'est normal que tu obtienne >-0000000001< quand ta valeur vaut 54929379001 parce que tu formate ton résultat dans un entier et un entier est limiter par rapport au système
    Integer -2147483648..2147483647 32 bits signé
    Cardinal 0..4294967295 32 bits non signé

  4. #4
    Nouveau Membre du Club
    Inscrit en
    mars 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 43
    Points : 25
    Points
    25

    Par défaut

    si ce que tu veux faire est d'avoir 0 comme valeur quand ta chaine de caractères est supérieur à 11 sinon tu garde la valeur de ta chaine tu peux faire comme ça :
    Code :
    1
    2
    3
    $toto = sprintf  "%011d", $toto;
    $NumCompte_Destinataire = (length($toto)>11) ? 0 : $toto;
    print ">$NumCompte_Destinataire<\n";

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    16 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 16 545
    Points : 465 273
    Points
    465 273

    Par défaut

    Code :
    1
    2
    3
    $toto = sprintf  "%011s", $toto;
    $NumCompte_Destinataire = (length($toto)>11) ? 0 : $toto;
    print ">$NumCompte_Destinataire<\n";

    Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !

  6. #6
    Nouveau Membre du Club
    Inscrit en
    mars 2006
    Messages
    552
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 552
    Points : 33
    Points
    33

    Par défaut

    j'ai bien compris, sauf que ma chaine n'est pas supérieur à 11, mais égal à 11.

    dois je comprendre que "0" n'est pas une valeur.

  7. #7
    Nouveau Membre du Club
    Inscrit en
    mars 2006
    Messages
    552
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 552
    Points : 33
    Points
    33

    Par défaut

    parfois ma variable fait tout juste 11 caractéres avec un entier 1 2 3 ou 4....
    et c'est là que ça plante.

    En fait je dois formater cette variable pour qu'elle fasse 11 caractéres.
    Si elle l'ai fait à l'origine, je ne touche à rien, sinon je rajoute des "0".

  8. #8
    Nouveau Membre du Club
    Inscrit en
    mars 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 43
    Points : 25
    Points
    25

    Par défaut

    tu peux faire comme ça :
    Code :
    1
    2
    3
    my $nbZero = 11-length($toto);
    my $NumCompte_Destinataire = sprintf "%0${nbZero}s",$toto;
    print ">$NumCompte_Destinataire<\n";
    par contre ce code ne gère pas le cas ou tu aurais plus de 11 caractères

  9. #9
    Nouveau Membre du Club
    Inscrit en
    mars 2006
    Messages
    552
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 552
    Points : 33
    Points
    33

    Par défaut

    quel est la difference entre ${nbZero}s et ${nbZero}d ?

    la difference entre s et d ?

    Merci

    Avant il suffit de faire un test sur ma longeur de chaine ? si c'est supérieur à 11, alors on ressort en erreur ?

  10. #10
    Membre Expert

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2012
    Messages : 1 183
    Points : 2 499
    Points
    2 499

    Par défaut

    %s (string): traite la valeur comme une chaîne de caractères
    %d (decimal): traite la valeur comme un entier décimal signé

    Dans ton cas, l'un ou l'autre devrait marcher (sauf si le nombre peut-être négatif).
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  11. #11
    Nouveau Membre du Club
    Inscrit en
    mars 2006
    Messages
    552
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 552
    Points : 33
    Points
    33

    Par défaut

    J'ai ce test ci dessous et là, ça ne fonctionne pas :

    Le nombre de caractére est 9. ors je voudrais arriver à 11 en mettant les 0 devant.

    my $toto="123456789";
    my $nbZero = 11-length($toto);
    $toto= sprintf "%0${nbZero}s",$toto;
    print ">$toto<\n";


  12. #12
    Membre chevronné Avatar de Gardyen
    Profil pro
    Inscrit en
    août 2005
    Messages
    578
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 578
    Points : 758
    Points
    758

    Par défaut

    ce code là te donnera une chaine de 11 chiffres, avec des 0 devant (autant qu'il faut pour avoir 11 caractères) s'il y a moins de 11 chiffres, pas besoin de calculer

    cf doc perl
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  13. #13
    Nouveau Membre du Club
    Inscrit en
    mars 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 43
    Points : 25
    Points
    25

    Par défaut

    Pour que ça fonctionne il faut que tu fasse ça :

    Code :
    $toto= sprintf "%0${nbZero}s%s",0,$toto;
    (désoler j'ai modifier mon message au dernier moment en pensant que ça allait fonctionner)

  14. #14
    Nouveau Membre du Club
    Inscrit en
    mars 2006
    Messages
    552
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 552
    Points : 33
    Points
    33

    Par défaut

    alors là, ca va beaucoup mieux !!
    sauf que si à la base j'ai 11 caractéres, en fait je me retrouve avec un 0, donc 12 caractéres, au lieu des 11 maximum


    my $toto="12345678901";
    my $nbZero = 11-length($toto);
    #$toto= sprintf "%0${nbZero}s",$toto;
    print "$nbZero\n";
    $toto= sprintf "%0${nbZero}s%s",0,$toto;
    print ">$toto<\n"
    Donne => >012345678901<

    Deplus à quoi sert s%s",0 ?
    le premier s pour du string

    Merci pour votre aide.

  15. #15
    Nouveau Membre du Club
    Inscrit en
    mars 2006
    Messages
    552
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 552
    Points : 33
    Points
    33

    Par défaut

    Pour palier à mes différents problèmes, j'ai été obligé de faire ça :

    $toto="12345678901";

    $NbCar=length($toto);
    if ( ${NbCar} > 11 ) { print "erreur\n"; exit;}
    if ( ${NbCar} < 11 ) { $toto= sprintf "%011d",$toto;}
    if ( ${NbCar} == 11 ) { $toto=$toto;}

    print "$toto\n";

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •