Rechercher : dans
Par :

Conversion d'un chiffre en lettres

Dernière réponse le 2 oct 2008 à 13:18:36 maria_physio, le 11 mai 2008 à 23:13:54 
 Signaler ce message aux modérateurs

Bonjour, bon voila je demande votre aide a propos d'un programme en langage c permettant
d'Afficher en toutes lettres un nombre donné avec virgule.( 0<nombre<1000000) merci bcp de votre aide

Configuration: Windows XP
Internet Explorer 6.0

Meilleures réponses pour « conversion d'un chiffre en lettres » dans :
[Word] Écrire un nombre en toutes lettres VoirPour transformer un nombre en toutes lettres sans se perdre dans l'orthographe (tirets, 's'...), il est possible de demander à Word de formater ce nombre en lettres : Créer un champ avec CTRL-F9 S'affichera {} à l'écran Le remplir avec la...
Chiffrement par substitution VoirLe chiffrement par substitution Le chiffrement par substitution consiste à remplacer dans un message une ou plusieurs entités (généralement des lettres) par une ou plusieurs autres entités. On distingue généralement plusieurs types de...

1

Rocky_123, le 11 mai 2008 à 23:15:52
  • +7

Salut, ben je n'ai pas cet algorithme en C mais en Java, si ça t'intéresse. C'est pas très très compliqué à réaliser, juste un peu casse-pied pour gérer correctement en français.

Répondre à Rocky_123

2

maria_physio, le 11 mai 2008 à 23:36:13
  • +5

Oui avc plaisir ce qui m'importe c de comprendre l'idée et je ferai en sorte de l'appliquer merci bcp pr ton aide

Répondre à maria_physio

3

Rocky_123, le 11 mai 2008 à 23:44:32
  • +3

Ok, alors je te préviens, il n'est pas beaucoup commenté, et il ne traite que les entiers, mais bon, l'idée était avant tout de faire un algorithme correct et non un programme complet.

Il respecte les règles du français, et est adaptable pour le format belge (ex: nonante-cinq) et français (quatre-vingt-quinze).

public class Convertisseur
{
	private static final String[] nombres = {"zéro",
						"un",
						"deux",
						"trois",
						"quatre",
						"cinq",
						"six",
						"sept",
						"huit",
						"neuf",
						"dix",
						"onze",
						"douze",
						"treize",
						"quatorze",
						"quinze",
						"seize",
						"dix-sept",
						"dix-huit",
						"dix-neuf"};

	private static final String[] dizaines = {"dix","vingt","trente","quarante","cinquante","soixante","septante","quatre-vingt","nonante"};
	private static final String[] unites = {"cent","mille","million","milliard","billion","billiard"};

	private boolean belge=false;

	public void setFormatBelge(boolean b)
	{
		belge=b;
	}

	public String getNombreEnLettres(long nombre)
	{
		String chaine= new String();
		int n = 0;

		if(nombre>=Math.pow(10,15))
		{
			n= (int) (nombre/(long)Math.pow(10,15));
			nombre%=Math.pow(10,15);
			chaine+= getUnite(n,true) + " " + unites[5];
			if(n>1) chaine+="s";
		}

		if(nombre>=Math.pow(10,12))
		{
			if(n>0) chaine+=" ";
			n= (int) (nombre/(long)Math.pow(10,12));
			nombre%=Math.pow(10,12);
			chaine+=getUnite(n,true) + " " + unites[4];
			if(n>1) chaine+="s";
		}

		if(nombre>=Math.pow(10,9))
		{
			if(n>0) chaine+=" ";
			n= (int) (nombre/(long)Math.pow(10,9));
			nombre%=Math.pow(10,9);
			chaine+=getUnite(n,true) + " " + unites[3];
			if(n>1) chaine+="s";
		}

		if(nombre>=Math.pow(10,6))
		{
			if(n>0) chaine+=" ";
			n= (int) (nombre/(long)Math.pow(10,6));
			nombre%=Math.pow(10,6);
			chaine+=getUnite(n,true) + " " + unites[2];
			if(n>1) chaine+="s";
		}

		if(nombre>=Math.pow(10,3))
		{
			if(n>0) chaine+=" ";
			n= (int) (nombre/(long)Math.pow(10,3));
			nombre%=Math.pow(10,3);

			if(n==1) chaine+=unites[1];
			else chaine+=getUnite(n,true) + " " + unites[1];
		}

		if(nombre>0 && nombre<1000)
		{
			if(n>0) chaine+=" ";
			chaine+=getUnite((int)nombre,false);
		}
		return chaine;
	}

