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

Signaler
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016
-
zwyx
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016
-
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.

3 réponses

Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016

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;
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
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]
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016

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.