Searwn
Messages postés3Date d'inscriptionmercredi 29 octobre 2008StatutMembreDernière intervention29 octobre 2008
-
29 oct. 2008 à 23:56
cs_anneso108
Messages postés1Date d'inscriptionmardi 8 mai 2012StatutMembreDerniè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.
cs_anneso108
Messages postés1Date d'inscriptionmardi 8 mai 2012StatutMembreDerniè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és3Date d'inscriptionvendredi 23 mai 2008StatutMembreDernière intervention24 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és1Date d'inscriptionsamedi 15 mars 2003StatutMembreDernière intervention23 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és1Date d'inscriptionjeudi 19 avril 2007StatutMembreDernière intervention21 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és40Date d'inscriptiondimanche 18 janvier 2009StatutMembreDernière intervention 2 février 20121 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és3Date d'inscriptionvendredi 23 mai 2008StatutMembreDernière intervention24 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és25Date d'inscriptionmercredi 10 mars 2004StatutMembreDernière intervention18 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és3Date d'inscriptionvendredi 23 mai 2008StatutMembreDernière intervention24 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és3Date d'inscriptionmercredi 29 octobre 2008StatutMembreDernière intervention29 octobre 2008 29 oct. 2008 à 23:57
WHEN 9 THEN 'quatre-vingt dix'
SORRY
Searwn
Messages postés3Date d'inscriptionmercredi 29 octobre 2008StatutMembreDernière intervention29 octobre 2008 29 oct. 2008 à 23:56
8 mai 2012 à 19:05
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
24 juil. 2010 à 21:58
Mes quelques tests sont concluants, donc si ça ne fonctionne pas, merci de me donner un ou deux exemples de cas litigieux.
23 juil. 2010 à 17:56
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
21 déc. 2009 à 11:18
30 avril 2009 à 17:08
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.
22 déc. 2008 à 14:01
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.
18 déc. 2008 à 14:14
Meric
28 nov. 2008 à 07:43
Ca vient du fait qu'on n'écrit pas "dix cinq" mais "quinze"...
Les spécificités de la langue française... :\
29 oct. 2008 à 23:57
SORRY
29 oct. 2008 à 23:56
WHEN 9 THEN 'quatre-vingt ' >>
WHEN 9 THEN 'quatre-dix'