def _get_plural_legacy(amount, extra_variants): """ Get proper case with value (legacy variant, without absence) @param amount: amount of objects @type amount: C{int} or C{long} @param variants: variants (forms) of object in such form: (1 object, 2 objects, 5 objects, 0-object variant). 0-object variant is similar to C{absence} in C{get_plural} @type variants: 3-element C{sequence} of C{unicode} or C{unicode} (three variants with delimeter ',') @return: amount with proper variant @rtype: C{unicode} """ absence = None if isinstance(extra_variants, unicode): extra_variants = utils.split_values(extra_variants) if len(extra_variants) == 4: variants = extra_variants[:3] absence = extra_variants[3] else: variants = extra_variants return get_plural(amount, variants, absence)
def choose_plural(amount, variants): """ Choose proper case depending on amount @param amount: amount of objects @type amount: C{int} or C{long} @param variants: variants (forms) of object in such form: (1 object, 2 objects, 5 objects). @type variants: 3-element C{sequence} of C{unicode} or C{unicode} (three variants with delimeter ',') @return: proper variant @rtype: C{unicode} @raise L{uktils.err.InputParameterError}: input parameters' check failed (amount isn't C{int}, variants isn't C{sequence}) @raise ValueError: amount is negative @raise ValueError: variants' length lesser than 3 """ if isinstance(variants, unicode): variants = utils.split_values(variants) check_length(variants, 3) check_positive(amount) if amount % 10 == 1 and amount % 100 != 11: variant = 0 elif amount % 10 >= 2 and amount % 10 <= 4 and (amount % 100 < 10 or amount % 100 >= 20): variant = 1 else: variant = 2 return variants[variant]
def sum_string(amount, gender, items=None): """ Get sum in words @param amount: amount of objects @type amount: C{int} or C{long} @param gender: gender of object (MALE, FEMALE or NEUTER) @type gender: C{int} @param items: variants of object in three forms: for one object, for two objects and for five objects @type items: 3-element C{sequence} of C{unicode} or just C{unicode} (three variants with delimeter ',') @return: in-words representation objects' amount @rtype: C{unicode} @raise L{uktils.err.InputParameterError}: input parameters' check failed @raise ValueError: items isn't 3-element C{sequence} or C{unicode} @raise ValueError: amount bigger than 10**11 @raise ValueError: amount is negative """ if isinstance(items, unicode): items = utils.split_values(items) if items is None: items = (u"", u"", u"") try: one_item, two_items, five_items = items except ValueError: raise ValueError("Items must be 3-element sequence") check_positive(amount) if amount == 0: return u"нуль %s" % five_items into = u"" tmp_val = amount # единицы into, tmp_val = _sum_string_fn(into, tmp_val, gender, items) # тысячи into, tmp_val = _sum_string_fn(into, tmp_val, FEMALE, (u"тисяча", u"тисячі", u"тисяч")) # миллионы into, tmp_val = _sum_string_fn(into, tmp_val, MALE, (u"мільйон", u"мільйона", u"мільйонів")) # миллиарды into, tmp_val = _sum_string_fn(into, tmp_val, MALE, (u"мільйард", u"мільйарда", u"мільйардів")) if tmp_val == 0: return into else: raise ValueError("Cannot operand with numbers bigger than 10**11")