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 :

[langage] Convertir 1 en A, 2 en B etc...


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 22
    Points : 18
    Points
    18
    Par défaut [langage] Convertir 1 en A, 2 en B etc...
    Bonjour,

    J'aimerais associé 1 à A, 2 à B..etc 27 à AA, 28 à AB ...etc
    J'ai codé cette fonction qui permet d'obtenir les lettres correspondant au nombre voulu, mais est-ce le moyen le plus efficace ? Existe t'il une fonction toute faite du même genre que 'chr' pour les caractères ASCII
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    sub convertLetter {
       shift;
       my $nb=shift;
       my $Firstletter = 'A';
       for(my $i=1; $i<$nb; $i++) {
          $Firstletter++;
       }
    return $Firstletter;
    }

  2. #2
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Bon voici une fonction que je viens de coder qui permet de transformer un nombre dans une base voulue :
    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
     
    sub nb_to_base {
        my $nb = $_[0];
        my $length_base = length($_[1]);
     
        my @base = split //, $_[1];
        my $e = 1;
        my $result = "";
        while ($nb / $e >= $length_base) {
            $e *= $length_base;
        }
        while (int($e))
        {
            $result .= $base[int($nb / $e)];
            $nb %= $e;
            $e /= $length_base;
        }
        return $result;
    }
     
    print nb_to_base("3", "ABC") . "\n";
    Je ne sais pas si cela peut te convenir.
    En faisant cela, tu peux te retrouver avec ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print nb_to_base("28", "AABCDEFGHIJKLMNOPQRSTUVXYZ") . "\n";

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Salut,

    Ta fonction est un poil compliqué pour ce que j'ai besoin..
    Je pensais plus à une fonction prédéfinie (ou presque) par perl qui SIMPLIFIERAIS la mienne...et surtout qui serait plus rapide.

    MErci quand même...

    J'ai tout de même testé ta fonction,
    est-ce normal que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print nb_to_base("26", "AABCDEFGHIJKLMNOPQRSTUVXYZ") . "\n";
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print nb_to_base("27", "AABCDEFGHIJKLMNOPQRSTUVXYZ") . "\n";
    donne la même chose ? : AA
    Le nombre 26 ne devrait-il pas donner Z ?

    Je crois que je vais garder ma fonction, merci d'avoir essayé de m'aider..
    A+

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Moi même j'ai fait un programme assez compliqué (en fait pas tellement mais bon...), mais y déconne, et en plus, ta fonction est très rapide même avec de très grand nombre (surprenant d'ailleurs, Perl est décidément bizarre parfois), de plus, franchement, de quoi te plains tu ? Je ne connais aucun autre langage qui possède une fonction d'"incrémentation magique" comme celle-là (je ne voyais d'ailleurs pas trop à quoi elle servait mais je vois enfin (en fait pas vraiment puisque je ne sais pas à quoi cette chaîne va te servir...)).
    Enfin voilà toujours mon programme qui ne marche pas, dis moi si tu vois pourquoi (si tu as le courage de chercher, ceil(27/26) - 1, ça fait bien 1 pourtant !!! )

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Moi même j'ai fait un programme assez compliqué (en fait pas tellement mais bon...), mais y déconne, et en plus, ta fonction est très rapide même avec de très grand nombre (surprenant d'ailleurs, Perl est décidément bizarre parfois), de plus, franchement, de quoi te plains tu ? Je ne connais aucun autre langage qui possède une fonction d'"incrémentation magique" comme celle-là (je ne voyais d'ailleurs pas trop à quoi elle servait mais je vois enfin (en fait pas vraiment puisque je ne sais pas à quoi cette chaîne va te servir...)).
    Enfin voilà toujours mon programme qui ne marche pas, dis moi si tu vois pourquoi (si tu as le courage de chercher, ceil(27/26) - 1, ça fait bien 1 pourtant !!! Oh finalement j'ai trouvé l'erreur, mais du diable si je sais comment la corriger ! )
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    use POSIX;
     
    my @letter = ('',('A'..'Z'));
     
    sub convert_num2letter {
        my $num = shift;
     
        my $num2 = $num % 677;
        $num = ceil($num/ 676);
     
        my $num3 = floor($num2) % 27;
        $num2 = ceil($num2/ 26);
        $num = ceil($num/ 26);
        return $letter[$num-1]. $letter[$num2-1]. $letter[ $num3 ];
    }
    print convert_num2letter(28)."\n";
     
    sub convert3 {
        my $num = shift;
        my $num2 = $num % 27;
        $num = ceil($num/ 26);
        return $letter[$num - 1]. $letter[$num2];
    }
    print convert3(26)."\n";
     
    sub convertLetter {
       my $nb=shift;
                    my $Firstletter = 'A';
                    for(my $i=1; $i<$nb; $i++) {
                            $Firstletter++;
                   }
                   return $Firstletter;
    } 
     
    print convertLetter(1000000);

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Cette chaîne peut servir à afficher des coordonnées de "type Excel" : A12=colonne A ligne 12, AA45=colonne AA, ligne 45 etc...

    Mais je suis sûre qu'avec un peu d'imagination on peut lui trouver pleins d'autres types d'utilisation

    A+

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 53
    Points : 64
    Points
    64
    Par défaut
    moi je te propose une fonction toute bete (mais je n'ai peut etre pas bien compris ta question ...)
    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
     
    #!/usr/bin/perl
    use strict;
    my $nbr=$ARGV[0];
    if ($nbr>26 || $nbr<1)
    {
    	print "Il faut donner un nombre entre 1 et 26 ...\n";
    }
    else
    {
    	print "$nbr : " . conv_lettre($nbr) . "\n";
    }
     
     
    sub conv_lettre
    {
    	return (chr($_[0]+64));
    }

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Dommage Arthur, si c'était si simple.... Non, ton code convient pour faire de 1->A à 26->Z mais pas au-delà, or c'est la principale difficulté....
    27 doit renvoyer AA, 52 AZ, etc....
    On doit pouvoir y arriver avec un système de division et modulo, mais je me suis un peu emmélé les pinceaux.

  9. #9
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Citation Envoyé par armada
    J'ai tout de même testé ta fonction,
    est-ce normal que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print nb_to_base("26", "AABCDEFGHIJKLMNOPQRSTUVXYZ") . "\n";
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print nb_to_base("27", "AABCDEFGHIJKLMNOPQRSTUVXYZ") . "\n";
    donne la même chose ? : AA
    Le nombre 26 ne devrait-il pas donner Z ?
    Il manque le W dans la base. C'est pour cela. Mais pour t''aider, il faudrait que je sache ce que tu veux exactement. Car avec deux chiffres, je ne vois pas bien le processus. Il faudrait 3 chiffres avec le changement des dizaines pour avoir une bonne idee.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    MErci de tes efforts Nyal (merci aux autres aussi)

    Le but (expliqué plus haut) était de manipuler facilement les coordonnées d'Excel, la première fonction..fonctionne ( ) et je ne pense pas qu'il soit nécessaire de perdre plus de temps avec ce problème étant donné que le temps de traitement n'est pas si long que ça..

    Merci encore
    A bientot

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 53
    Points : 64
    Points
    64
    Par défaut
    il existe un module sur cpan qui semble repondre a ton besoin (si ce coup la j'ai bien compris ) ==> http://search.cpan.org/src/SBURKE/Number-Latin-1.01/README

    sinon tu peux recup le code suivant qui est tire du module (cite ci-dessus) ca t'evite juste de l'installer mais c'est pareil
    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
     
    #!/usr/bin/perl
    use strict;
    my @alpha = ('a' .. 'z'); 
     
    my $nbr=$ARGV[0];
     
    my $retour=int2latin($nbr);
    print "$nbr : $retour\n";
     
     
     
    sub int2latin ($) {
      return undef unless defined $_[0];
      return '0' if $_[0] == 0;
      return '-' . uc(_i2l( abs int $_[0] )) if $_[0] <= -1;
      return       uc(_i2l(     int $_[0] ));
    }
     
    sub _i2l { # the real work
        my $int = shift(@_) || return "";
        _i2l(int (($int - 1) / 26)) . $alpha[$int % 26 - 1];
      }

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/09/2007, 14h35
  2. convertir 10 en k, 11 en l etc..
    Par Art19 dans le forum Delphi
    Réponses: 7
    Dernier message: 27/04/2007, 19h18
  3. Convertir 1 en A, 2 en B, etc
    Par Jahz dans le forum Langage
    Réponses: 4
    Dernier message: 06/06/2006, 15h53
  4. [langage] convertir 0x0c en saut de page ?
    Par narmataru dans le forum Langage
    Réponses: 5
    Dernier message: 26/01/2005, 17h41
  5. [langage] convertir les "." en ","
    Par caro_du_94 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2004, 16h58

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