Here’s an algorithm (in pseudo-code) for spelling out numbers in French words (e.g. convert 123
to "cent vingt-trois"
):
-- spell out an integer number in words (French)
function numberToWordsFrench(number)
var result, iteration, iterationText, hundreds, hundredsText
if number = 0
return "zero"
end
result ← ""
iteration ← 1
-- iterate per 3 digits (starting with last)
while number > 0
hundreds ← number modulo 1000 -- e.g. 23456 → 456
number ← floor(number / 1000) -- e.g. 23456 → 23
if hundreds > 0
-- 3 digits to text
hundredsText ← getHundredsText(hundreds)
if iteration > 1
-- mille, million, …
iterationText ← getIterationText(iteration)
hundredsText ← hundredsText + iterationText
if hundredsText = "un mille "
hundredsText ← " mille "
end
end
result ← hundredsText + result
end
iteration ← iteration + 1
end
return trim(result)
end
function getHundredsText(number)
var result, hundreds, tens
result ← ""
hundreds ← floor(number / 100) -- e.g. 456 → 4
if hundreds > 0
number ← number modulo 100 -- e.g. 456 → 56
if hundreds > 1
-- deux cents, trois cents, …
result ← result + getLessThanTwentyText(hundreds) + " cents"
else
result ← result + "cent"
end
end
if number > 0
if hundreds > 0
-- space after "cent(s)"
result ← result + " "
end
if number < 20
-- < 20 ⇒ look up
result ← result + getLessThanTwentyText(number)
else
tens ← floor(number / 10) -- e.g. 42 → 4
number ← number modulo 10 -- e.g. 42 → 2
case tens
when 7
-- soixante dix, soixante onze, …
result ← result + "soixante"
number ← number + 10
when 8
if number > 0
result ← result + "quatre-vingt"
else
result ← result + "quatre-vingts"
end
when 9
-- quatre-vingt dix, quatre-vingt onze, …
result ← result + "quatre-vingt"
number ← number + 10
otherwise
-- vingt, trente, quarante, …
result ← result + getTensText(tens)
end
if number > 0
if number = 1 and tens ≠ 8
result ← result + " et un"
else
result ← result + "-" + getLessThanTwentyText(number)
end
end
end
end
return result
end
function getLessThanTwentyText(number)
case number
when 1 return "un"
when 2 return "deux"
when 3 return "trois"
when 4 return "quatre"
when 5 return "cinq"
when 6 return "six"
when 7 return "sept"
when 8 return "huit"
when 9 return "neuf"
when 10 return "dix"
when 11 return "onze"
when 12 return "douze"
when 13 return "treize"
when 14 return "quatorze"
when 15 return "quinze"
when 16 return "seize"
when 17 return "dix-sept"
when 18 return "dix-huit"
when 19 return "dix-neuf"
otherwise error
end
end
function getTensText(tens)
case tens
when 2 return "vingt"
when 3 return "trente"
when 4 return "quarante"
when 5 return "cinquante"
when 6 return "soixante"
otherwise error
end
end
function getIterationText(iteration)
case iteration
when 1 return ""
when 2 return " mille "
when 3 return " million "
when 4 return " milliard "
when 5 return " billion "
when 6 return " billiard "
when 7 return " trillion "
when 8 return " trilliard "
otherwise return " ??? "
end
end