// ***************************************************************************
// *
// *   Copyright (C) 2004, International Business Machines
// *   Corporation and others.  All Rights Reserved.
// *
// ***************************************************************************
// 

it {
    //------------------------------------------------------------
    // Rule Based Number Format Support
    //------------------------------------------------------------

//   * Spellout rules for Italian.  Like German, most Italian numbers are
//   * written as single words.  What makes these rules complicated is the rule
//   * that says that when a word ending in a vowel and a word beginning with
//   * a vowel are combined into a compound, the vowel is dropped from the
//   * end of the first word: 180 is "centottanta," not "centoottanta."
//   * The complexity of this rule set is to produce this behavior.

    // Can someone confirm that I did the vowel-eliding thing right?  I'm
    // not 100% sure I'm doing it in all the right places, or completely
    // correctly.  Also, I don't have information for negatives and decimals,
    // and I lack words fror values from 1,000,000 on up.

    SpelloutRules {
        // main rule set.  Follows the patterns of the preceding rule sets,
        // except that the final vowel is omitted from words ending in
        // vowels when they are followed by another word; instead, we have
        // separate rule sets that are identical to this one, except that
        // all the words that don't begin with a vowel have a vowel tacked
        // onto them at the front.  A word ending in a vowel calls a
        // substitution that will supply that vowel, unless that vowel is to
        // be elided.
        "%main:\n"
            "-x: meno >>;\n"
            "x.x: << virgola >>;\n"
            "zero; uno; due; tre; quattro; cinque; sei; sette; otto; nove;\n"
            "dieci; undici; dodici; tredici; quattordici; quindici; sedici;\n"
            "    diciasette; diciotto; diciannove;\n"
            "20: venti; vent>%%with-i>;\n"
            "30: trenta; trent>%%with-i>;\n"
            "40: quaranta; quarant>%%with-a>;\n"
            "50: cinquanta; cinquant>%%with-a>;\n"
            "60: sessanta; sessant>%%with-a>;\n"
            "70: settanta; settant>%%with-a>;\n"
            "80: ottanta; ottant>%%with-a>;\n"
            "90: novanta; novant>%%with-a>;\n"
            "100: cento; cent[>%%with-o>];\n"
            "200: <<cento; <<cent[>%%with-o>];\n"
            "1000: mille; mill[>%%with-i>];\n"
            "2000: <<mila; <<mil[>%%with-a>];\n"
            "100,000>>: <<mila[ >>];\n"
            "1,000,000: =#,##0= (incomplete data);\n"
        "%%with-a:\n"
            "azero; uno; adue; atre; aquattro; acinque; asei; asette; otto; anove;\n"
            "adieci; undici; adodici; atredici; aquattordici; aquindici; asedici;\n"
            "    adiciasette; adiciotto; adiciannove;\n"
            "20: aventi; avent>%%with-i>;\n"
            "30: atrenta; atrent>%%with-i>;\n"
            "40: aquaranta; aquarant>%%with-a>;\n"
            "50: acinquanta; acinquant>%%with-a>;\n"
            "60: asessanta; asessant>%%with-a>;\n"
            "70: asettanta; asettant>%%with-a>;\n"
            "80: ottanta; ottant>%%with-a>;\n"
            "90: anovanta; anovant>%%with-a>;\n"
            "100: acento; acent[>%%with-o>];\n"
            "200: <%%with-a<cento; <%%with-a<cent[>%%with-o>];\n"
            "1000: amille; amill[>%%with-i>];\n"
            "2000: <%%with-a<mila; <%%with-a<mil[>%%with-a>];\n"
            "100,000: =%main=;\n"
        "%%with-i:\n"
            "izero; uno; idue; itre; iquattro; icinque; isei; isette; otto; inove;\n"
            "idieci; undici; idodici; itredici; iquattordici; iquindici; isedici;\n"
            "    idiciasette; idiciotto; idiciannove;\n"
            "20: iventi; ivent>%%with-i>;\n"
            "30: itrenta; itrent>%%with-i>;\n"
            "40: iquaranta; iquarant>%%with-a>;\n"
            "50: icinquanta; icinquant>%%with-a>;\n"
            "60: isessanta; isessant>%%with-a>;\n"
            "70: isettanta; isettant>%%with-a>;\n"
            "80: ottanta; ottant>%%with-a>;\n"
            "90: inovanta; inovant>%%with-a>;\n"
            "100: icento; icent[>%%with-o>];\n"
            "200: <%%with-i<cento; <%%with-i<cent[>%%with-o>];\n"
            "1000: imille; imill[>%%with-i>];\n"
            "2000: <%%with-i<mila; <%%with-i<mil[>%%with-a>];\n"
            "100,000: =%main=;\n"
        "%%with-o:\n"
            "ozero; uno; odue; otre; oquattro; ocinque; osei; osette; otto; onove;\n"
            "odieci; undici; ododici; otredici; oquattordici; oquindici; osedici;\n"
            "    odiciasette; odiciotto; odiciannove;\n"
            "20: oventi; ovent>%%with-i>;\n"
            "30: otrenta; otrent>%%with-i>;\n"
            "40: oquaranta; oquarant>%%with-a>;\n"
            "50: ocinquanta; ocinquant>%%with-a>;\n"
            "60: osessanta; osessant>%%with-a>;\n"
            "70: osettanta; osettant>%%with-a>;\n"
            "80: ottanta; ottant>%%with-a>;\n"
            "90: onovanta; onovant>%%with-a>;\n"
            "100: ocento; ocent[>%%with-o>];\n"
            "200: <%%with-o<cento; <%%with-o<cent[>%%with-o>];\n"
            "1000: omille; omill[>%%with-i>];\n"
            "2000: <%%with-o<mila; <%%with-o<mil[>%%with-a>];\n"
            "100,000: =%main=;\n" 
    }

}
