Conversion de nombre en lettres (sql)

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

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.