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).
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.