feat: format hyapp numeric displays

This commit is contained in:
zhx 2026-05-29 21:06:32 +08:00
parent f265ccfa57
commit 7705a62a3a
20 changed files with 103 additions and 39 deletions

View File

@ -93,6 +93,6 @@
<div class="loading-copy">loading....</div>
</div>
</div>
<script src="./host-list.js?v=20260428-2320" defer></script>
<script src="./host-list.js?v=20260529-1300" defer></script>
</body>
</html>

View File

@ -412,8 +412,11 @@
function formatCountValue(value) {
if (value === null || value === undefined || value === "") return "-";
const number = Number(value);
if (Number.isFinite(number) && Number.isInteger(number)) return String(number);
if (Number.isFinite(number)) return String(Number(number.toFixed(2)));
if (Number.isFinite(number)) {
return new Intl.NumberFormat("en-US", {
maximumFractionDigits: 2
}).format(number);
}
return String(value);
}
@ -548,7 +551,7 @@
const totalNode = document.querySelector("#memberTotal");
if (!totalNode) return;
const number = Number(currentTotalMembers);
totalNode.textContent = Number.isFinite(number) ? String(Math.max(0, Math.trunc(number))) : "-";
totalNode.textContent = Number.isFinite(number) ? new Intl.NumberFormat("en-US").format(Math.max(0, Math.trunc(number))) : "-";
}
function renderSearchState() {

View File

@ -220,6 +220,6 @@
<div class="loading-copy">loading....</div>
</div>
</div>
<script src="./script.js?v=20260428-2345" defer></script>
<script src="./script.js?v=20260529-1300" defer></script>
</body>
</html>

View File

@ -377,7 +377,12 @@
function formatMoney(value) {
const number = Number(value);
return Number.isFinite(number) ? number.toFixed(2) : "0.00";
return Number.isFinite(number)
? new Intl.NumberFormat("en-US", {
minimumFractionDigits: 2,
maximumFractionDigits: 2
}).format(number)
: "0.00";
}
function pickCurrentSalary(body) {
@ -460,7 +465,7 @@
const number = Number(count);
if (Number.isFinite(number)) {
countNode.textContent = String(Math.max(0, Math.trunc(number)));
countNode.textContent = new Intl.NumberFormat("en-US").format(Math.max(0, Math.trunc(number)));
return;
}
@ -604,7 +609,7 @@
const numericValue = Number(value);
if (!Number.isFinite(numericValue)) return "0";
const safeValue = Math.max(0, numericValue);
return Number.isInteger(safeValue) ? String(safeValue) : String(Number(safeValue.toFixed(2)));
return formatCountValue(safeValue);
}
function pickFirstMemberWorkTarget(body) {
@ -626,8 +631,11 @@
function formatCountValue(value) {
if (value === null || value === undefined || value === "") return "-";
const number = Number(value);
if (Number.isFinite(number) && Number.isInteger(number)) return String(number);
if (Number.isFinite(number)) return String(Number(number.toFixed(2)));
if (Number.isFinite(number)) {
return new Intl.NumberFormat("en-US", {
maximumFractionDigits: 2
}).format(number);
}
return String(value);
}

View File

@ -116,6 +116,6 @@
<div class="toast" id="toast" role="status" aria-live="polite" hidden></div>
</div>
<script src="./script.js?v=20260512-1830" defer></script>
<script src="./script.js?v=20260529-1300" defer></script>
</body>
</html>

View File

@ -358,14 +358,20 @@
function formatMoney(value) {
const number = Number(value);
if (!Number.isFinite(number)) return "0.00";
return number.toFixed(2);
return new Intl.NumberFormat("en-US", {
minimumFractionDigits: 2,
maximumFractionDigits: 2
}).format(number);
}
function formatCount(value) {
if (value === null || value === undefined || value === "") return "0";
const number = Number(value);
if (Number.isFinite(number) && Number.isInteger(number)) return String(number);
if (Number.isFinite(number)) return String(Number(number.toFixed(2)));
if (Number.isFinite(number)) {
return new Intl.NumberFormat("en-US", {
maximumFractionDigits: 2
}).format(number);
}
return String(value);
}

View File

@ -168,6 +168,6 @@
<div class="toast" id="toast" role="status" aria-live="polite" hidden></div>
</div>
<script src="./script.js?v=20260507-1726" defer></script>
<script src="./script.js?v=20260529-1300" defer></script>
</body>
</html>

View File

@ -391,14 +391,20 @@
function formatMoney(value) {
const number = Number(value);
if (!Number.isFinite(number)) return "0.00";
return number.toFixed(2);
return new Intl.NumberFormat("en-US", {
minimumFractionDigits: 2,
maximumFractionDigits: 2
}).format(number);
}
function formatCount(value) {
if (value === null || value === undefined || value === "") return "0";
const number = Number(value);
if (Number.isFinite(number) && Number.isInteger(number)) return String(number);
if (Number.isFinite(number)) return String(Number(number.toFixed(2)));
if (Number.isFinite(number)) {
return new Intl.NumberFormat("en-US", {
maximumFractionDigits: 2
}).format(number);
}
return String(value);
}

View File

@ -188,6 +188,6 @@
<div class="loading-copy">loading....</div>
</div>
</div>
<script src="./script.js?v=20260529-1200" defer></script>
<script src="./script.js?v=20260529-1300" defer></script>
</body>
</html>

View File

@ -40,6 +40,6 @@
<div class="home-indicator" aria-hidden="true"></div>
</div>
<script src="./policy.js?v=20260428-2100" defer></script>
<script src="./policy.js?v=20260529-1300" defer></script>
</body>
</html>

View File

@ -221,15 +221,19 @@
function formatPlainValue(value) {
if (value === null || value === undefined || value === "") return "0";
const number = Number(value);
if (Number.isFinite(number)) {
return new Intl.NumberFormat("en-US", {
maximumFractionDigits: 2
}).format(number);
}
return String(value);
}
function formatTarget(value) {
const number = Number(value);
if (!Number.isFinite(number)) return formatPlainValue(value);
if (number >= 1000000) return `${(number / 1000000).toFixed(1)}M`;
if (number >= 1000) return `${(number / 1000).toFixed(1)}K`;
return String(number);
return formatPlainValue(number);
}
function formatSalary(value, policyType) {

View File

@ -637,7 +637,12 @@
function formatCurrentSalary(value) {
const numericValue = Number(value);
if (Number.isFinite(numericValue)) return numericValue.toFixed(2);
if (Number.isFinite(numericValue)) {
return new Intl.NumberFormat("en-US", {
minimumFractionDigits: 2,
maximumFractionDigits: 2
}).format(numericValue);
}
return "0.00";
}

View File

@ -130,6 +130,6 @@
<div class="loading-copy">loading....</div>
</div>
</div>
<script src="./script.js?v=20260428-2355" defer></script>
<script src="./script.js?v=20260529-1300" defer></script>
</body>
</html>

View File

@ -401,12 +401,22 @@
function formatMoney(value) {
const number = Number(value);
return Number.isFinite(number) ? `$${number.toFixed(2)}` : "$0.00";
return Number.isFinite(number)
? `$${new Intl.NumberFormat("en-US", {
minimumFractionDigits: 2,
maximumFractionDigits: 2
}).format(number)}`
: "$0.00";
}
function formatPlainMoney(value) {
const number = Number(value);
return Number.isFinite(number) ? number.toFixed(2) : "0.00";
return Number.isFinite(number)
? new Intl.NumberFormat("en-US", {
minimumFractionDigits: 2,
maximumFractionDigits: 2
}).format(number)
: "0.00";
}
function formatCount(value) {
@ -690,7 +700,7 @@
const days = document.createElement("div");
days.className = "bill-member-days";
days.textContent = `${t("days")}: ${effectiveDay}`;
days.textContent = `${t("days")}: ${formatCount(effectiveDay)}`;
side.appendChild(level);
side.appendChild(gift);

View File

@ -228,6 +228,6 @@
</div>
<div class="toast" id="toast" role="status" hidden></div>
</div>
<script src="./script.js?v=20260522-0101" defer></script>
<script src="./script.js?v=20260529-1300" defer></script>
</body>
</html>

View File

@ -725,11 +725,11 @@
}
function formatDays(days) {
return message("days", "{count} days").replace("{count}", String(days || 0));
return message("days", "{count} days").replace("{count}", new Intl.NumberFormat("en-US").format(Number(days) || 0));
}
function formatBDLeaderCount(count) {
return message("bd_leader_count", "{count} BD Leaders").replace("{count}", String(count || 0));
return message("bd_leader_count", "{count} BD Leaders").replace("{count}", new Intl.NumberFormat("en-US").format(Number(count) || 0));
}
function formatDateTime(value) {

View File

@ -238,6 +238,6 @@
<div class="toast" id="toast" role="status" aria-live="polite" hidden></div>
</div>
<script src="./script.js?v=20260519-0100" defer></script>
<script src="./script.js?v=20260529-1300" defer></script>
</body>
</html>

View File

@ -637,7 +637,10 @@
function formatMoney(value) {
const number = Number(value);
if (!Number.isFinite(number)) return "0.00";
return number.toFixed(2);
return new Intl.NumberFormat("en-US", {
minimumFractionDigits: 2,
maximumFractionDigits: 2
}).format(number);
}
function pickCoinAmount(body) {
@ -659,7 +662,16 @@
function formatCoins(value) {
const number = Number(value);
if (!Number.isFinite(number)) return "0";
return Number.isInteger(number) ? String(number) : String(Number(number.toFixed(2)));
return new Intl.NumberFormat("en-US", {
maximumFractionDigits: 2
}).format(number);
}
function formatCoinLabel(value) {
if (value === null || value === undefined || value === "") return "-";
const number = Number(value);
if (!Number.isFinite(number)) return String(value);
return formatCoins(number);
}
function normalizeRecordList(body) {
@ -1169,7 +1181,7 @@
coin.appendChild(shine);
const content = document.createElement("span");
content.className = "package-content";
content.textContent = goods?.content || goods?.awardContent || "-";
content.textContent = formatCoinLabel(goods?.content ?? goods?.awardContent);
const price = document.createElement("span");
price.className = "package-price";
price.textContent = state.ordering && state.activeOrderKey === key

View File

@ -165,6 +165,6 @@
</div>
<div class="home-indicator" aria-hidden="true"></div>
</div>
<script src="./script.js?v=20260529-0100" defer></script>
<script src="./script.js?v=20260529-1300" defer></script>
</body>
</html>

View File

@ -471,6 +471,16 @@
}
function formatMoney(value) {
const number = Number(value);
return Number.isFinite(number)
? new Intl.NumberFormat("en-US", {
minimumFractionDigits: 2,
maximumFractionDigits: 2
}).format(number)
: "0.00";
}
function formatMoneyInput(value) {
const number = Number(value);
return Number.isFinite(number) ? number.toFixed(2) : "0.00";
}
@ -635,7 +645,7 @@
if (balanceAmount) balanceAmount.textContent = formatMoney(availableBalance);
renderSalarySelector();
Object.values(inputs).forEach((input) => {
if (input) input.max = formatMoney(availableBalance);
if (input) input.max = formatMoneyInput(availableBalance);
});
updateSubmitState();
}
@ -1003,7 +1013,7 @@
const parts = raw.split(".");
let nextValue = parts.length > 2 ? `${parts[0]}.${parts.slice(1).join("")}` : raw;
const amount = Number(nextValue);
if (Number.isFinite(amount) && amount > availableBalance) nextValue = formatMoney(availableBalance);
if (Number.isFinite(amount) && amount > availableBalance) nextValue = formatMoneyInput(availableBalance);
input.value = nextValue;
updateSubmitState();
}
@ -1238,7 +1248,7 @@
});
document.querySelector(".text-action")?.addEventListener("click", () => {
if (inputs.withdraw) inputs.withdraw.value = formatMoney(availableBalance);
if (inputs.withdraw) inputs.withdraw.value = formatMoneyInput(availableBalance);
updateSubmitState();
});