IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Langage > Types de données > Nombres
        Comment convertir un entier (int) en chaîne (AnsiString) ?
        Comment changer le caractère décimal par défaut ?
        Comment utiliser des grands nombres ?
        Comment obtenir un entier à partir d'un réel ?
        Comment formater l'affichage d'un réel ?
        Comment arrondir un réel ?
        Comment obtenir la valeur décimale d'un entier à partir d'une représentation hexadécimale ?
        Comment afficher un nombre / hexadecimal en 'chaîne de bits'



Comment convertir un entier (int) en chaîne (AnsiString) ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Pour convertir un entier en chaîne, utilisons la fonction IntToStr. Cette fonction convertit un entier en un AnsiString.

AnsiString Chaine;
int i = 10;
Chaine = IntToStr(i); // Chaine = "10"

Comment changer le caractère décimal par défaut ?
Créé le 01/09/2004[haut]
auteur : Nono40
En fonction des ordinateurs et de la configuration des options régionales, le caractère décimal par défaut n'est pas toujours le même. Si votre application est sensible à ce caractère, il est conseillé de le fixer à l'initialisation de l'application. Par exemple dans le constructeur de la fiche principale :

__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  DecimalSeparator = ".";
}
Ainsi le caractère sera toujours le même. Il faut aussi penser à gérer la saisie de ce caractère dans les TEdit ou autres zones de saisie devant contenir des nombres réels :

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
  if (Key == '.' || Key == ',')
  {
    Key = DecimalSeparator;
  }
}

Comment utiliser des grands nombres ?
Créé le 01/09/2004[haut]
auteur : Geronimo
En C++, les types standards ne peuvent pas représenter de très grands nombres. Cela dépend bien sûr de l'implémentation. Par exemple, avec C++Builder, un entier peut être utilisé pour un nombre de 20 chiffres grand maximum (au moyen du type __int64. Consultant l'aide, on pourrait souhaiter utiliser le type double qui permet d'utiliser des nombres de 5.0 x 10^-324 à 1.7 x 10^308. Mais les calculs se font alors de manière approchée, ce qui n'est pas du tout souhaitable.

La solution est d'utiliser des librairies qui se chargent de représenter de très grands entiers. Il y en a plusieurs dont GMP, ou la librairie NTL . La librairie NTL s'est compilée sans aucun problème sous Windows avec C++Builder, ce qui n'a pas été le cas de la première. De plus, cette librairie dispose de multiples fonctions très utiles en cryptographie.

Vous pouvez également créer votre propre librairie. Le principe est donc de créer un type de grands entiers, soit une classe, cette classe contenant toutes les opérations ; donc vous devrez définir les opérateurs de base tels +, -, /, *, % sans oublier quelques fonctions très utiles telles la fonction puissance, la fonction factorielle... Pour représenter l'entier dans cette classe, vous devrez utiliser un tableau.

Pour plus d'informations, consultez les liens ci-dessous.

lien : en GMP
lien : en NTL
lien : en MIRACL
lien : en MPFR
lien : fr HaypoCalc

