31 lines
880 B
Python
31 lines
880 B
Python
"""金额换算:禁止 float 参与元/分转换(避免 2.01 元变成 200 分)。"""
|
|
from decimal import Decimal, InvalidOperation, ROUND_HALF_UP
|
|
|
|
TWO_PLACES = Decimal('0.01')
|
|
ONE_FEN = Decimal('1')
|
|
|
|
|
|
def to_decimal(amount) -> Decimal:
|
|
if amount is None:
|
|
return Decimal('0')
|
|
if isinstance(amount, Decimal):
|
|
return amount
|
|
try:
|
|
return Decimal(str(amount))
|
|
except (InvalidOperation, ValueError, TypeError):
|
|
return Decimal('0')
|
|
|
|
|
|
def quantize_yuan(amount) -> Decimal:
|
|
return to_decimal(amount).quantize(TWO_PLACES, rounding=ROUND_HALF_UP)
|
|
|
|
|
|
def yuan_to_fen(amount) -> int:
|
|
"""人民币元 → 微信支付整数分(四舍五入到分)。"""
|
|
fen = quantize_yuan(amount) * 100
|
|
return int(fen.quantize(ONE_FEN, rounding=ROUND_HALF_UP))
|
|
|
|
|
|
def format_yuan(amount) -> str:
|
|
return f'{quantize_yuan(amount):.2f}'
|