// *************************************************************************** // * // * Copyright (C) 2004, International Business Machines // * Corporation and others. All Rights Reserved. // * // *************************************************************************** // fr { //------------------------------------------------------------ // Rule Based Number Format Support //------------------------------------------------------------ // * Spellout rules for French. French adds some interesting quirks of its // * own: 1) The word "et" is interposed between the tens and ones digits, // * but only if the ones digit if 1: 20 is "vingt," and 2 is "vingt-deux," // * but 21 is "vingt-et-un." 2) There are no words for 70, 80, or 90. // * "quatre-vingts" ("four twenties") is used for 80, and values proceed // * by score from 60 to 99 (e.g., 73 is "soixante-treize" ["sixty-thirteen"]). // * Numbers from 1,100 to 1,199 are rendered as hundreds rather than // * thousands: 1,100 is "onze cents" ("eleven hundred"), rather than // * "mille cent" ("one thousand one hundred") SpelloutRules { // the main rule set "%main:\n" "-x: moins >>;\n" "x.x: << virgule >>;\n" // words for numbers from 0 to 10 "z\u00e9ro; un; deux; trois; quatre; cinq; six; sept; huit; neuf;\n" "dix; onze; douze; treize; quatorze; quinze; seize;\n" " dix-sept; dix-huit; dix-neuf;\n" // ords for the multiples of 10: %%alt-ones inserts "et" // when needed "20: vingt[->%%alt-ones>];\n" "30: trente[->%%alt-ones>];\n" "40: quarante[->%%alt-ones>];\n" "50: cinquante[->%%alt-ones>];\n" // rule for 60. The /20 causes this rule's multiplier to be // 20 rather than 10, allowinhg us to recurse for all values // from 60 to 79... "60/20: soixante[->%%alt-ones>];\n" // ...except for 71, which must be special-cased "71: soixante et onze;\n" // at 72, we have to repeat the rule for 60 to get us to 79 "72/20: soixante->%%alt-ones>;\n" // at 80, we state a new rule with the phrase for 80. Since // it changes form when there's a ones digit, we need a second // rule at 81. This rule also includes "/20," allowing it to // be used correctly for all values up to 99 "80: quatre-vingts; 81/20: quatre-vingt->>;\n" // "cent" becomes plural when preceded by a multiplier, and // the multiplier is omitted from the singular form "100: cent[ >>];\n" "200: << cents[ >>];\n" "1000: mille[ >>];\n" // values from 1,100 to 1,199 are rendered as "onze cents..." // instead of "mille cent..." The > after "1000" decreases // the rule's exponent, causing its multiplier to be 100 instead // of 1,000. This prevents us from getting "onze cents cent // vingt-deux" ("eleven hundred one hundred twenty-two"). "1100>: onze cents[ >>];\n" // at 1,200, we go back to formating in thousands, so we // repeat the rule for 1,000 "1200: mille >>;\n" // at 2,000, the multiplier is added "2000: << mille[ >>];\n" "1,000,000: << million[ >>];\n" "1,000,000,000: << milliard[ >>];\n" "1,000,000,000,000: << billion[ >>];\n" "1,000,000,000,000,000: =#,##0=;\n" // %%alt-ones is used to insert "et" when the ones digit is 1 "%%alt-ones:\n" "; et-un; =%main=;\n" "%%lenient-parse:\n" "&\u0000 << ' ' << ',' << '-';\n" } }