	private String getUnite(int nombre, boolean s)
	{
		String chaine = new String();
		int n = 0;

		if(nombre==0)
			return nombres[0];
		else
		{
			if(nombre>=100)	// Centaines
			{
				n = (int) nombre/100;
				nombre%=100;

				if(n==1)
					chaine=unites[0];
				else
					chaine=nombres[n] + " " + unites[0];

				if(nombre==0 && n>1 && s==false)
					chaine+="s";
			}

			if(nombre>0 && nombre>19) // Dizaines
			{
				if(n>0) chaine+=" ";

				if(belge)
				{
					n = (int) nombre/10;
					nombre%=10;

					if(n>0) chaine+= dizaines[n-1];
					if(n==8 && nombre==0) chaine+="s";
				}
				else
				{
					n= (int) nombre/10;
					if(n==9)	{chaine+=dizaines[7]; nombre-=80;}
					else if (n==7)	{chaine+=dizaines[5]; nombre-=60;}
					else if (n>0)	{chaine+=dizaines[n-1]; nombre%=10;}

					if(n==8 && nombre==0) chaine+="s";
				}
			}
			else
			{
				if(n>0) n=-1;
				else n=0;
			}

			if(nombre>0)
			{
				if(n>0 && nombre==1 && n!=8) chaine+=" et ";
				if((n>0 && nombre!=1) || n==8) chaine+="-";
				if(n==-1) chaine+=" ";

				chaine+=nombres[(int)nombre];
			}

			return chaine;
		}
		
	}
}

Répondre à Rocky_123

4

Rocky_123, le 12 mai 2008 à 00:04:34

J'espère que tu as un peu compris comment j'ai procédé : je fais par étapes, exemple, d'abord les billiards, les milliards, les millions... et à chaque fois la fonction getUnite me permet de savoir combien (ex: 15 millions).

Répondre à Rocky_123

5

Rodge, le 29 jui 2008 à 04:42:12

Je propose une solution en BASIC (VBA, écrit dans un classeur Excel).
Placez le code ci-dessous dans un module de classeur Excel :

'DEBUT DU CODE

Option Explicit
Option Base 0

Rem  *****  BASIC  *****

Function numToAlpha(x As String, Optional u As Boolean = True, Optional v As String = "") As String
 ' _________________________________ Mémo _________________________________________________________________________________
 ' Écriture en lettres d'un nombre donné en chiffres
 ' Fonction créée le 16/07/2003 par ROGER
 ' Modifiée le 25/07/2008 par ROGER
 ' x est le nombre donné, de 0 à 999 999 999 999 999 999 (on peut essayer plus grand...)
 ' u (VRAI par défaut) contrôle l'écriture de 1000 ("mille" si u=1 ou VRAI ou est omis, "mil" si u=0 ou FAUX)
 ' v ("" par défaut, "d'" ou "de" typiquement) ajoute v à la fin si le nombre se termine par
 ' "milliard(s)" ou "million(s)".
 ' =numToAlpha(1948)        renvoie mille neuf cent quarante-huit
 ' =numToAlpha(1948,9)      renvoie mille neuf cent quarante-huit (la partie décimale est ignorée)
 ' =numToAlpha(1948;1)      renvoie mille neuf cent quarante-huit
 ' =numToAlpha(1948;0)      renvoie mil neuf cent quarante-huit
 ' =numToAlpha("1 000 000";;"de francs")
 ' renvoie  un million de francs
 ' =numToAlpha("876 543 200 980 654 321";1)
 ' renvoie huit cent soixante-seize millions cinq cent quarante-trois mille deux cents milliards
 '      neuf cent quatre-vingts millions six cent cinquante-quatre mille trois cent vingt-et-un
 ' ________________________________________________________________________________________________________________________
    If IsMissing(v) Then v = "" Else v = " " & v
    numToAlpha = NZ312UX(x, u, v)
