IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Fonction de conversion de nombre en lettres


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 106
    Points : 97
    Points
    97
    Par défaut Fonction de conversion de nombre en lettres
    Bonjour,

    Je recherche une fonction de conversion de nombre en lettres, et j'ai pas envie de réinventer la roue. Est-ce-que quelqu'un aurait ça dans ses tiroirs?

    Une fonction qui convertirait: 3458984 en 'TROIS MILLIONS QUATRE CENT CINQUANTE HUIT MILLE NEUF CENT QUATRE VINGT QUATRE' par exemple.

    Merci d'avance.

    David

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Houlà, c'est compliqué ça.

    Tu peux tenter un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    case unite of
      1 : chaine := 'un';
      2 : chaine := 'deux';
      ...
    end;
    A toi de séparer les unité du reste ...
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  3. #3
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 106
    Points : 97
    Points
    97
    Par défaut
    Merci MisterD, mais développe un peu plus tu fais une ligne par nombre, jusqu'au milliard?

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Question déjà posée : fais une recherche sur le forum ...

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  5. #5
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    T'as de la chance, je l'ai sous la main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    function NombreEnLettres(n : integer) : string;
    Const
      unite : array[1..16] of string  = ('un','deux','trois','quatre','cinq','six',
                                         'sept','huit','neuf','dix','onze','douze',
                                         'treize','quatorze','quinze','seize');
      dizaine : array[2..8] of string = ('vingt','trente','quarante','cinquante',
                                         'soixante','','quatre-vingt');
      coefs : array[0..3] of string   = ('cent','mille','million','milliard');
    Var
      temp    : string;
      c, d, u : byte;
      coef    : byte;
      i       : word;
      neg     : boolean;
    Begin
      If n = 0 then
        begin
        result := ' zero';
        exit;
        end;
     
      result := '';
      neg := n < 0;
      If neg then n := -n;
     
      coef:=0;
      Repeat
        u:=n mod 10; n:=n div 10; {Récupère unité et dizaine}
        d:=n mod 10; n:=n div 10; {Récupère dizaine}
        If d in [1,7,9] then
          begin
          Dec(d);
          Inc(u,10);
          end;
        temp := '';
        if d > 1 then
          begin
          temp := ' ' + Dizaine[d];
          if (d < 8) and ((u = 1) or (u = 11)) then
            temp := temp + ' et';
          end;
        if u > 16 then
          begin
          temp := temp + ' ' + unite[10];
          Dec(u,10);
          end;
        if u > 0 then temp := temp + ' ' + unite[u];
        If (result = '') and (d = 8) and (u = 0) then result := 's';
        result := temp + result;
     
        c := n mod 10; n := n div 10; {Récupère centaine}
        If c > 0 then
          begin
          temp := '';
          if c > 1 then temp := ' ' + unite[c] + temp;
          temp := temp + ' ' + coefs[0];
          If (result = '') and (c > 1) then result := 's';
          result := temp + result;
          end;
     
        if n > 0 then
          begin
          Inc(coef);
          I := n mod 1000;
          If (i > 1) and (coef > 1) then result := 's' + result;
          If i > 0 then result := ' ' + coefs[coef] + result;
          If (i = 1) and (coef = 1) then Dec(n);
          end;
      until n = 0;
      result := Trim(result);
      if neg then result := 'moins ' + result;
    End;
    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  6. #6
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Citation Envoyé par david_chardonnet
    Merci MisterD, mais développe un peu plus tu fais une ligne par nombre, jusqu'au milliard?
    T'inquiète pas, j'avais pas l'intention d'aller jusque là. Je penser m'arrêter à dix, et gérer ensuite les dixaine etc...

    Sinon, le code de Bloon à l'air de marcher.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  7. #7
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 106
    Points : 97
    Points
    97
    Par défaut
    Merci Bloon!!

  8. #8
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Pense au tag [RESOLU]
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  9. #9
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    Merci Bloon, ça m'a permis un gain de temps. De plus, je trouve le code et astucieux.

    J'ai modifié le code donné par Bloon pour correspondre à l'orthographe de la langue française, avec actualisation de 1990 : http://www.academie-francaise.fr/lan...s.html#nombres.

    Je le dépose ici au cas où ça peut intéresser du monde.

    Ecrire un nombre en toutes lettres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    function NombreEnToutesLettres(n : integer) : string;
    Const
      unite : array[1..16] of string  = ('un','deux','trois','quatre','cinq','six',
                                         'sept','huit','neuf','dix','onze','douze',
                                         'treize','quatorze','quinze','seize');
      dizaine : array[2..8] of string = ('vingt','trente','quarante','cinquante',
                                         'soixante','','quatre-vingt');
      coefs : array[0..3] of string   = ('cent','mille','million','milliard');
    Var
      temp    : string;
      c, d, u : byte;
      coef    : byte;
      i       : word;
      neg     : boolean;
    Begin
      If n = 0 then begin
        Result := ' zéro';
        exit;
      end;
     
      Result := '';
      neg := n < 0;
      If neg then n := -n;
     
      coef:=0;
      Repeat
        u:=n mod 10; n:=n div 10; {Récupère unité et dizaine}
        d:=n mod 10; n:=n div 10; {Récupère dizaine}
        If d in [1,7,9] then begin
          Dec(d);
          Inc(u, 10);
        end;
        temp := '';
        if d > 1 then begin
          temp := Dizaine[d];
          if (d < 8) and ((u = 1) or (u = 11)) then
            temp := temp + '-et';
        end;
        if u > 16 then begin
          if temp = '' then
            temp := unite[10]
          else
            temp := temp + '-' + unite[10];
          Dec(u, 10);
        end;
        if u > 0 then begin
          if temp <> '' then
            temp := temp + '-';
    	    temp := temp + unite[u];
        end;
        If (d = 8) and (u = 0) and ((Result = '') or (LeftStr(Result, 6) = '-milli')) then
    	    Result := 's' + Result;
        Result := temp + Result;
     
        c := n mod 10; n := n div 10; {Récupère centaine}
        If c > 0 then begin
          temp := '';
          if c > 1 then
    	      temp := unite[c] + '-';
          temp := temp + coefs[0];
          if (Result <> '') and (LeftStr(Result, 1) <> '-') then
            Result := '-' + Result;
          if (c > 1) and ((Result = '') or (LeftStr(Result, 6) = '-milli')) then
            Result := 's' + Result;
          Result := temp + Result;
        end;
     
        if n > 0 then begin
          Inc(coef);
          I := n mod 1000;
          If (Result <> '') and (LeftStr(Result, 1) <> '-') then
    	      Result := '-' + Result;       
          If (i > 1) and (coef > 1) then
    	      Result := 's' + Result;     
          If i > 0 then
            Result := '-' + coefs[coef] + Result;
          If (i = 1) and (coef = 1) then
      	    Dec(n);
        end;
      until n = 0;
      Result := Trim(Result);
      if neg then
        Result := 'moins ' + Result;
    End;
    Écrire un montant en euros en toutes lettres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function MontantEnToutesLettres(f : double) : string;
    const
      Centieme = 'centime';
      Monnaie = 'euro';
    var
      i : Integer;
    begin
      Result := '';
     
      // partie décimale 
      i := Round(Frac(f) * 100);
      if i > 0 then begin // n'écrit pas "zéro centime" si partie décimale nulle
        if i > 1 then
          Result := 's';
        Result := ' ' + NombreEnToutesLettres(i) + ' ' + Centieme + Result;
      end;
     
      // partie entière
      i := Trunc(f);
      if i > 1 then
        Result := 's' + Result;
      Result := NombreEnToutesLettres(i) + ' ' + Monnaie + Result;
    end;
    Un projet de test en pièce jointe.

    Si vous pensez que cela mérite d'aller dans la FAQ, ravi d'avoir participer

    Arnaud D.
    Fichiers attachés Fichiers attachés
    --
    Arnaud DANEELS

  10. #10
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Apparement, tu n'as besoin de gérer que les entiers.
    Je te propose un truc un peu plus propre que cette procédure avec des ifs de partout et assez compliqué à lire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Function NbreToLettre(Nbre : integer; Maj : boolean = False) : string;
    const
      N0_19: array[0..19] of string =
      ('zéro','un','deux','trois','quatre','cinq','six','sept','huit','neuf', 'dix',
      'onze','douze','treize','quatorze','quinze','seize','dix-sept','dix-huit','dix-neuf');
      N20_60: array[2..6] of string =
      ('vingt','trente','quarante','cinquante','soixante');
      Separateur: array[Boolean] of string = ('-', ' et ');
    var NDizaines, NCentaines : integer;
        stMaj, stMin : string;
    begin
      Case Nbre of
        0..19 : Result := N0_19[Nbre];
        20..69 :
        begin
          NDizaines := Nbre div 10;
          // Gère les cas de 20, 30, 40, 50 et 60
          if (Nbre mod 10 = 0) then
            Result := N20_60[NDizaines]
          else
            Result := N20_60[NDizaines]
              + Separateur[Nbre mod 10 = 1]
              + N0_19[Nbre - NDizaines * 10];
        end;
        70..79 : Result := 'soixante' + Separateur[Nbre mod 10 = 1] + N0_19[Nbre - 60];
        80 : Result := 'quatre-vingts';
        81..99 : Result := 'quatre-vingt-' + N0_19[Nbre - 80];
        100 : Result := 'cent';
        101..199 : Result := 'cent ' + NbreToLettre(Nbre - 100);
        200..999 :
        begin
          NCentaines := Nbre div 100;
          if (Nbre mod 100 = 0) then
            Result := N0_19[NCentaines] + ' cents'
          else
            Result := N0_19[NCentaines] + ' cent '
              + NbreToLettre(Nbre - NCentaines * 100);
     
        end;
        1000 : Result := 'mille';
      end;
      if (Maj) then
      begin
        // stMaj prend la première lettre
        stMaj := UpperCase(Copy(Result,0,1));
        // stMin prend la suite
        stMin := Copy(Result,2,Length(Result));
        // Resultat la première lettre est en majuscule
        Result := stMaj + stMin;
      end;
    end;
    Edit : Je ne suis allé que jusqu'à mille mais le principe est le même pour les nombres plus grands

  11. #11
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    voici une version un peu améliorée qui tient compte du mille invariant et du s sur cent et vingt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    function Int1KToText(Value: Integer; Last: Boolean): string;
    const
     
      NUM_0_19 : array[0..19] of string = (
        'zéro', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit',
        'neuf', 'dix', 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize',
        'dix-sept', 'dix-huit', 'dix-neuf'
      );
     
      NUM_20_60: array[2..6] of string = (
        'vingt', 'trente', 'quarante', 'cinquante', 'soixante'
      );
     
      Separateur: array[Boolean] of string = ('-', ' et ');
     
    var
      D, M: Integer;
     
    begin
      case Value of
     
        0..19    : Result := NUM_0_19[Value];
     
        20..69   :
        begin
          D := Value div 10;
          M := Value mod 10;
          Result := NUM_20_60[D];
          if M > 0 then
            Result := Result + Separateur[Value mod 10 = 1] + NUM_0_19[M];
        end;
     
        70..79   : Result := 'soixante' + Separateur[Value mod 10 = 1] + NUM_0_19[Value - 60];
     
        80       :
        begin
          Result := 'quatre-vingt';
          if Last then
            Result := Result + 's';
        end;
     
        81..99   : Result := 'quatre-vingt-' + NUM_0_19[Value - 80];
     
        100      : Result := 'cent';
        101..199 : Result := 'cent ' + Int1KToText(Value - 100, Last);
        200..999 :
        begin
          D := Value div 100;
          M := Value mod 100;
          Result := NUM_0_19[D] + ' cent';
          if M = 0 then
          begin
            if Last then
              Result := Result + 's'
          end else begin
            Result := Result + ' ' + Int1KToText(M, Last);
          end;
        end
      else
     
        raise Exception.Create('Int99ToText overflow');
     
      end;
    end;
     
    function IntToText(Value: Integer): string;
    const
      Units: array[0..2] of string = ('milliard', 'million', 'mille');
    var
      I, N, D: Integer;
    begin
      Result := '';
     
      N := 1000000000;
      for I := 0 to 2 do
      begin
        if Value >= N then
        begin
          if Result <> '' then
            Result := Result + ' ';
          D := Value div N;
          Value := Value - (N * D);
          if (D > 1) or ((D = 1) and (I < 2)) then // "mille", "un million"
            Result := Result + Int1KToText(D, False) + ' ';
          Result := Result + Units[I];
          if (D > 1) and (I < 2) then // "mille" est invariant
            Result := Result + 's';
          if Value = 0 then
            Exit;
        end;
        N := N div 1000;
      end;
     
      if Result <> '' then
        Result := Result + ' ';
     
      Result := Result + Int1KToText(Value, True);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    voici une version un peu améliorée qui tient compte du mille invariant et du s sur cent et vingt
    Donc Paul, en plus d'être un expert Delphi tu es un expert en orthographe. Impressionnant, on vient de retrouver Maitre Capello.
    Ok, je sors.

  13. #13
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    voici une version un peu améliorée qui tient compte du mille invariant et du s sur cent et vingt
    Très joli !

    J'ai bien aimé ça entre autres : Separateur[Value mod 10 = 1]
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  14. #14
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut


    Mais Paul n'est pas Maître Capello car d'une ce dernier était chiant et sans humour et de deux (pour le coup je vais faire Maître Capello) la règle a été réformée en 1990 concernant les traits d'union, on peut en mettre partout maintenant (enfin presque partout... sinon c'était trop beau). (C'est ce qui est enseigné dans les collèges maintenant).

    Cette notation à un avantage pour différencier par exemple "51/3" cinquante-et-un tiers de "50 + 1/3" cinquante et un tiers
    4220/7 quatre-mille-deux-cent-vingt septièmes
    4200/27 quatre-mille-deux-cent vingt-septièmes
    4000/227 quatre-mille deux-cent-vingt-septièmes
    4227ième quatre-mille-deux-cent-vingt-septièmes

    Je reviens sur le presque partout... car il y a un flou sur les noms millier, million et milliard (qui ne sont pas des adjectifs cardinaux) qui seraient donc exclus de cette règle (et donc non entouré de traits d'union)...
    Genre on va simplifier... mais attendez il y a des pièges alors que d'autres (plus raisonnables je dirais) disent qu'on peut en mettre également autours des noms millier million et milliard.

    Tout ceci, ne sont que des recommandations (mais c'est elles qui sont maintenant enseignées).

    Maître Capello puissance 2 :

    Pour ce qui est de l'accord de cent, la règle c'est
    Le mot cent est invariable sauf quand il est précédé d'un nombre qui le multiplie et n'est pas suivi par un autre adjectif numéral cardinal
    Donc
    trois-cents
    cinq-cent-un
    mille-cent
    mais...
    trois-cents millions
    cinq-cents milliards
    car million et milliard sont des noms (<> adjectif numéral cardinal).

    Mais bon c'est du chipotage si on me donne un chèque de cinq-cent milliards je le prendrai quand même

  15. #15
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Barbibulle Voir le message


    Mais Paul n'est pas Maître Capello car d'une ce dernier était chiant et sans humour et de deux (pour le coup je vais faire Maître Capello) la règle a été réformée en 1990 concernant les traits d'union, on peut en mettre partout maintenant (enfin presque partout... sinon c'était trop beau). (C'est ce qui est enseigné dans les collèges maintenant).

    Cette notation à un avantage pour différencier par exemple "51/3" cinquante-et-un tiers de "50 + 1/3" cinquante et un tiers
    4220/7 quatre-mille-deux-cent-vingt septièmes
    4200/27 quatre-mille-deux-cent vingt-septièmes
    4000/227 quatre-mille deux-cent-vingt-septièmes
    4227ième quatre-mille-deux-cent-vingt-septièmes

    Je reviens sur le presque partout... car il y a un flou sur les noms millier, million et milliard (qui ne sont pas des adjectifs cardinaux) qui seraient donc exclus de cette règle (et donc non entouré de traits d'union)...
    Genre on va simplifier... mais attendez il y a des pièges alors que d'autres (plus raisonnables je dirais) disent qu'on peut en mettre également autours des noms millier million et milliard.

    Tout ceci, ne sont que des recommandations (mais c'est elles qui sont maintenant enseignées).

    Maître Capello puissance 2 :

    Pour ce qui est de l'accord de cent, la règle c'est


    Donc
    trois-cents
    cinq-cent-un
    mille-cent
    mais...
    trois-cents millions
    cinq-cents milliards
    car million et milliard sont des noms (<> adjectif numéral cardinal).

    Mais bon c'est du chipotage si on me donne un chèque de cinq-cent milliards je le prendrai quand même
    Merci,

    oui j'avais vu pour les traits d'union mais je trouvais ça moche ^^ mais c'est facile à corriger.

    par contre pour le s, si je ne m'abuse il suffit alors de remplacer le paramètre "False" par "I < 2" en ligne 85 de mon code.

    trois-cents milliards (avec un Int64 en ligne 67 et 71 dans ce cas )
    trois-cents millions
    trois-cent mille
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  16. #16
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Jusqu'à présent, j'utilisais le code proposé par Bloon cité plus haut qui ne gère pas les traits tirets (aucun) ni l'accords de cent suivi de million /milliard .

    Mais qui était user-friendly avec nos amis les Belges (par défaut c'est l'utilisation de la règle française mais on peut demander une écriture selon les règles belges avec des septante, octante et nonante. Il me semble que les Suisses (certains cantons) on une règle spécifique avec huitante).

    On ne parlera pas des québécois qui je crois sont comme en France mis à part pour les traits-tirets qui sont chez eux obligatoires partout.

    En tous les cas merci Paul pour ce code qui m'a fait réviser toutes ces règles et merci à Thierry qui a déterré feu Maître Capello.

    et deux-cents francs pour le nourrain !
    http://www.ina.fr/video/I09006940

  17. #17
    Membre à l'essai

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Je retrouve cet antique sujet, avec la surprise de découvrir qu'il a eu des suites jusqu'en 2015 !

    Comme il faut rendre à Pascal ce qui lui revient, je voulais quand même mentionner que la fonction initiale fournie par "Bloom" venait... de moi !
    Et, en 2006, elle avait déjà une longue histoire :

    Sa première version date de 1983, en basic sur commodore 4032. Je l'avais écrite pour un ami (Patrice C.) qui voulait afficher un chèque en fin d'un jeu de Black-Jack en consommant le moins de ressource possible.

    Je l'ai ensuite réutilisée vers 1984, lors d'un stage de programmation en basic, pour la proposer en exercice, avec pour contrainte de n'utiliser qu'un minimum de mots en "data" et de faire le programme le plus court possible, contrainte d'où sont issue les tables Unité[], Dizaine[] et Coefs[].

    Je l'ai ensuite transcrite en Pascal en 2002 après avoir trouvé une demande qui avait généré quelques monstruosités sur un forum francophone dédié à Delphi. Elle avait alors été complétée le 13 mars 2002, pour tenir compte de la remarque de Zacharie TCHOUALA pour gérer la règle : « L'adjectif numéral "cent" ne prend pas la marque du pluriel s'il est suivi d'un autre nombre (exemple : trois cent quatre), mais il s'accorde devant "million" et "milliard" qui sont des noms. Exemple : trois cents millions deux cent mille.> d'après "Le Robert d'aujourd'hui" (édition mise à jour d'octobre 1995). »

    Amitiés, et meilleurx voeux à tous pour 2021, soit 38 ans après la première version ! :-)
    (Avec un clin d'oeil à Paul en passant !)

  18. #18
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Hello,

    comme quoi ça sert toujours de passer du temps sur ce forum...je corrige (pour les "-") et complète mon code avec une fonction DateToText

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    function Int1KToText(Value: Integer; Last: Boolean): string;
    const
      NUM_0_19 : array[0..19] of string = (
        'zéro', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit',
        'neuf', 'dix', 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize',
        'dix-sept', 'dix-huit', 'dix-neuf'
      );
     
      NUM_20_60: array[2..6] of string = (
        'vingt', 'trente', 'quarante', 'cinquante', 'soixante'
      );
     
      Separateur: array[Boolean] of string = ('-', '-et-');
     
    var
      D, M: Integer;
     
    begin
      case Value of
     
        0..19    : Result := NUM_0_19[Value];
     
        20..69   :
        begin
          D := Value div 10;
          M := Value mod 10;
          Result := NUM_20_60[D];
          if M > 0 then
            Result := Result + Separateur[Value mod 10 = 1] + NUM_0_19[M];
        end;
     
        70..79   : Result := 'soixante' + Separateur[Value mod 10 = 1] + NUM_0_19[Value - 60];
     
        80       :
        begin
          Result := 'quatre-vingt';
          if Last then
            Result := Result + 's';
        end;
     
        81..99   : Result := 'quatre-vingt-' + NUM_0_19[Value - 80];
     
        100      : Result := 'cent';
        101..199 : Result := 'cent ' + Int1KToText(Value - 100, Last);
        200..999 :
        begin
          D := Value div 100;
          M := Value mod 100;
          Result := NUM_0_19[D] + '-cent';
          if M = 0 then
          begin
            if Last then
              Result := Result + 's'
          end else begin
            Result := Result + '-' + Int1KToText(M, Last);
          end;
        end
      else
     
        raise Exception.Create('Int99ToText overflow');
     
      end;
    end;
     
    function IntToText(Value: Integer): string;
    const
      Units: array[0..2] of string = ('milliard', 'million', 'mille');
    var
      I, N, D: Integer;
    begin
      Result := '';
     
      N := 1000000000;
      for I := 0 to 2 do
      begin
        if Value >= N then
        begin
          if Result <> '' then
            Result := Result + '-';
          D := Value div N;
          Value := Value - (N * D);
          if (D > 1) or ((D = 1) and (I < 2)) then // "mille", "un million"
            Result := Result + Int1KToText(D, I < 2) + '-';
          Result := Result + Units[I];
          if (D > 1) and (I < 2) then // "mille" est invariant
            Result := Result + 's';
          if Value = 0 then
            Exit;
        end;
        N := N div 1000;
      end;
     
      if Result <> '' then
        Result := Result + '-';
     
      Result := Result + Int1KToText(Value, True);
    end;
     
    function DateToText(Date: TDateTime): string;
    var
      y, m, d: Word;
    begin
      DecodeDate(Date, y, m, d);
      Result := IntToText(d) + '-' + FormatSettings.LongMonthNames[m] + '-' + IntToText(y);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  19. #19
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Bonjour,
    on pourrait peut-être mettre cette fonction dans la FAQ en complément de celle-ci ?

    A+
    Charly

  20. #20
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    La FAQ est collaborative (donc modifiable) il suffit d'un volontaire pour se charger de rajouter cette "nouvelle" version

    1983/1984 C'est à peu près l'époque où j'ai commencé à sévir comme prof d'informatique dans une "école" privée et l'un des premiers exercices d'algorithme que j'ai donné aux "deuxième année"
    (langages Basic mais aussi RPG sur IBM 36) sous le titre "écrire un programme d'émission de chèques".
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Conversion de nombre en lettre
    Par Invité dans le forum Contribuez
    Réponses: 5
    Dernier message: 28/04/2011, 20h07
  2. [CR XI] Fonction de conversion de chiffre en lettre
    Par GodGives dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 18/05/2009, 19h46
  3. Conversion des nombres en lettres
    Par mehdiyou dans le forum VB.NET
    Réponses: 1
    Dernier message: 09/04/2008, 15h11
  4. pl/sql fonction de conversion de chiffres en lettres
    Par sawasbanikh dans le forum PL/SQL
    Réponses: 1
    Dernier message: 18/04/2007, 14h52
  5. Fonction de conversion de nombre réel en text
    Par hakim81 dans le forum Delphi
    Réponses: 2
    Dernier message: 05/02/2007, 14h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo