Число прописью в java

Сегодня столкнулся с тем, что потребовалось превращать числа и даты в слова, например “срок действия – 15 ноября 2016” должно превратиться в “настоящая доверенность выдана сроком до пятнадцатого ноября две тысячи пятнадцатого года”, т.е. имеем дело с порядковыми числительными мужскогосреднего рода в родительном падеже. Для количественных числительных в именительном падеже задача видится тривиальной: нужно определить как писать степени тысяч (т.е. тысяча/тысячи/тысяч, миллион/миллиона/миллионов, миллиард/миллиарда/миллиардов) и числительные до тысячи (т.е. один-двадцать, тридцать-девяносто, сто-девятьсот), ну а потом делить числа и складывать строки. Для порядковых же числительных писанины прибавляется, потому что нужно или определять еще как писать сотый, тысячный, двухтысячный, миллионный и т.д или писать менее тривиальный код, поэтому закралось подозрение что кто-то такое уже реализовывал и не стоит изобретать велосипед, и да, действительно, в упоминавшейся ранее библиотеке ICU такая возможность есть:

RuleBasedNumberFormat format = new RuleBasedNumberFormat(new ULocale("ru"), RuleBasedNumberFormat.SPELLOUT);
for (String ruleSet : new String[] { "%spellout-cardinal-feminine-ablative",
        "%spellout-cardinal-feminine-accusative", "%spellout-cardinal-feminine-dative",
        "%spellout-cardinal-feminine-genitive", "%spellout-cardinal-feminine-locative",
        "%spellout-cardinal-feminine", "%spellout-cardinal-masculine-ablative",
        "%spellout-cardinal-masculine-accusative", "%spellout-cardinal-masculine-dative",
        "%spellout-cardinal-masculine-genitive", "%spellout-cardinal-masculine-locative",
        "%spellout-cardinal-masculine", "%spellout-cardinal-neuter-ablative",
        "%spellout-cardinal-neuter-accusative", "%spellout-cardinal-neuter-dative",
        "%spellout-cardinal-neuter-genitive", "%spellout-cardinal-neuter-locative", 
        "%spellout-cardinal-neuter", "%spellout-cardinal-plural-ablative", 
        "%spellout-cardinal-plural-accusative", "%spellout-cardinal-plural-dative", 
        "%spellout-cardinal-plural-genitive", "%spellout-cardinal-plural-locative", 
        "%spellout-cardinal-plural", "%spellout-numbering-year",
        "%spellout-numbering", "%spellout-ordinal-feminine-ablative", 
        "%spellout-ordinal-feminine-accusative", "%spellout-ordinal-feminine-dative",
        "%spellout-ordinal-feminine-genitive", "%spellout-ordinal-feminine-locative", 
        "%spellout-ordinal-feminine", "%spellout-ordinal-masculine-ablative", 
        "%spellout-ordinal-masculine-accusative", "%spellout-ordinal-masculine-dative", 
        "%spellout-ordinal-masculine-genitive", "%spellout-ordinal-masculine-locative", 
        "%spellout-ordinal-masculine", "%spellout-ordinal-neuter-ablative", 
        "%spellout-ordinal-neuter-accusative", "%spellout-ordinal-neuter-dative", 
        "%spellout-ordinal-neuter-genitive", "%spellout-ordinal-neuter-locative", 
        "%spellout-ordinal-neuter", "%spellout-ordinal-plural-ablative",
        "%spellout-ordinal-plural-accusative", "%spellout-ordinal-plural-dative",
        "%spellout-ordinal-plural-genitive", "%spellout-ordinal-plural-locative",
        "%spellout-ordinal-plural", }) {
    System.out.println(format.format(9999, ruleSet));
}
девятью тысячами девятьюстами девяноста девятью
девять тысяч девятьсот девяносто девять
девяти тысячам девятистам девяноста девяти
девяти тысяч девятисот девяноста девяти
девяти тысячах девятистах девяноста девяти
девять тысяч девятьсот девяносто девять
девятью тысячами девятьюстами девяноста девятью
девять тысяч девятьсот девяносто девять
девяти тысячам девятистам девяноста девяти
девяти тысяч девятисот девяноста девяти
девяти тысячах девятистах девяноста девяти
девять тысяч девятьсот девяносто девять
девятью тысячами девятьюстами девяноста девятью
девять тысяч девятьсот девяносто девять
девяти тысячам девятистам девяноста девяти
девяти тысяч девятисот девяноста девяти
девяти тысячах девятистах девяноста девяти
девять тысяч девятьсот девяносто девять
девятью тысячами девятьюстами девяноста девятью
девять тысяч девятьсот девяносто девять
девяти тысячам девятистам девяноста девяти
девяти тысяч девятисот девяноста девяти
девяти тысячах девятистах девяноста девяти
девять тысяч девятьсот девяносто девять
девять тысяч девятьсот девяносто девятого
девять тысяч девятьсот девяносто девять
девять тысяч девятьсот девяносто девятой
девять тысяч девятьсот девяносто девятую
девять тысяч девятьсот девяносто девятой
девять тысяч девятьсот девяносто девятой
девять тысяч девятьсот девяносто девятой
девять тысяч девятьсот девяносто девятая
девять тысяч девятьсот девяносто девятым
девять тысяч девятьсот девяносто девятый
девять тысяч девятьсот девяносто девятому
девять тысяч девятьсот девяносто девятого
девять тысяч девятьсот девяносто девятом
девять тысяч девятьсот девяносто девятый
девять тысяч девятьсот девяносто девятым
девять тысяч девятьсот девяносто девятое
девять тысяч девятьсот девяносто девятому
девять тысяч девятьсот девяносто девятого
девять тысяч девятьсот девяносто девятом
девять тысяч девятьсот девяносто девятое
девять тысяч девятьсот девяносто девятыми
девять тысяч девятьсот девяносто девятые
девять тысяч девятьсот девяносто девятым
девять тысяч девятьсот девяносто девятых
девять тысяч девятьсот девяносто девятых
девять тысяч девятьсот девяносто девятые

One thought on “Число прописью в java

  1. Pingback: Speak numbers in Java | Documentum in a (nuts)HELL

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s