29 lines
732 B
Python
29 lines
732 B
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime, timezone
|
|
from decimal import Decimal, ROUND_HALF_UP
|
|
from typing import Any
|
|
|
|
CREDIT_QUANT = Decimal("0.01")
|
|
|
|
|
|
def to_credit_decimal(value: Any) -> Decimal:
|
|
try:
|
|
return Decimal(str(value or 0)).quantize(CREDIT_QUANT, rounding=ROUND_HALF_UP)
|
|
except Exception as exc:
|
|
raise ValueError(f"无效积分数值: {value!r}") from exc
|
|
|
|
|
|
def to_float(value: Decimal | int | float | None) -> float:
|
|
return float(to_credit_decimal(value))
|
|
|
|
|
|
def utc_now() -> datetime:
|
|
return datetime.now(timezone.utc)
|
|
|
|
|
|
def ensure_aware(value: datetime) -> datetime:
|
|
if value.tzinfo is None:
|
|
return value.replace(tzinfo=timezone.utc)
|
|
return value
|