from .banking_cheque_amount_words_types import ChequePenceStyle, ChequeWording from .money_amount import Money, money from .money_format import format_money from .text_number_to_words import amount_in_words #: The abbreviation written after pence as figures: 50p, 50c. _MINOR_SUFFIX = {"GBP": "p", "EUR": "c", "USD": "c"} def cheque_amount_words(amount: Money, pence_style: ChequePenceStyle) -> ChequeWording: """The amount lines of a cheque. The words come from text.number-to-words, capitalised and closed with "only" so nothing can be added after them; the figures come from money.format. """ if amount.minor <= 0: raise ValueError("a cheque amount must be greater than zero, received %d" % (amount.minor,)) if pence_style == "words": body = amount_in_words(amount) elif pence_style == "figures": # The pounds are always in words, even when there are none, so the # line never starts with a figure that could be altered. major, minor = divmod(amount.minor, 100) body = amount_in_words(money(major * 100, amount.currency)) if minor > 0: body += " and %d%s" % (minor, _MINOR_SUFFIX[amount.currency]) else: raise ValueError('unknown pence style "%s": expected words or figures' % (pence_style,)) words = body[0].upper() + body[1:] + " only" return ChequeWording(words=words, figures=format_money(amount))