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

zwyx Messages postés 146 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 mars 2016 - 30 juil. 2010 à 17:47
zwyx Messages postés 146 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.

3 réponses

zwyx Messages postés 146 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 mars 2016
30 juil. 2010 à 17:52
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;
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
31 juil. 2010 à 12:31
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]
0
zwyx Messages postés 146 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 mars 2016
2 août 2010 à 18:47
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.
0
Rejoignez-nous