Convertions Nombre en lettre et vice et versa [Résolu]

Signaler
Messages postés
12
Date d'inscription
vendredi 10 octobre 2008
Statut
Membre
Dernière intervention
9 février 2010
-
Messages postés
12
Date d'inscription
vendredi 10 octobre 2008
Statut
Membre
Dernière intervention
9 février 2010
-
Hello, je suis développeur C# depuis peu de temps et la je bloque sur un problème tout bête mais je suis super pris par le temps donc je m'adresse a vous pour savoir si qqun a déjà developper un truc du genre

Le but est simple, c'est de pouvoir convertir un nombre en successions de lettre du type des colonnes d'excel.
Par exemple :

1=A
2=B
26 = Z
27 = AA
52 = AZ

Etc...

Lettre vers nombre c'est OK mais en partant du nombre j'ai un problème a chaque fois que le résultat doit contenir un "Z"

Merci de votre aide a+
A voir également:

10 réponses

Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
17
Bonjour,

Si je ne me trompes, il s'agit s'implement de convertir un nombre décimal en base 26.
Cependant, comme A=1 et que l'on a pas la correspondance du 0, il faut tout d'abord soustraire 1 de ton chiffre avant de faire la conversion en base 26.

Voici des liens pour les conversions:
- http://www.csharpfr.com/codes/CONVERTISSEUR-DECIMAL-BINAIRE-HEXADECIMAL_39983.aspx
- http://www.csharpfr.com/codes/CONVERTISSEUR-NOMBRES-HEXADECIMAUX_35003.aspx

Bon courage,


Billou_13
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
49
Beaucoup plus rapide:

public
static
string ChiffreLettre(
int chiffre)
{
  
StringBuilder sb =
new
StringBuilder();
  
try
   {
     
for (
int i = chiffre - 1; i > 0; i--)
     {
        
int remainder = 0;
        
int result =
Math.DivRem(i, 26,
out remainder);
         sb.Insert(0, (
char)(remainder + 65));
         i = result;
     }
    
return sb.ToString();
   }
  
catch (
Exception ex) {
throw ex; }
}

<hr />
-My Blog-
Messages postés
12
Date d'inscription
vendredi 10 octobre 2008
Statut
Membre
Dernière intervention
9 février 2010

Mais oui quel idiot, le secret c'est le -1... encore merci


        static string ChiffreLettre(int iParam)
        {
            string sTemp = "";
            int iTemp = iParam;
            try
            {
                while (iTemp > 0 )
                {
                    iTemp -= 1;
                    if (iTemp>25)
                    {
                        sTemp = Convert.ToChar((int)(iTemp % 26) + 65) + sTemp;
                        iTemp = (int)(iTemp / 26);
                    }
                    else
                    {
                        sTemp = Convert.ToChar(iTemp + 65)+sTemp;
                        iTemp = 0;
                    }
                }
                return sTemp;
            }
            catch (Exception oE)
            {
                throw oE;
            }
        }
Messages postés
12
Date d'inscription
vendredi 10 octobre 2008
Statut
Membre
Dernière intervention
9 février 2010

C'est le code qui marche bien au cas ou ;)

A+
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
17
J'avoue que j'avais failli le manquer aussi ^^

Cependant, y'a un truc que tu pourras peut-être m'expliquer car j'ai pas eu l'occaz de faire le code (ou de tester le tien):

Si on décale de 1, on dit alors que A correspond à 0 => alors AA (= 00) n'existe pas !!!! (ca devrait être BA après Z)

Comment évites-tu ce problème ???


Billou_13
Messages postés
12
Date d'inscription
vendredi 10 octobre 2008
Statut
Membre
Dernière intervention
9 février 2010

nop AA = 27

La difficulté pour moi est sur le Z et non sur le A

Si tu soustrais 1 tu à 26

26/26 = 1 Reste 0
Le reste donne la lettre en cour donc le caractère de droite est un "A" (puis ce qu'on traitre des nombres on vas de droite a gauche)
Ensuite on garde la partie entière de la division pour calculer le caractère suivant (celui de gauche)
Ce qui donnce 1

à l'ieration suivant, on recommence lors qu'on soustrait 1 on a 0
et c'est justement pour la dernière iteration que j'ai mis un if le nombre a traiter est plus petit que 25 de ne pas faire la division...

C'est plus claire avec des grand nombre plus grand que 262
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
17
Ok, merci beaucoup pour l'info !

Bonne fin de journée,


Billou_13
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
49
Alors, tu as essayé ce bout de code?
L'est plus rapide?

<hr />
-My Blog-
Messages postés
12
Date d'inscription
vendredi 10 octobre 2008
Statut
Membre
Dernière intervention
9 février 2010

salut, non, j'ai pas essayer, t'es juste arriver un peu comme la cavalerie ;)
mon applique est fini, mais je garde le liens au cas ou :)
Messages postés
12
Date d'inscription
vendredi 10 octobre 2008
Statut
Membre
Dernière intervention
9 février 2010

Mais a première vue c'est surement plus rapide :)