Negative remaining balances are shown in a warning treatment; nothing blocks going over budget. Applies the Tasks 18-23 design contract: --paper/--ink/--rule/--accent/ --surplus/--overspend tokens and the three type-role font variables in src/index.css, --font-money on every money figure, and the carry meter (a 3px hard-stopped gradient beneath each PostTable row) encoding carried-in surplus, allocation track, spend fill and overrun. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
21 lines
623 B
TypeScript
21 lines
623 B
TypeScript
import type { Currency } from "../domain/types.ts";
|
|
|
|
// Pinned locale: output must not vary between the user's machine and CI.
|
|
const NUMBER = new Intl.NumberFormat("en-GB", {
|
|
minimumFractionDigits: 2,
|
|
maximumFractionDigits: 2,
|
|
});
|
|
|
|
export function formatAmount(amount: number): string {
|
|
return NUMBER.format(amount);
|
|
}
|
|
|
|
export function formatMoney(amount: number, currency: Currency): string {
|
|
return `${formatAmount(amount)} ${currency}`;
|
|
}
|
|
|
|
export function formatSignedMoney(amount: number, currency: Currency): string {
|
|
const sign = amount > 0 ? "+" : "";
|
|
return `${sign}${formatMoney(amount, currency)}`;
|
|
}
|