#[cfg(not(feature = "std"))]
use alloc::string::String;
pub(crate) const ZERO: &str = "ноль";
pub(crate) const MINUS: &str = "минус";
pub(crate) const WHOLE_FORMS: (&str, &str, &str) = ("целая", "целых", "целых");
pub(crate) const ZERO_ORDINAL: [&str; 3] = ["нулевой", "нулевая", "нулевое"];
pub(crate) const ONES: [[&str; 3]; 9] = [
["один", "одна", "одно"],
["два", "две", "два"],
["три", "три", "три"],
["четыре", "четыре", "четыре"],
["пять", "пять", "пять"],
["шесть", "шесть", "шесть"],
["семь", "семь", "семь"],
["восемь", "восемь", "восемь"],
["девять", "девять", "девять"],
];
pub(crate) const TENS: [&str; 10] = [
"",
"десять",
"двадцать",
"тридцать",
"сорок",
"пятьдесят",
"шестьдесят",
"семьдесят",
"восемьдесят",
"девяносто",
];
pub(crate) const TEENS: [&str; 10] = [
"десять",
"одиннадцать",
"двенадцать",
"тринадцать",
"четырнадцать",
"пятнадцать",
"шестнадцать",
"семнадцать",
"восемнадцать",
"девятнадцать",
];
pub(crate) const HUNDREDS: [&str; 9] = [
"сто",
"двести",
"триста",
"четыреста",
"пятьсот",
"шестьсот",
"семьсот",
"восемьсот",
"девятьсот",
];
pub(crate) const ORDERS: [[&str; 3]; 14] = [
["", "", ""],
["тысяча", "тысячи", "тысяч"],
["миллион", "миллиона", "миллионов"],
["миллиард", "миллиарда", "миллиардов"],
["триллион", "триллиона", "триллионов"],
["квадриллион", "квадриллиона", "квадриллионов"],
["квинтиллион", "квинтиллиона", "квинтиллионов"],
["секстиллион", "секстиллиона", "секстиллионов"],
["септиллион", "септиллиона", "септиллионов"],
["октиллион", "октиллиона", "октиллионов"],
["нониллион", "нониллиона", "нониллионов"],
["дециллион", "дециллиона", "дециллионов"],
["ундециллион", "ундециллиона", "ундециллионов"],
["дуодециллион", "дуодециллиона", "дуодециллионов"],
];
pub(crate) const ORDINAL_ONES: [[&str; 3]; 9] = [
["первый", "первая", "первое"],
["второй", "вторая", "второе"],
["третий", "третья", "третье"],
["четвёртый", "четвёртая", "четвёртое"],
["пятый", "пятая", "пятое"],
["шестой", "шестая", "шестое"],
["седьмой", "седьмая", "седьмое"],
["восьмой", "восьмая", "восьмое"],
["девятый", "девятая", "девятое"],
];
pub(crate) const ORDINAL_TEENS: [[&str; 3]; 10] = [
["десятый", "десятая", "десятое"],
["одиннадцатый", "одиннадцатая", "одиннадцатое"],
["двенадцатый", "двенадцатая", "двенадцатое"],
["тринадцатый", "тринадцатая", "тринадцатое"],
["четырнадцатый", "четырнадцатая", "четырнадцатое"],
["пятнадцатый", "пятнадцатая", "пятнадцатое"],
["шестнадцатый", "шестнадцатая", "шестнадцатое"],
["семнадцатый", "семнадцатая", "семнадцатое"],
["восемнадцатый", "восемнадцатая", "восемнадцатое"],
["девятнадцатый", "девятнадцатая", "девятнадцатое"],
];
pub(crate) const ORDINAL_TENS: [[&str; 3]; 8] = [
["двадцатый", "двадцатая", "двадцатое"],
["тридцатый", "тридцатая", "тридцатое"],
["сороковой", "сороковая", "сороковое"],
["пятидесятый", "пятидесятая", "пятидесятое"],
["шестидесятый", "шестидесятая", "шестидесятое"],
["семидесятый", "семидесятая", "семидесятое"],
["восьмидесятый", "восьмидесятая", "восьмидесятое"],
["девяностый", "девяностая", "девяностое"],
];
pub(crate) const ORDINAL_HUNDREDS: [[&str; 3]; 9] = [
["сотый", "сотая", "сотое"],
["двухсотый", "двухсотая", "двухсотое"],
["трёхсотый", "трёхсотая", "трёхсотое"],
["четырёхсотый", "четырёхсотая", "четырёхсотое"],
["пятисотый", "пятисотая", "пятисотое"],
["шестисотый", "шестисотая", "шестисотое"],
["семисотый", "семисотая", "семисотое"],
["восьмисотый", "восьмисотая", "восьмисотое"],
["девятисотый", "девятисотая", "девятисотое"],
];
pub(crate) const ORDINAL_ORDERS: [[&str; 3]; 14] = [
["", "", ""],
["тысячный", "тысячная", "тысячное"],
["миллионный", "миллионная", "миллионное"],
["миллиардный", "миллиардная", "миллиардное"],
["триллионный", "триллионная", "триллионное"],
["квадриллионный", "квадриллионная", "квадриллионное"],
["квинтиллионный", "квинтиллионная", "квинтиллионное"],
["секстиллионный", "секстиллионная", "секстиллионное"],
["септиллионный", "септиллионная", "септиллионное"],
["октиллионный", "октиллионная", "октиллионное"],
["нониллионный", "нониллионная", "нониллионное"],
["дециллионный", "дециллионная", "дециллионное"],
["ундециллионный", "ундециллионная", "ундециллионное"],
["дуодециллионный", "дуодециллионная", "дуодециллионное"],
];
pub(crate) const ONES_COMPOUND: [&str; 9] = [
"",
"двух",
"трёх",
"четырёх",
"пяти",
"шести",
"семи",
"восьми",
"девяти",
];
pub(crate) const TEENS_COMPOUND: [&str; 10] = [
"десяти",
"одиннадцати",
"двенадцати",
"тринадцати",
"четырнадцати",
"пятнадцати",
"шестнадцати",
"семнадцати",
"восемнадцати",
"девятнадцати",
];
pub(crate) const TENS_COMPOUND: [&str; 8] = [
"двадцати",
"тридцати",
"сорока",
"пятидесяти",
"шестидесяти",
"семидесяти",
"восьмидесяти",
"девяносто",
];
pub(crate) const HUNDREDS_COMPOUND: [&str; 9] = [
"сто",
"двухсот",
"трёхсот",
"четырёхсот",
"пятисот",
"шестисот",
"семисот",
"восьмисот",
"девятисот",
];
pub(crate) const ORDINAL_ONES_GEN_M: [&str; 9] = [
"первого",
"второго",
"третьего",
"четвёртого",
"пятого",
"шестого",
"седьмого",
"восьмого",
"девятого",
];
pub(crate) const ORDINAL_TEENS_GEN_M: [&str; 10] = [
"десятого",
"одиннадцатого",
"двенадцатого",
"тринадцатого",
"четырнадцатого",
"пятнадцатого",
"шестнадцатого",
"семнадцатого",
"восемнадцатого",
"девятнадцатого",
];
pub(crate) const ORDINAL_TENS_GEN_M: [&str; 8] = [
"двадцатого",
"тридцатого",
"сорокового",
"пятидесятого",
"шестидесятого",
"семидесятого",
"восьмидесятого",
"девяностого",
];
pub(crate) const ORDINAL_HUNDREDS_GEN_M: [&str; 9] = [
"сотого",
"двухсотого",
"трёхсотого",
"четырёхсотого",
"пятисотого",
"шестисотого",
"семисотого",
"восьмисотого",
"девятисотого",
];
pub(crate) const ORDINAL_ORDERS_GEN_M: [&str; 14] = [
"",
"тысячного",
"миллионного",
"миллиардного",
"триллионного",
"квадриллионного",
"квинтиллионного",
"секстиллионного",
"септиллионного",
"октиллионного",
"нониллионного",
"дециллионного",
"ундециллионного",
"дуодециллионного",
];
pub(crate) const MONTHS_GENITIVE: [&str; 12] = [
"января",
"февраля",
"марта",
"апреля",
"мая",
"июня",
"июля",
"августа",
"сентября",
"октября",
"ноября",
"декабря",
];
pub(crate) const MONTHS_NOMINATIVE: [&str; 12] = [
"январь",
"февраль",
"март",
"апрель",
"май",
"июнь",
"июль",
"август",
"сентябрь",
"октябрь",
"ноябрь",
"декабрь",
];
pub(crate) const FRACTION_UNITS: [[&str; 3]; 9] = [
["десятая", "десятых", "десятых"],
["сотая", "сотых", "сотых"],
["тысячная", "тысячных", "тысячных"],
["десятитысячная", "десятитысячных", "десятитысячных"],
["стотысячная", "стотысячных", "стотысячных"],
["миллионная", "миллионных", "миллионных"],
["десятимиллионная", "десятимиллионных", "десятимиллионных"],
["стомиллионная", "стомиллионных", "стомиллионных"],
["миллиардная", "миллиардных", "миллиардных"],
];
pub(crate) fn compound_prefix(n: u64) -> Option<String> {
if n == 0 || n > 999 {
return None;
}
let h = (n / 100) as usize;
let rest = (n % 100) as usize;
let t = rest / 10;
let o = rest % 10;
let mut prefix = String::new();
if h > 0 {
prefix.push_str(HUNDREDS_COMPOUND[h - 1]);
}
if rest == 0 {
} else if (10..=19).contains(&rest) {
prefix.push_str(TEENS_COMPOUND[rest - 10]);
} else {
if t >= 2 {
prefix.push_str(TENS_COMPOUND[t - 2]);
}
if o > 0 {
prefix.push_str(ONES_COMPOUND[o - 1]);
}
}
Some(prefix)
}