End Function

Function NZ312UX(x As String, u As Boolean, v As String) As String
 ' ATTENTION : Cette fonction est récursive.
    Dim it As String, y As String
    x = clean1(x)
    On Error GoTo annule
    If Len(x) <> 0 Then
        If x <> "0" Then
            If Len(x) > 9 Then y = Left$(x, Len(x) - 9) Else y = "0"
            If y <> "0" Then
                it = it & NZ312UX(y, u, "") '*** *** *** APPEL RECURSIF DE NZ312UX *** *** ***
                If CDec(Right$(y, 6)) = 0 Then it = it & " de"
                it = it & " milliard": If y <> "1" Then it = it & "s"
            End If
            y = CStr(CDec(Right$(x, 9)))
            If y <> "0" Then
                If it <> "" Then it = it & " "
                it = it & t9(y, u): If CDec(Right$(y, 6)) = 0 Then it = it & v
            Else: it = it & v
            End If
        Else
            it = NZ312UY(0)
        End If
    End If
annule:
    NZ312UX = it
End Function

Function t9(x As String, Optional u As Boolean = True) As String
    Dim it As String, y As String
    y = CStr(CDec("0" & Right$(Left$(x, max(0, Len(x) - 6)), 3)))
    If y <> "0" Then
        it = it & t3(y) & " million": If y <> "1" Then it = it & "s"
    End If
    y = CStr(CDec("0" & Right$(Left$(x, max(0, Len(x) - 3)), 3)))
    If y <> "0" Then
        If it <> "" Then it = it & " "
        If y <> "1" Then it = it & t3(y, 0) & " "
        it = it & "mil": If u Then it = it & "le"
    End If
    y = CStr(CDec(Right$(x, 3)))
    If y <> "0" Then
        If it <> "" Then it = it & " "
        it = it & t3(y)
    End If
    t9 = it
End Function

Function t3(x As String, Optional u As Boolean = True) As String
    Dim it As String, y As String
    If x <> "0" Then
        y = CStr(CDec("0" & Left$(x, max(0, Len(x) - 2)))): x = CDec(Right$(x, 2))
        If y <> "0" Then
            If y <> "1" Then it = NZ312UY(CInt(y)) & " "
            it = it & "cent": If x = "0" And y <> "1" And u Then it = it & "s"
        End If
        If x <> "0" Then
            If it <> "" Then it = it & " "
            it = it & NZ312UY(CInt(x)): If x = "80" And u Then it = it & "s"
        End If
    End If
    t3 = it
End Function

Function clean1(x As String) As String
    Dim it As String, compte As Integer
    For compte = 1 To Len(x)
        If Mid(x, compte, 1) = "," Then Exit For
        If IsNumeric(Mid(x, compte, 1)) And Mid(x, compte, 1) <> " " And Mid(x, compte, 1) <> Chr(160) Then it = it + Mid(x, compte, 1)
    Next compte
    clean1 = it
End Function

Function clean2(x As String) As String
    Dim it As String, compte As Integer
    For compte = 1 To Len(x)
        If (Mid(x, compte, 1) = "," Or IsNumeric(Mid(x, compte, 1))) And Mid(x, compte, 1) <> " " And Mid(x, compte, 1) <> Chr(160) Then it = it + Mid(x, compte, 1)
    Next compte
    clean2 = it
End Function

Function min(a As Long, b As Long) As Long
    min = (a + b - Abs(a - b)) / 2
End Function

Function max(a As Long, b As Long) As Long
    max = (a + b + Abs(a - b)) / 2
End Function

Function NZ312UY(x As Integer) As String
 ' ATTENTION : Cette fonction est récursive.
    Dim a As Variant, s As String
    a = Array("zéro", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "onze", _
    "douze", "treize", "quatorze", "quinze", "seize", "vingt", "trente", "quarante", "cinquante", _
    "soixante", "quatre-vingt")
    Select Case x
        Case 0 To 16: s = a(x)
        Case 17 To 19: s = a(10 * Int(x / 10)) & "-" & a(x Mod 10)
        Case 20 To 69: s = a(15 + Int(x / 10))
        If x Mod 10 = 1 Then s = s & " et " & a(x Mod 10) Else If x Mod 10 > 1 Then s = s & "-" & a(x Mod 10)
        Case 70 To 99: s = a(18 + Int(x / 20))
        If x = 71 Then s = s & " et " & a(x Mod 20) Else If x Mod 20 > 0 Then s = s & "-" & NZ312UY(x Mod 20)
        Case Else: s = "?"
    End Select
    NZ312UY = s