Comment obtenir un entier à partir d'un réel ?
Créé le 31/01/2005[haut]
auteurs : Nono40, Ricky81
Pour extraire un nombre entier à partir d'un réel, vous pouvez faire appel à l'une des fonctions classiques C/C++ ou alors aux suivantes (nécessite d'inclure Math.hpp) :

int Ceil(long double X);
Ceil arrondit à l'entier supérieur :
Ceil(1.2) donne 2
Ceil(1.9) donne 2
Ceil(-1.5) donne -1

int Floor(long double X);
Floor arrondit à l'entier inférieur :
Floor(1.2) donne 1
Floor(1.9) donne 1
Floor(-1.5) donne -2

double RoundTo(const double Avalue, signed char ADigit);
RoundTo(f, 0) arrondit à l'entier le plus proche. Dans le cas où la valeur est juste entre deux entiers, c'est l'entier pair qui est choisi.
RoundTo(1.2, 0) donne 1
RoundTo(1.9, 0) donne 2
RoundTo(1.5, 0) donne 2
RoundTo(2.5, 0) donne 2
RoundTo(2.500001, 0) donne 3
RoundTo(-1.4, 0) donne -1
RoundTo(-1.5, 0) donne -2

double SimpleRoundTo(double Avalue, signed char ADigit);
SimpleRoundTo(f, 0) arrondit à l'entier le plus proche. Dans le cas où la valeur est juste entre deux entiers, c'est l'entier supérieur qui est choisi.
SimpleRoundTo(1.2, 0) donne 1
SimpleRoundTo(1.9, 0) donne 2
SimpleRoundTo(1.5, 0) donne 2
SimpleRoundTo(2.5, 0) donne 3
SimpleRoundTo(-1.4, 0) donne -1
SimpleRoundTo(-1.5, 0) donne -1

Pour imiter la fonction Trunc() en Pascal, on pourra faire un simple cast vers un entier :

int i = (int) 2.9; // i vaut 2
lien : faq Comment arrondir un réel ?
lien : faq Comment formater l'affichage d'un réel ?

Comment formater l'affichage d'un réel ?
Créé le 31/01/2005[haut]
auteurs : Ricky81, Nono40
Pour transformer un réel en chaîne sans formatage particulier il suffit d'utiliser la fonction FloatToStr() :

AnsiString FloatToStr(long double Value);
Mais dans la plupart des cas, il est utile de formater le nombre de décimales. Pour ce faire il y a différentes fonctions proposées par C++ Builder : FloatToStrF(), FormatFloat() ou Format().

Par exemple pour afficher une valeur avec deux chiffres après la virgule :

float f = 12345.6789;
ShowMessage(FloatToStrF(f, ffFixed, 8, 2));
ShowMessage(FormatFloat("0.00", f));
ShowMessage(Format("%8.2f", ARRAYOFCONST((f))));
N'hésitez pas à consulter l'aide pour une utilisation avancée de ces fonctions.

lien : faq Comment arrondir un réel ?
lien : faq Comment obtenir un entier à partir d'un réel ?

Comment arrondir un réel ?
Créé le 31/01/2005[haut]
auteur : Ricky81
Pour arrondir un réel, vous pouvez utiliser les fonctions SimpleRoundTo() et RoundTo() de l'unité Math (nécessite d'inclure Math.hpp). La différence se situe au niveau de l'arrondi pour les valeurs se situant à distance égale de 2 nombres : dans ce cas SimpleRoundTo() arrondit vers la valeur supérieure alors que RoundTo() vers la valeur finissant par un chiffre pair.

Exemple :

ShowMessage(SimpleRoundTo(3.1415, -2)); // affiche 3.14
ShowMessage(RoundTo(3.1415, -2)); // affiche 3.14

ShowMessage(SimpleRoundTo(250, 2)); // affiche 300
ShowMessage(RoundTo(250, 2)); // affiche 200

Comment obtenir la valeur décimale d'un entier à partir d'une représentation hexadécimale ?
Créé le 31/01/2005[haut]
auteurs : Ricky81, Bloon
La fonction suivante propose un tel traitement en utilisant tout simplement la fonction StrToInt :

int __fastcall HexToInt(AnsiString Value)
{
   if (Value.AnsiPos("$") == 0)
   {
      // on ajoute $ en tête de chaîne   
      Value = "$" + Value;
   }     
   
   return StrToInt(Value);
}
Exemples d'utilisation :

ShowMessage(HexToInt("12")); // affiche 18
ShowMessage(HexToInt("F1")); // affiche 241
ShowMessage(HexToInt("$FF")); // affiche 255

Comment afficher un nombre / hexadecimal en "chaîne de bits"
Créé le 06/12/2006[haut]
auteurs : henderson, cryptonyx
Une première méthode :

//---------------------------------------------------------------------------
// IntToBinStr
//  Number : entier ou hexadecimal non signé
//  Digits : nombre de quartets affichés
//---------------------------------------------------------------------------
AnsiString IntToBinStr(unsigned int Number, int Digits)
{
int i;
AnsiString KeyString;
char *BitSTring[] = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
                      "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
 
if(Digits > 4 || Digits < 1)
return "";    // par exemple
      
for(i = Digits; i > 0 ; i--)
KeyString += BitSTring[(Number >> (4 * (i - 1))) & 0x0F];
 
return KeyString;
}
Une seconde méthode :

AnsiString IntToBitStr(UINT I, int nBits)
{
AnsiString N="";
if(nBits > 32) nBits = 32;
for(int j = 0; j < nBits; j++)
{
N = "0" + N; //remplissage par le début de la chaîne
N[1] = (char)(N[1] + (I & 1)); // on évite un if
I = I / 2; // prêt pour le bit suivant
}
return N;
}
  • 19 -> 0001011
  • 0x13 -> 0001011



Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.