/*
 *******************************************************************************
 * Copyright (C) 1996-2000, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/text/resources/Attic/NumberFormatRules_fr.java,v $ 
 * $Date: 2000/03/10 04:07:28 $ 
 * $Revision: 1.2 $
 *
 *****************************************************************************************
 */

package com.ibm.text.resources;

import java.util.ListResourceBundle;

/**
 * Default RuleBasedNumberFormat data for French
 *
 * @author Richard Gillam
 * @version $Version$ $Date: 2000/03/10 04:07:28 $
 */
public class NumberFormatRules_fr extends ListResourceBundle {
    /**
     * Puts a copyright in the .class file
     */
    private static final String copyrightNotice
        = "Copyright \u00a91997-1998 IBM Corp.  All rights reserved.";

    public Object[][] getContents() {
        return contents;
    }

    Object[][] contents = {
        /**
         * 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: << milliarde[ >>];\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=;" }
    };
}
