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

Langage Perl Discussion :

sprintf "%011d" erreur resultat négatif


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Bonjour,

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

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 42
    Points
    42
    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
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 42
    Points
    42
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $toto = sprintf  "%011s", $toto;
    $NumCompte_Destinataire = (length($toto)>11) ? 0 : $toto;
    print ">$NumCompte_Destinataire<\n";

  6. #6
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    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
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    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
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 42
    Points
    42
    Par défaut
    tu peux faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    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
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    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).

  11. #11
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    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 éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    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
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 42
    Points
    42
    Par défaut
    Pour que ça fonctionne il faut que tu fasse ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    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
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    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";

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