Conversion de nombre en lettres (sql)

Soyez le premier à donner votre avis sur cette source.

Vue 43 045 fois - Téléchargée 1 295 fois

Description

Je me suis inspiré du code c# trouvé ici (http://files.codes-sources.com/fichier.aspx?id=21491&f=convertisseur.cs) pour écrire cette fonction SQL.
Elle convertit les nombres de 0 à 999,999,999 en lettres, et j'ai corrigé un ou deux points mineurs.

Source / Exemple :


CREATE FUNCTION NombreEnLettres
(
	@nombre int
)
RETURNS varchar(200)
AS
BEGIN
	DECLARE @lettres varchar(200)

	DECLARE @diviseur int

	DECLARE @centaine int
	DECLARE @dizaine int
	DECLARE @unite int
	DECLARE @reste int
	DECLARE @courant int
	DECLARE @dix bit
	DECLARE @et bit

	DECLARE @ajout varchar(200)

	SET @lettres = ''
	SET @diviseur = 1000000
	SET @dix = 0
	SET @reste = @nombre

	IF @nombre > 999999999
		RETURN 'Un milliard ou plus'

	WHILE @diviseur >= 1
	BEGIN
		SELECT @courant = @reste / @diviseur
		IF @courant <> 0
		BEGIN
			SELECT @centaine = @courant / 100
			SELECT @dizaine = (@courant - @centaine * 100) / 10
			SELECT @unite = @courant - (@centaine * 100) - (@dizaine * 10)
			SELECT @ajout = ''

			SELECT @ajout = @ajout +
				CASE @centaine
				WHEN 1 THEN 'cent '
				WHEN 2 THEN 
					CASE WHEN @dizaine = 0 AND @unite = 0 THEN 'deux cents ' ELSE 'deux cent ' END
				WHEN 3 THEN 
					CASE WHEN @dizaine = 0 AND @unite = 0 THEN 'trois cents ' ELSE 'trois cent ' END
				WHEN 4 THEN 
					CASE WHEN @dizaine = 0 AND @unite = 0 THEN 'quatre cents ' ELSE 'quatre cent ' END
				WHEN 5 THEN 
					CASE WHEN @dizaine = 0 AND @unite = 0 THEN 'cinq cents ' ELSE 'cinq cent ' END
				WHEN 6 THEN 
					CASE WHEN @dizaine = 0 AND @unite = 0 THEN 'six cents ' ELSE 'six cent ' END
				WHEN 7 THEN 
					CASE WHEN @dizaine = 0 AND @unite = 0 THEN 'sept cents ' ELSE 'sept cent ' END
				WHEN 8 THEN 
					CASE WHEN @dizaine = 0 AND @unite = 0 THEN 'huit cents ' ELSE 'huit cent ' END
				WHEN 9 THEN 
					CASE WHEN @dizaine = 0 AND @unite = 0 THEN 'neuf cents ' ELSE 'neuf cent ' END
				ELSE ''
				END

			SELECT @ajout = @ajout +
				CASE @dizaine
				WHEN 2 THEN 'vingt '
				WHEN 3 THEN 'trente '
				WHEN 4 THEN 'quarante '
				WHEN 5 THEN 'cinquante '
				WHEN 6 THEN 'soixante '
				WHEN 7 THEN 'soixante '
				WHEN 8 THEN 'quatre-vingt '
				WHEN 9 THEN 'quatre-vingt '
				ELSE ''
				END
			
			SELECT @dix = CASE @dizaine
				WHEN 1 THEN 1
				WHEN 7 THEN 1
				WHEN 9 THEN 1
				ELSE 0
				END

			SELECT @et = CASE @dizaine
				WHEN 0 THEN 0
				WHEN 1 THEN 0
				WHEN 2 THEN 1
				WHEN 3 THEN 1
				WHEN 4 THEN 1
				WHEN 5 THEN 1
				WHEN 6 THEN 1
				WHEN 7 THEN 1
				WHEN 8 THEN 0
				WHEN 9 THEN 0
				ELSE 0
				END

			SELECT @ajout = @ajout +
				CASE @unite
				WHEN 0 THEN
					CASE @dix WHEN 1 THEN 'dix ' ELSE '' END
				WHEN 1 THEN
					CASE @et WHEN 1 THEN 'et ' ELSE '' END +
					CASE @dix WHEN 1 THEN 'onze ' ELSE 'un ' END
				WHEN 2 THEN
					CASE @dix WHEN 1 THEN 'douze ' ELSE 'deux ' END
				WHEN 3 THEN
					CASE @dix WHEN 1 THEN 'treize ' ELSE 'trois ' END
				WHEN 4 THEN
					CASE @dix WHEN 1 THEN 'quatorze ' ELSE 'quatre ' END
				WHEN 5 THEN
					CASE @dix WHEN 1 THEN 'quinze ' ELSE 'cinq ' END
				WHEN 6 THEN
					CASE @dix WHEN 1 THEN 'seize ' ELSE 'six ' END
				WHEN 7 THEN
					CASE @dix WHEN 1 THEN 'dix-sept ' ELSE 'sept ' END
				WHEN 8 THEN
					CASE @dix WHEN 1 THEN 'dix-huit ' ELSE 'huit ' END
				WHEN 9 THEN
					CASE @dix WHEN 1 THEN 'dix-neuf ' ELSE 'neuf ' END
				ELSE ''
				END

			SELECT @lettres = @lettres +	
				CASE @diviseur
				WHEN 1000000 THEN
					CASE
					WHEN @courant = 1 THEN 'un million ' 
					WHEN @courant > 1 THEN @ajout + 'millions '
					END 
				WHEN 1000 THEN
					CASE WHEN @courant > 1 THEN @ajout ELSE '' END + 'mille ' 
				ELSE @ajout
				END

			SELECT @reste = @reste - @courant * @diviseur
		END
		SELECT @diviseur = @diviseur / 1000
	END

	IF @lettres = '' SELECT @lettres = 'zéro'

	RETURN RTRIM(@lettres)
