(* ===================================================== *)
(*      Apprentissage de la programmation avec OCaml     *)
(*      Catherine Dubois & Valérie Ménissier-Morain      *)
(*                Éditions Hermès Sciences               *)
(*                        Mars 2004                      *)
(* ===================================================== *)
(* Fichier MLSRC/nombre_en_lettres.ml                    *)
(* ===================================================== *)

let unité n = n mod 10;;

let dizaine n = (n / 10) mod 10;;

let centaine n = (n / 100) mod 10;;

let millier n = n / 1000;;

let espace = " " and tiret = "-" and vide ="";;

let chiffre n =
  if n = 0 then vide else
    if
 n = 1 then "un" else
      if
 n = 2 then "deux" else
        if
 n = 3 then "trois" else
          if
 n = 4 then "quatre" else
            if
 n = 5 then "cinq" else
              if
 n = 6 then "six" else
                if
 n = 7 then "sept" else
                  if
 n = 8 then "huit" else
                    if
 n = 9 then "neuf"
                    else
 failwith "chiffre : paramètre incorrect";;

let écrire_millier m  =
  if m = 0 then vide
  else if m = 1 then "mille"
  else
 (chiffre m) ^ espace ^ "mille";;

let écrire_centaine c avec_s  =
  if c = 0 then vide else
    if
 c = 1 then "cent" else
      if
 avec_s then (chiffre c) ^ espace ^ "cents"
      else (chiffre c) ^ espace ^ "cent";;

let écrire_1_etc u  =
  if u = 0 then "dix" else
    if
 u = 1 then "onze" else
      if
 u = 2 then "douze" else
        if
 u = 3 then "treize" else
          if
 u = 4 then "quatorze" else
            if
 u = 5 then "quinze" else
              if
 u = 6 then "seize" else "dix-" ^ (chiffre u);;

let écrire_dizaine d  =
  if d = 1 then "dix" else
    if
 d = 2 then "vingt" else
      if
 d = 3 then "trente" else
        if
 d = 4 then "quarante" else
          if
 d = 5 then "cinquante" else
            if
 d = 6 || d = 7 then "soixante" else
              if
 d = 8 || d = 9 then "quatre-vingt"
              else
 failwith "écrire_dizaine : paramètre incorrect";;

let écrire_dizaine_unité d u  =
  if d = 0 then chiffre u else
    if
 d = 1 then écrire_1_etc u else
      (écrire_dizaine d) ^
      (if d = 9 then tiret ^ (écrire_1_etc u) else
         if
 d = 7 then (if u = 1 then " et onze" else tiret ^ (écrire_1_etc u))
         else if u = 0 then (if d = 8 then "s" else vide)
         else if u = 1 then (if d = 8 then "-un" else " et un")
         else tiret ^ (chiffre u));;

let en_lettres n =
  if n < 1 || n > 9999 then failwith "en_lettres"
  else
    let m = millier n
    and c = centaine n
    and d = dizaine n
    and u = unité n in
    (écrire_millier m) ^ (if c > 0 then espace else vide) ^
    (écrire_centaine c (c > 1 && d = 0 && u = 0)) ^ (if d > 0 || u > 0 then espace else vide) ^
    (écrire_dizaine_unité d u);;

Ce document a été traduit de LATEX par HEVEA.