CONVERSION DE NOMBRE EN LETTRES (SQL)

Searwn Messages postés 3 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 29 octobre 2008 - 29 oct. 2008 à 23:56
cs_anneso108 Messages postés 1 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 8 mai 2012 - 8 mai 2012 à 19:05
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/48292-conversion-de-nombre-en-lettres-sql

cs_anneso108 Messages postés 1 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 8 mai 2012
8 mai 2012 à 19:05
Bonjour, merci pour ce code qui m'a été bien utile :-) J'ai essayé de m'en inspirer pour gérer les nombres mais en anglais et j'y suis presque sauf pour la gestion du "and", pas moyen de trouver comment gérer de le mettre dans certains cas et pas dans d'autres.
Exemple : 159256
me donne One hundred and fifty-nine thousand two hundred and fifty-six.

Alors que le premier and devant fifty-nine ne devrait pas être là :-/ Est-ce que quelqu'un peut me donner un coup de main pour l'anglais svp ?

Voici mon code, c'est pour les nombres ordinaux, avec "th" à la fin donc j'ai rajouté des case à la fin pour gérer cela :
CREATE FUNCTION Get_Number_to_Ordinal_In_English_Letters
(
@number int
)
RETURNS varchar(200)
AS
BEGIN
DECLARE @letters varchar(200)
DECLARE @divisor int
DECLARE @hundred int
DECLARE @ten int
DECLARE @unit int
DECLARE @remaining int
DECLARE @currentnumber int
DECLARE @tennb bit
DECLARE @adding varchar(200)
DECLARE @terminaison varchar(20)
SET @letters = ''
SET @terminaison = ''
SET @divisor = 1000000
SET @tennb = 0
SET @remaining =@number
IF @number > 999999999
RETURN 'One billion or more'
WHILE @divisor >= 1
BEGIN
SELECT @currentnumber = @remaining / @divisor
IF @currentnumber <> 0
BEGIN
SELECT @hundred = @currentnumber / 100
SELECT @ten = (@currentnumber - @hundred * 100) / 10
SELECT @unit = @currentnumber - (@hundred * 100) - (@ten * 10)
SELECT @adding = ''
SELECT @adding = @adding +
CASE @hundred
WHEN 1 THEN
CASE WHEN @ten 0 AND @unit 0 THEN 'one hundred ' ELSE 'one hundred and ' END
WHEN 2 THEN
CASE WHEN @ten 0 AND @unit 0 THEN 'two hundred ' ELSE 'two hundred and ' END
WHEN 3 THEN
CASE WHEN @ten 0 AND @unit 0 THEN 'three hundred ' ELSE 'three hundred and ' END
WHEN 4 THEN
CASE WHEN @ten 0 AND @unit 0 THEN 'four hundred ' ELSE 'four hundred and ' END
WHEN 5 THEN
CASE WHEN @ten 0 AND @unit 0 THEN 'five hundred ' ELSE 'five hundred and ' END
WHEN 6 THEN
CASE WHEN @ten 0 AND @unit 0 THEN 'six hundred ' ELSE 'six hundred and ' END
WHEN 7 THEN
CASE WHEN @ten 0 AND @unit 0 THEN 'seven hundred ' ELSE 'seven hundred and ' END
WHEN 8 THEN
CASE WHEN @ten 0 AND @unit 0 THEN 'eight hundred ' ELSE 'eight hundred and ' END
WHEN 9 THEN
CASE WHEN @ten 0 AND @unit 0 THEN 'nine hundred ' ELSE 'nine hundred and ' END
ELSE ''
END
SELECT @adding = @adding +
CASE @ten
WHEN 2 THEN
CASE WHEN @unit = 0 THEN 'twenty ' ELSE 'twenty-' END
WHEN 3 THEN
CASE WHEN @unit = 0 THEN 'thirty ' ELSE 'thirty-' END
WHEN 4 THEN
CASE WHEN @unit = 0 THEN 'forty ' ELSE 'forty-' END
WHEN 5 THEN
CASE WHEN @unit = 0 THEN 'fifty ' ELSE 'fifty-' END
WHEN 6 THEN
CASE WHEN @unit = 0 THEN 'sixty ' ELSE 'sixty-' END
WHEN 7 THEN
CASE WHEN @unit = 0 THEN 'seventy ' ELSE 'seventy-' END
WHEN 8 THEN
CASE WHEN @unit = 0 THEN 'eighty ' ELSE 'eighty-' END
WHEN 9 THEN
CASE WHEN @unit = 0 THEN 'ninety ' ELSE 'ninety-' END
ELSE ''
END

