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 class="loading-copy">loading....</div>
</div> </div>
</div> </div>
<script src="./host-list.js?v=20260428-2320" defer></script> <script src="./host-list.js?v=20260529-1300" defer></script>
</body> </body>
</html> </html>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -221,15 +221,19 @@
function formatPlainValue(value) { function formatPlainValue(value) {
if (value === null || value === undefined || value === "") return "0"; 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); return String(value);
} }
function formatTarget(value) { function formatTarget(value) {
const number = Number(value); const number = Number(value);
if (!Number.isFinite(number)) return formatPlainValue(value); if (!Number.isFinite(number)) return formatPlainValue(value);
if (number >= 1000000) return `${(number / 1000000).toFixed(1)}M`; return formatPlainValue(number);
if (number >= 1000) return `${(number / 1000).toFixed(1)}K`;
return String(number);
} }
function formatSalary(value, policyType) { function formatSalary(value, policyType) {

View File

@ -637,7 +637,12 @@
function formatCurrentSalary(value) { function formatCurrentSalary(value) {
const numericValue = Number(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"; return "0.00";
} }

View File

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

View File

@ -401,12 +401,22 @@
function formatMoney(value) { function formatMoney(value) {
const number = Number(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) { function formatPlainMoney(value) {
const number = Number(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) { function formatCount(value) {
@ -690,7 +700,7 @@
const days = document.createElement("div"); const days = document.createElement("div");
days.className = "bill-member-days"; days.className = "bill-member-days";
days.textContent = `${t("days")}: ${effectiveDay}`; days.textContent = `${t("days")}: ${formatCount(effectiveDay)}`;
side.appendChild(level); side.appendChild(level);
side.appendChild(gift); side.appendChild(gift);

View File

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

View File

@ -725,11 +725,11 @@
} }
function formatDays(days) { 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) { 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) { function formatDateTime(value) {

View File

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

View File

@ -637,7 +637,10 @@
function formatMoney(value) { function formatMoney(value) {
const number = Number(value); const number = Number(value);
if (!Number.isFinite(number)) return "0.00"; 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) { function pickCoinAmount(body) {
@ -659,7 +662,16 @@
function formatCoins(value) { function formatCoins(value) {
const number = Number(value); const number = Number(value);
if (!Number.isFinite(number)) return "0"; 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) { function normalizeRecordList(body) {
@ -1169,7 +1181,7 @@
coin.appendChild(shine); coin.appendChild(shine);
const content = document.createElement("span"); const content = document.createElement("span");
content.className = "package-content"; content.className = "package-content";
content.textContent = goods?.content || goods?.awardContent || "-"; content.textContent = formatCoinLabel(goods?.content ?? goods?.awardContent);
const price = document.createElement("span"); const price = document.createElement("span");
price.className = "package-price"; price.className = "package-price";
price.textContent = state.ordering && state.activeOrderKey === key price.textContent = state.ordering && state.activeOrderKey === key

View File

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

View File

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