Bonjour à tous,
je voudrais convertir un index de colonne depuis un int vers une chaine.
Toujours pour ma classe Excel, je voudrais obtenir 'A' depuis 1, 'AB'
depuis 28 par exemple.
J'ai trouvé la fonction suivante sur le net:
AnsiString XLCells::Get_Indice_Colonne(int colonne)
{
int diviseur;
int reste;
AnsiString indice;
char carac;
do
{
diviseur = colonne / 26;
reste = colonne % 26;
// Conversion en caractère
carac = reste + 64; // Code Ascii du A = 65
indice += carac;
colonne = diviseur;
}
while (diviseur != 0);
//Les lettres de la colonne sont inversés, donc on remet dans l'ordre
AnsiString chaine;
for(int i = indice.Length(); i > 0; i--)
chaine += indice.SubString(i, 1);
return chaine;
}
Bonjour à tous,
je voudrais convertir un index de colonne depuis un int vers une chaine.
Toujours pour ma classe Excel, je voudrais obtenir 'A' depuis 1, 'AB'
depuis 28 par exemple.
J'ai trouvé la fonction suivante sur le net:
AnsiString XLCells::Get_Indice_Colonne(int colonne)
{
int diviseur;
int reste;
AnsiString indice;
char carac;
do
{
diviseur = colonne / 26;
reste = colonne % 26;
// Conversion en caractère
carac = reste + 64; // Code Ascii du A = 65
indice += carac;
colonne = diviseur;
}
while (diviseur != 0);
//Les lettres de la colonne sont inversés, donc on remet dans l'ordre
AnsiString chaine;
for(int i = indice.Length(); i > 0; i--)
chaine += indice.SubString(i, 1);
return chaine;
}
Bonjour à tous,
je voudrais convertir un index de colonne depuis un int vers une chaine.
Toujours pour ma classe Excel, je voudrais obtenir 'A' depuis 1, 'AB'
depuis 28 par exemple.
J'ai trouvé la fonction suivante sur le net:
AnsiString XLCells::Get_Indice_Colonne(int colonne)
{
int diviseur;
int reste;
AnsiString indice;
char carac;
do
{
diviseur = colonne / 26;
reste = colonne % 26;
// Conversion en caractère
carac = reste + 64; // Code Ascii du A = 65
indice += carac;
colonne = diviseur;
}
while (diviseur != 0);
//Les lettres de la colonne sont inversés, donc on remet dans l'ordre
AnsiString chaine;
for(int i = indice.Length(); i > 0; i--)
chaine += indice.SubString(i, 1);
return chaine;
}
AnsiString XLCells::Get_Indice_Colonne(int colonne)
{
int diviseur;
int reste;
AnsiString indice;
char carac;
do
{
diviseur = colonne / 26;
reste = colonne % 26;
// Conversion en caractère
carac = reste + 64; // Code Ascii du A = 65
indice += carac;
colonne = diviseur;
}
while (diviseur != 0);
//Les lettres de la colonne sont inversés, donc on remet dans l'ordre
AnsiString chaine;
for(int i = indice.Length(); i > 0; i--)
chaine += indice.SubString(i, 1);
return chaine;
}
Problème: dès qu'il y a un 'Z' dans le retour ça ne marche plus, j'ai
'@'.
Comment je peux résoudre ça?
AnsiString XLCells::Get_Indice_Colonne(int colonne)
{
int diviseur;
int reste;
AnsiString indice;
char carac;
do
{
diviseur = colonne / 26;
reste = colonne % 26;
// Conversion en caractère
carac = reste + 64; // Code Ascii du A = 65
indice += carac;
colonne = diviseur;
}
while (diviseur != 0);
//Les lettres de la colonne sont inversés, donc on remet dans l'ordre
AnsiString chaine;
for(int i = indice.Length(); i > 0; i--)
chaine += indice.SubString(i, 1);
return chaine;
}
Problème: dès qu'il y a un 'Z' dans le retour ça ne marche plus, j'ai
'@'.
Comment je peux résoudre ça?
AnsiString XLCells::Get_Indice_Colonne(int colonne)
{
int diviseur;
int reste;
AnsiString indice;
char carac;
do
{
diviseur = colonne / 26;
reste = colonne % 26;
// Conversion en caractère
carac = reste + 64; // Code Ascii du A = 65
indice += carac;
colonne = diviseur;
}
while (diviseur != 0);
//Les lettres de la colonne sont inversés, donc on remet dans l'ordre
AnsiString chaine;
for(int i = indice.Length(); i > 0; i--)
chaine += indice.SubString(i, 1);
return chaine;
}
Problème: dès qu'il y a un 'Z' dans le retour ça ne marche plus, j'ai
'@'.
Comment je peux résoudre ça?
(en fait là je suis pas sur, est ce qu'on sait que la valeur de 'A' c'est
celle utilisée dans la table ASCII ?)
(en fait là je suis pas sur, est ce qu'on sait que la valeur de 'A' c'est
celle utilisée dans la table ASCII ?)
(en fait là je suis pas sur, est ce qu'on sait que la valeur de 'A' c'est
celle utilisée dans la table ASCII ?)
Bonjour à tous,
je voudrais convertir un index de colonne depuis un int vers une chaine.
Toujours pour ma classe Excel, je voudrais obtenir 'A' depuis 1, 'AB'
depuis 28 par exemple.
J'ai trouvé la fonction suivante sur le net:
AnsiString XLCells::Get_Indice_Colonne(int colonne)
{
int diviseur;
int reste;
AnsiString indice;
char carac;
do
{
diviseur = colonne / 26;
reste = colonne % 26;
// Conversion en caractère
carac = reste + 64; // Code Ascii du A = 65
indice += carac;
colonne = diviseur;
}
while (diviseur != 0);
//Les lettres de la colonne sont inversés, donc on remet dans l'ordre
AnsiString chaine;
for(int i = indice.Length(); i > 0; i--)
chaine += indice.SubString(i, 1);
return chaine;
}
Problème: dès qu'il y a un 'Z' dans le retour ça ne marche plus, j'ai
'@'.
Comment je peux résoudre ça?
Bonjour à tous,
je voudrais convertir un index de colonne depuis un int vers une chaine.
Toujours pour ma classe Excel, je voudrais obtenir 'A' depuis 1, 'AB'
depuis 28 par exemple.
J'ai trouvé la fonction suivante sur le net:
AnsiString XLCells::Get_Indice_Colonne(int colonne)
{
int diviseur;
int reste;
AnsiString indice;
char carac;
do
{
diviseur = colonne / 26;
reste = colonne % 26;
// Conversion en caractère
carac = reste + 64; // Code Ascii du A = 65
indice += carac;
colonne = diviseur;
}
while (diviseur != 0);
//Les lettres de la colonne sont inversés, donc on remet dans l'ordre
AnsiString chaine;
for(int i = indice.Length(); i > 0; i--)
chaine += indice.SubString(i, 1);
return chaine;
}
Problème: dès qu'il y a un 'Z' dans le retour ça ne marche plus, j'ai
'@'.
Comment je peux résoudre ça?
Bonjour à tous,
je voudrais convertir un index de colonne depuis un int vers une chaine.
Toujours pour ma classe Excel, je voudrais obtenir 'A' depuis 1, 'AB'
depuis 28 par exemple.
J'ai trouvé la fonction suivante sur le net:
AnsiString XLCells::Get_Indice_Colonne(int colonne)
{
int diviseur;
int reste;
AnsiString indice;
char carac;
do
{
diviseur = colonne / 26;
reste = colonne % 26;
// Conversion en caractère
carac = reste + 64; // Code Ascii du A = 65
indice += carac;
colonne = diviseur;
}
while (diviseur != 0);
//Les lettres de la colonne sont inversés, donc on remet dans l'ordre
AnsiString chaine;
for(int i = indice.Length(); i > 0; i--)
chaine += indice.SubString(i, 1);
return chaine;
}
Problème: dès qu'il y a un 'Z' dans le retour ça ne marche plus, j'ai
'@'.
Comment je peux résoudre ça?
std::string getColumnDisplayRepresentation(int column)
{
assert(column > 0);
static char digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static int const numDigits = sizeof(digits) - 1;
static int const maxResultSize = sizeof(column)*CHAR_BIT+1
char result[maxResultSize];
int index = maxResultSize;
--column;
result[--index] = ' ';
do {
result[--index] = digits[column % numDigits];
colonne /= numDigits;
} while (column != 0);
return result+index;
}
std::string getColumnDisplayRepresentation(int column)
{
assert(column > 0);
static char digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static int const numDigits = sizeof(digits) - 1;
static int const maxResultSize = sizeof(column)*CHAR_BIT+1
char result[maxResultSize];
int index = maxResultSize;
--column;
result[--index] = ' ';
do {
result[--index] = digits[column % numDigits];
colonne /= numDigits;
} while (column != 0);
return result+index;
}
std::string getColumnDisplayRepresentation(int column)
{
assert(column > 0);
static char digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static int const numDigits = sizeof(digits) - 1;
static int const maxResultSize = sizeof(column)*CHAR_BIT+1
char result[maxResultSize];
int index = maxResultSize;
--column;
result[--index] = ' ';
do {
result[--index] = digits[column % numDigits];
colonne /= numDigits;
} while (column != 0);
return result+index;
}
Jean-Marc Bourguet wrote:std::string getColumnDisplayRepresentation(int column)
{
assert(column > 0);
static char digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static int const numDigits = sizeof(digits) - 1;
Je pense qu'il ne faut pas de -1 ci-dessus.
Jean-Marc Bourguet wrote:
std::string getColumnDisplayRepresentation(int column)
{
assert(column > 0);
static char digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static int const numDigits = sizeof(digits) - 1;
Je pense qu'il ne faut pas de -1 ci-dessus.
Jean-Marc Bourguet wrote:std::string getColumnDisplayRepresentation(int column)
{
assert(column > 0);
static char digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static int const numDigits = sizeof(digits) - 1;
Je pense qu'il ne faut pas de -1 ci-dessus.
carac = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[reste];
indice += carac;
colonne = diviseur;
}
while (diviseur != 0);
Quand je fais des conversions, j'ai tendance a etablir une
borne superieure du nombre de caracteres (sizeof(int)*CHAR_BIT
+ 1 est valable pour toutes les bases), a allouer un tableau
de cette taille et a le remplir en sens inverse.
Ca evite de devoir faire://Les lettres de la colonne sont inversés, donc on remet dans l'ordre
AnsiString chaine;
for(int i = indice.Length(); i > 0; i--)
chaine += indice.SubString(i, 1);
return chaine;
}
carac = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[reste];
indice += carac;
colonne = diviseur;
}
while (diviseur != 0);
Quand je fais des conversions, j'ai tendance a etablir une
borne superieure du nombre de caracteres (sizeof(int)*CHAR_BIT
+ 1 est valable pour toutes les bases), a allouer un tableau
de cette taille et a le remplir en sens inverse.
Ca evite de devoir faire:
//Les lettres de la colonne sont inversés, donc on remet dans l'ordre
AnsiString chaine;
for(int i = indice.Length(); i > 0; i--)
chaine += indice.SubString(i, 1);
return chaine;
}
carac = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[reste];
indice += carac;
colonne = diviseur;
}
while (diviseur != 0);
Quand je fais des conversions, j'ai tendance a etablir une
borne superieure du nombre de caracteres (sizeof(int)*CHAR_BIT
+ 1 est valable pour toutes les bases), a allouer un tableau
de cette taille et a le remplir en sens inverse.
Ca evite de devoir faire://Les lettres de la colonne sont inversés, donc on remet dans l'ordre
AnsiString chaine;
for(int i = indice.Length(); i > 0; i--)
chaine += indice.SubString(i, 1);
return chaine;
}
Jean-Marc Bourguet wrote:
[...]carac = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[reste];
Je suis content de voir que je ne suis pas le seul qui utilise
cette forme d'écriture.
En fait, j'aurais écrit tout simplement :
<dest> = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[ colonne % 26 ] ;
colonne /= 26 ;
Aujourd'hui, je pars du principe qu'on utiliserait std::string à
la place de AnsiString,
Jean-Marc Bourguet wrote:
[...]
carac = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[reste];
Je suis content de voir que je ne suis pas le seul qui utilise
cette forme d'écriture.
En fait, j'aurais écrit tout simplement :
<dest> = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[ colonne % 26 ] ;
colonne /= 26 ;
Aujourd'hui, je pars du principe qu'on utiliserait std::string à
la place de AnsiString,
Jean-Marc Bourguet wrote:
[...]carac = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[reste];
Je suis content de voir que je ne suis pas le seul qui utilise
cette forme d'écriture.
En fait, j'aurais écrit tout simplement :
<dest> = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[ colonne % 26 ] ;
colonne /= 26 ;
Aujourd'hui, je pars du principe qu'on utiliserait std::string à
la place de AnsiString,
"Vincent Lascaux" writes:(en fait là je suis pas sur, est ce qu'on sait que la valeur
de 'A' c'est celle utilisée dans la table ASCII ?)
Non. On n'est pas sur non plus que les lettres soient consecutives.
std::string getColumnDisplayRepresentation(int column)
{
assert(column > 0);
static char digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static int const numDigits = sizeof(digits) - 1;
static int const maxResultSize = sizeof(column)*CHAR_BIT+1
char result[maxResultSize];
int index = maxResultSize;
--column;
result[--index] = ' ';
do {
result[--index] = digits[column % numDigits];
colonne /= numDigits;
} while (column != 0);
return result+index;
}
ainsi le jour ou on decide que O et I risquent d'etre
confondus avec 0 et 1 et doivent donc etre evites, on n'a
qu'une chose a faire.
"Vincent Lascaux" <nospam@nospam.org> writes:
(en fait là je suis pas sur, est ce qu'on sait que la valeur
de 'A' c'est celle utilisée dans la table ASCII ?)
Non. On n'est pas sur non plus que les lettres soient consecutives.
std::string getColumnDisplayRepresentation(int column)
{
assert(column > 0);
static char digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static int const numDigits = sizeof(digits) - 1;
static int const maxResultSize = sizeof(column)*CHAR_BIT+1
char result[maxResultSize];
int index = maxResultSize;
--column;
result[--index] = ' ';
do {
result[--index] = digits[column % numDigits];
colonne /= numDigits;
} while (column != 0);
return result+index;
}
ainsi le jour ou on decide que O et I risquent d'etre
confondus avec 0 et 1 et doivent donc etre evites, on n'a
qu'une chose a faire.
"Vincent Lascaux" writes:(en fait là je suis pas sur, est ce qu'on sait que la valeur
de 'A' c'est celle utilisée dans la table ASCII ?)
Non. On n'est pas sur non plus que les lettres soient consecutives.
std::string getColumnDisplayRepresentation(int column)
{
assert(column > 0);
static char digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static int const numDigits = sizeof(digits) - 1;
static int const maxResultSize = sizeof(column)*CHAR_BIT+1
char result[maxResultSize];
int index = maxResultSize;
--column;
result[--index] = ' ';
do {
result[--index] = digits[column % numDigits];
colonne /= numDigits;
} while (column != 0);
return result+index;
}
ainsi le jour ou on decide que O et I risquent d'etre
confondus avec 0 et 1 et doivent donc etre evites, on n'a
qu'une chose a faire.