SELECT @tennb = CASE @ten
WHEN 1 THEN 1
ELSE 0
END
SELECT @adding = @adding +
CASE @unit
WHEN 0 THEN
CASE @tennb WHEN 1 THEN 'ten ' ELSE '' END
WHEN 1 THEN
CASE @tennb WHEN 1 THEN 'eleven ' ELSE 'one ' END
WHEN 2 THEN
CASE @tennb WHEN 1 THEN 'twelve ' ELSE 'two ' END
WHEN 3 THEN
CASE @tennb WHEN 1 THEN 'thirteen ' ELSE 'three ' END
WHEN 4 THEN
CASE @tennb WHEN 1 THEN 'fourteen ' ELSE 'four ' END
WHEN 5 THEN
CASE @tennb WHEN 1 THEN 'fifteen ' ELSE 'five ' END
WHEN 6 THEN
CASE @tennb WHEN 1 THEN 'sixteen ' ELSE 'six ' END
WHEN 7 THEN
CASE @tennb WHEN 1 THEN 'seventeen ' ELSE 'seven ' END
WHEN 8 THEN
CASE @tennb WHEN 1 THEN 'eighteen ' ELSE 'eight ' END
WHEN 9 THEN
CASE @tennb WHEN 1 THEN 'nineteen ' ELSE 'nine ' END
ELSE ''
END
SELECT @letters = @letters +
CASE @divisor
WHEN 1000000 THEN
CASE
WHEN @currentnumber = 1 THEN 'one million '
WHEN @currentnumber > 1 THEN @adding + 'millions '
END
WHEN 1000 THEN
@adding + 'thousand '
ELSE @adding
END
SELECT @remaining = @remaining - @currentnumber * @divisor
END
SELECT @divisor = @divisor / 1000
END
IF @letters '' SELECT @letters 'zero'
SELECT @terminaison = right( @letters, 4 )
IF @terminaison 'zero' select @letters 'nought'
ELSE IF @terminaison 'one' select @letters substr(@letters,1, length(@letters)-4) + 'first'
ELSE IF @terminaison 'two' select @letters substr(@letters,1, length(@letters)-4) + 'second'
ELSE IF @terminaison 'ree' select @letters substr(@letters,1, length(@letters)-4) + 'ird'
ELSE IF @terminaison 'ive' select @letters substr(@letters,1, length(@letters)-3) + 'fth'
ELSE IF @terminaison 'ght' select @letters substr(@letters,1, length(@letters)-1) + 'h'
ELSE IF @terminaison 'ine' select @letters substr(@letters,1, length(@letters)-2) + 'th'
ELSE IF @terminaison 'lve' select @letters substr(@letters,1, length(@letters)-3) + 'fth'
ELSE IF @terminaison like '%y ' select @letters = substr(@letters,1, length(@letters)-2) + 'ieth'
ELSE SELECT @letters = substr(@letters,1, length(@letters)-1) + 'th'
RETURN @letters
END

Merci beaucoup pour votre aide! AnneSo
wormlore Messages postés 3 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 24 juillet 2010
24 juil. 2010 à 21:58
Voilà, j'ai retouché le code pour prendre en compte les millions.
Mes quelques tests sont concluants, donc si ça ne fonctionne pas, merci de me donner un ou deux exemples de cas litigieux.
coollehavre Messages postés 1 Date d'inscription samedi 15 mars 2003 Statut Membre Dernière intervention 23 juillet 2010
23 juil. 2010 à 17:56
Bonjour,
j'ai essayé d'adapter votre code pour la gestion des millions mais ca ne fonctionne pas, pourriez vous m'aider ou nous donner le script ?

Merci
kolimbi Messages postés 1 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 21 décembre 2009
21 déc. 2009 à 11:18
Bonjour à tous, j'ai essayé d'adapter avec PL/SQL mais je vois toujours des erreurs quelqu'un pourra m'aider. Merci d'avance
gperuch Messages postés 40 Date d'inscription dimanche 18 janvier 2009 Statut Membre Dernière intervention 2 février 2012 1
30 avril 2009 à 17:08
Super,
J'ai fait le même programme à une époque sous qbasic et j'avais compris la difficulté et l'esprit tordu de nos académiciens de la langue française.
Je te donne huit car tu ne dépasse pas le million. quant à la virgule , j'estime que le dba peut faire preuve d'imagination :
select NombreEnLettres(95) + ' Euros et ' + NombreEnLettres (40) + ' centimes'
Merci pour cette prtit fonction.
wormlore Messages postés 3 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 24 juillet 2010
22 déc. 2008 à 14:01
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.
GURDOUS Messages postés 25 Date d'inscription mercredi 10 mars 2004 Statut Membre Dernière intervention 18 décembre 2008
18 déc. 2008 à 14:14
ç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
28 nov. 2008 à 07:43
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... :\
Searwn Messages postés 3 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 29 octobre 2008
29 oct. 2008 à 23:57
WHEN 9 THEN 'quatre-vingt dix'
SORRY
Searwn Messages postés 3 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 29 octobre 2008
29 oct. 2008 à 23:56
Merci petite correction

WHEN 9 THEN 'quatre-vingt ' >>

WHEN 9 THEN 'quatre-dix'
Rejoignez-nous