fix(reports): format localized income totals
This commit is contained in:
@@ -37,9 +37,38 @@ const toPersianDigits = (value: string) =>
|
|||||||
|
|
||||||
const localizeDigits = (value: string, lang: "en" | "fa") => (lang === "fa" ? toPersianDigits(value) : value);
|
const localizeDigits = (value: string, lang: "en" | "fa") => (lang === "fa" ? toPersianDigits(value) : value);
|
||||||
|
|
||||||
|
const formatAmount = (value: string, lang: "en" | "fa") => {
|
||||||
|
const trimmed = value.trim();
|
||||||
|
if (!trimmed) return trimmed;
|
||||||
|
const numeric = Number(trimmed.replace(/,/g, ""));
|
||||||
|
if (Number.isNaN(numeric)) return localizeDigits(trimmed, lang);
|
||||||
|
|
||||||
|
const [integerPart, fractionalPart] = trimmed.replace(/,/g, "").split(".");
|
||||||
|
const grouped = Math.abs(Number(integerPart)).toLocaleString("en-US");
|
||||||
|
const signed = trimmed.startsWith("-") ? `-${grouped}` : grouped;
|
||||||
|
const normalized = fractionalPart ? `${signed}.${fractionalPart}` : signed;
|
||||||
|
return localizeDigits(normalized, lang);
|
||||||
|
};
|
||||||
|
|
||||||
|
const currencyLabel = (currency: string, lang: "en" | "fa") => {
|
||||||
|
const normalized = currency.toUpperCase();
|
||||||
|
if (lang !== "fa") return normalized;
|
||||||
|
return (
|
||||||
|
{
|
||||||
|
USD: "دلار آمریکا",
|
||||||
|
EUR: "یورو",
|
||||||
|
GBP: "پوند",
|
||||||
|
IRR: "ریال",
|
||||||
|
IRT: "تومان",
|
||||||
|
AED: "درهم",
|
||||||
|
TRY: "لیر",
|
||||||
|
}[normalized] || normalized
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const formatMoneyTotals = (totals: CurrencyTotal[], lang: "en" | "fa") => {
|
const formatMoneyTotals = (totals: CurrencyTotal[], lang: "en" | "fa") => {
|
||||||
if (!totals.length) return "-";
|
if (!totals.length) return "-";
|
||||||
return totals.map((item) => `${localizeDigits(item.amount, lang)} ${item.currency}`).join(" | ");
|
return totals.map((item) => `${formatAmount(item.amount, lang)} ${currencyLabel(item.currency, lang)}`).join(" | ");
|
||||||
};
|
};
|
||||||
|
|
||||||
const formatSecondsTick = (value: number, lang: "en" | "fa") => {
|
const formatSecondsTick = (value: number, lang: "en" | "fa") => {
|
||||||
|
|||||||
@@ -9,9 +9,38 @@ const toPersianDigits = (value: string) =>
|
|||||||
|
|
||||||
const localizeDigits = (value: string, lang: "en" | "fa") => (lang === "fa" ? toPersianDigits(value) : value);
|
const localizeDigits = (value: string, lang: "en" | "fa") => (lang === "fa" ? toPersianDigits(value) : value);
|
||||||
|
|
||||||
|
const formatAmount = (value: string, lang: "en" | "fa") => {
|
||||||
|
const trimmed = value.trim();
|
||||||
|
if (!trimmed) return trimmed;
|
||||||
|
const numeric = Number(trimmed.replace(/,/g, ""));
|
||||||
|
if (Number.isNaN(numeric)) return localizeDigits(trimmed, lang);
|
||||||
|
|
||||||
|
const [integerPart, fractionalPart] = trimmed.replace(/,/g, "").split(".");
|
||||||
|
const grouped = Math.abs(Number(integerPart)).toLocaleString("en-US");
|
||||||
|
const signed = trimmed.startsWith("-") ? `-${grouped}` : grouped;
|
||||||
|
const normalized = fractionalPart ? `${signed}.${fractionalPart}` : signed;
|
||||||
|
return localizeDigits(normalized, lang);
|
||||||
|
};
|
||||||
|
|
||||||
|
const currencyLabel = (currency: string, lang: "en" | "fa") => {
|
||||||
|
const normalized = currency.toUpperCase();
|
||||||
|
if (lang !== "fa") return normalized;
|
||||||
|
return (
|
||||||
|
{
|
||||||
|
USD: "دلار آمریکا",
|
||||||
|
EUR: "یورو",
|
||||||
|
GBP: "پوند",
|
||||||
|
IRR: "ریال",
|
||||||
|
IRT: "تومان",
|
||||||
|
AED: "درهم",
|
||||||
|
TRY: "لیر",
|
||||||
|
}[normalized] || normalized
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const formatMoneyTotals = (totals: { currency: string; amount: string }[], lang: "en" | "fa") => {
|
const formatMoneyTotals = (totals: { currency: string; amount: string }[], lang: "en" | "fa") => {
|
||||||
if (!totals.length) return "-";
|
if (!totals.length) return "-";
|
||||||
return totals.map((item) => `${localizeDigits(item.amount, lang)} ${item.currency}`).join(" | ");
|
return totals.map((item) => `${formatAmount(item.amount, lang)} ${currencyLabel(item.currency, lang)}`).join(" | ");
|
||||||
};
|
};
|
||||||
|
|
||||||
const formatDisplayDate = (value: string, lang: "en" | "fa") => {
|
const formatDisplayDate = (value: string, lang: "en" | "fa") => {
|
||||||
|
|||||||
Reference in New Issue
Block a user