// ***************************************************************************
// *
// *   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"
    }
}
