Format décimal (FloatFormat, Precision, Digits) → masque (##,#0.000E+#)

Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016
- - Dernière réponse : zwyx
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016
- 2 août 2010 à 18:47
FloatFormat,Precision,Digits,Masque

Bonjour à tous,

Je bloque dans l'écriture d'une bête routine. Savoir qu'on approche du week-end doit m'empêcher de me concentrer. Ainsi, je fais appel à vous, pour me donner quelques indices.

Je cherche à convertir un format d'affichage de réel à virgule flottante, défini par les mêmes paramètres que ceux de la fonction FloatToStrF, à savoir:[list]
[*] FloatFormat
[*] Precision
[*] Digits
/listen un masque composé des caractères '#', '0', 'E+', 'E-', DecimalSeparator, ThousandSeparator.

Voici donc le prototype de ma fonction:
function ElaborerMasque(const AFormat: TFloatFormat;
                        const APrecision: Integer;
                        const ADigits: Integer): String;
const
  kChiffreObligatoire: String = '0';
  kChiffreFacultatif: String = '#';
  kExposantDecimal: String = 'E+';
  kSeparateurDecimal: String = '.'; { ou DecimalSeparator }
  kSeparateurMilliers: String = ''; { ou ThousandSeparator }
begin
  { initialisation par défaut }
  Result := '';

  case AFormat of

    { format général }
    ffGeneral:
    begin
      //???
    end;

    { format exponentiel }
    ffExponent:
    begin

    end;

    { format fixe }
    ffFixed:
    begin
      //???
    end;

    { format nombre }
    ffNumber:
    begin
      //???
    end;

    { format monétaire }
    ffCurrency:
    begin
      //???
    end;

  end; { case AFormat }
end;


Toutes vos idées seront les bienvenues. Bon week-end.
Afficher la suite 

3 réponses

Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016
0
Merci
J'ajoute que j'ai déjà écrit une fonction de padding, au cas où elle serait utile:
function RepeterChaine(const AChaine: String;
                       const ANbIterations: Integer): String;
var
  iCompteurIteration: Integer;
begin
  { initialisation par défaut }
  Result := '';
  { le nombre d'itérations est strictement positif }
  if ANbIterations > 0 then
  begin
    for iCompteurIteration := 1 to ANbIterations do
    begin
      Result := Result + AChaine;
    end;
  end;
end;
Commenter la réponse de zwyx
Messages postés
4208
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 août 2019
32
0
Merci
Salut,

pourrais tu être un peu plus précis sur ta demande ?

j'ai pas bien compris ce que tu souhaites faire ... et je suis peut être pas le seul


[hr]@+Cirec
[hr]
Commenter la réponse de Cirec
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016
0
Merci
Merci Cirec pour ton retour, et désolé de n'avoir pas été clair dans ma question.

L'objectif est d'obtenir, à partir des paramètres qui définissent habituellement le format d'affichage d'un flottant (FloatFormat, Precision, Digits, voir paramètres de la fonction FloatToStrF), un masque, permettant par exemple de formater l'affichage des valeurs sur un axe de graphique.

Bref, j'ai écris une solution qui me convient, et qui pourra peut-être servir à d'autres. L'astuce de départ était de commencer par prendre une petite bière.
{*****************************************************************************
  Fonction    : ElaborerMasque
  Description : élabore le masque d'affichage des réels
*****************************************************************************}
function TFichePrincipale.ElaborerMasque(const AFormat: TFloatFormat; const APrecision: Integer; const ADigits: Integer): String;
var
  iNbChiffres: Integer;
const
  { spécificateurs du format décimal }
  kChiffreObligatoire: String = '0';
  kChiffreEventuel: String = '#';
  kExposantDecimal: String = 'E+';
  kEspaceInsecable: String = #160;
  { intervale de validité de Digits }
  kMinDigits: Integer = 0;
  kMaxDigits: Integer = 18;
  kMaxDigitsExp: Integer = 4;
begin
  { initialisation par défaut }
  Result := '';

  case AFormat of

    { format général }
    ffGeneral:
    begin
      Result := kChiffreObligatoire + DecimalSeparator + RepeterChaine(kChiffreEventuel, ADigits);
    end;

    { format exponentiel }
    ffExponent:
    begin
      iNbChiffres := Min(kMaxDigitsExp, Max(kMinDigits, ADigits));
      Result := kChiffreObligatoire + DecimalSeparator + RepeterChaine(kChiffreObligatoire, APrecision - 1) + kExposantDecimal + RepeterChaine(kChiffreObligatoire, iNbChiffres);
    end;

    { format fixe }
    ffFixed:
    begin
      iNbChiffres := Min(kMaxDigits, Max(kMinDigits, ADigits));
      Result := kChiffreObligatoire + DecimalSeparator + RepeterChaine(kChiffreObligatoire, iNbChiffres);
    end;

    { format nombre }
    ffNumber:
    begin
      iNbChiffres := Min(kMaxDigits, Max(kMinDigits, ADigits));
      Result := kChiffreEventuel + ThousandSeparator + kChiffreEventuel + kChiffreEventuel + kChiffreObligatoire + DecimalSeparator + RepeterChaine(kChiffreObligatoire, iNbChiffres);
    end;

    { format monétaire }
    ffCurrency:
    begin
      iNbChiffres := Min(kMaxDigits, Max(kMinDigits, ADigits));
      Result := kChiffreEventuel + ThousandSeparator + kChiffreEventuel + kChiffreEventuel + kChiffreObligatoire + DecimalSeparator + RepeterChaine(kChiffreObligatoire, iNbChiffres) + kEspaceInsecable + CurrencyString;
    end;

  end; { case AFormat }
end;

{*****************************************************************************
  Fonction    : RepeterChaine
  Description : retourne la chaîne formée d'itérations de la chaîne fournie
*****************************************************************************}
function TFichePrincipale.RepeterChaine(const AChaine: String; const ANbIterations: Integer): String;
var
  iCompteurIteration: Integer;
begin
  { initialisation par défaut }
  Result := '';

  { le nombre d'itérations est strictement positif }
  if ANbIterations > 0 then
  begin
    for iCompteurIteration := 1 to ANbIterations do
    begin
      Result := Result + AChaine;
    end;
  end;

end;

Merci à vous tout de même, et bonne soirée.
Commenter la réponse de zwyx