END
GO

Conclusion :


Comme j'en avais besoin pour convertir des dates, je me suis arrêté avant le million, mais on peut rajouter facilement les millions et milliards. (passer le @diviseur initial à 10^6 ou 10^9, selon les besoin, puis ajouter le cas à la fin dans le CASE @diviseur)

Update:
J'ai ajouté les millions... J'espère que ça aidera certains.
Et je me suis amusé à retourner une simple indication de dépassement si on atteint le milliard.
Notez d'ailleurs que pour les milliards, il faudra (en plus des mêmes modifications effectuées ici) passer le type de @nombre et @reste à bigint (le int étant majoré à 2,147,483,647).

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Searwn
Messages postés
3
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
29 octobre 2008
-
Merci petite correction

WHEN 9 THEN 'quatre-vingt ' >>

WHEN 9 THEN 'quatre-dix'
Searwn
Messages postés
3
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
29 octobre 2008
-
WHEN 9 THEN 'quatre-vingt dix'
SORRY
wormlore
Messages postés
3
Date d'inscription
vendredi 23 mai 2008
Statut
Membre
Dernière intervention
24 juillet 2010
-
Normalement non, c'est comme pour 1 et 7: on prépare à écrire "soixante" ou "quatre-vingt", puis on gère le "dix".
Ca vient du fait qu'on n'écrit pas "dix cinq" mais "quinze"...
Les spécificités de la langue française... :\
GURDOUS
Messages postés
25
Date d'inscription
mercredi 10 mars 2004
Statut
Membre
Dernière intervention
18 décembre 2008
-
ça marche pour les chiffre rond, mais pour les chiffre décimal elle n'affiche le décimal.
Meric
wormlore
Messages postés
3
Date d'inscription
vendredi 23 mai 2008
Statut
Membre
Dernière intervention
24 juillet 2010
-
Oui, effectivement ce code ne convertit que les entiers...
Lorsque j'ai écrit "999,999", je voulais dire "neuf cent quatre-vingt dix-neuf mille neuf cent quatre-vingt dix-neuf", pas "neuf cent quatre-vingt dix-neuf virgule neuf cent quatre-vingt dix-neuf" (une petite manie qui consiste à écrire en notation anglaise).

Comme je devais convertir des dates (et un peu en urgence), j'ai paré au plus pressé: les entiers jusqu'à l'ordre du millier.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.