End Function
 ' ________________________________________________________________________________________________________________________

Function numDecToAlpha(x As String, Optional u As Boolean = True) As String
    Dim c As Integer
    x = clean2(x)
    If Len(x) <> 0 Then
        c = InStr(x, ",")
        If c <> 0 Then
            numDecToAlpha = numToAlpha(Left$(x, c - 1), u) & " virgule "
            Do While InStr(Right$(x, Len(x) - c), "0") = 1
                numDecToAlpha = numDecToAlpha & "zéro ": c = c + 1
            Loop
            numDecToAlpha = numDecToAlpha & numToAlpha(Right$(x, Len(x) - c), u)
        Else
            numDecToAlpha = numToAlpha(x, u)
        End If
    Else
        numDecToAlpha = ""
    End If
End Function

Function FRFA(x As String, Optional u As Boolean = True) As String
    Dim c As Integer
    x = clean2(x)
    If Len(x) <> 0 Then
        c = InStr(x, ",")
        If c <> 0 Then
            FRFA = numToAlpha(Left$(x, c - 1), u, "de")
            FRFA = FRFA & " franc"
            If CDec(x) >= 2 Then FRFA = FRFA & "s"
            FRFA = FRFA & " et " & numToAlpha(Mid$(x & "0", c + 1, 2), u) & " centime"
            If CDec(Mid$(x, c + 1, 2)) >= 2 Then FRFA = FRFA & "s"
        Else
            FRFA = numToAlpha(x, u, "de")
            FRFA = FRFA & " franc"
            If CDec(x) >= 2 Then FRFA = FRFA & "s"
        End If
    Else
        FRFA = ""
    End If
End Function

Function EURA(x As String, Optional u As Boolean = True) As String
    Dim c As Integer
    x = clean2(x)
    If Len(x) <> 0 Then
        c = InStr(x, ",")
        If c <> 0 Then
            EURA = numToAlpha(Left$(x, c - 1), u, "d'")
            If Right$(EURA, 1) = "'" Then EURA = EURA & "euro" Else EURA = EURA & " euro"
            If CDec(x) >= 2 Then EURA = EURA & "s"
            EURA = EURA & " et " & numToAlpha(Mid$(x & "0", c + 1, 2), u) & " centime"
            If CDec(Mid$(x, c + 1, 2)) >= 2 Then EURA = EURA & "s"
        Else
            EURA = numToAlpha(x, u, "d'")
            If Right$(EURA, 1) = "'" Then EURA = EURA & "euro" Else EURA = EURA & " euro"
            If CDec(x) >= 2 Then EURA = EURA & "s"
        End If
    Else
        EURA = ""
    End If
End Function
 ' 
________________________________________________________________________________________________________________________
'FIN DU CODE

Utilisation :
Dans une cellule du classeur où est installé le code, essayez :

=numToAlpha(2327) renvoie deux mille trois cent vingt-sept
=numToAlpha(1948;0) renvoie mil neuf cent quarante-huit
=numToAlpha("80 000 000 000 000 000") renvoie quatre-vingts millions de milliards

=EURA("12 895,71 €") renvoie douze mille huit cent quatre-vingt-quinze euros et soixante et onze centimes
=EURA(1000000) renvoie un million d'euros

=numDecToAlpha(5720015698,00519) renvoie cinq milliards sept cent vingt millions quinze mille six cent quatre-vingt-dix-huit virgule zéro zéro cinq cent dix-neuf

Si ça peut servir...
...tant mieux !

Répondre à Rodge

6

 MEDY, le 2 oct 2008 à 13:18:36

TEST LA CATCHEUSE

Répondre à MEDY
Collection CommentÇaMarche.net