fix(web): fix unit promotion in formatNumberAbbreviated (#27918)

Signed-off-by: NeatGuyCoding <15627489+NeatGuyCoding@users.noreply.github.com>
This commit is contained in:
NeatGuyCoding 2025-11-13 20:17:26 +08:00 committed by GitHub
parent 470883858e
commit a798534337
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 15 additions and 5 deletions

View File

@ -121,7 +121,7 @@ describe('formatNumberAbbreviated', () => {
expect(formatNumberAbbreviated(1000000)).toBe('1M')
expect(formatNumberAbbreviated(1500000)).toBe('1.5M')
expect(formatNumberAbbreviated(2300000)).toBe('2.3M')
expect(formatNumberAbbreviated(999999999)).toBe('1000M')
expect(formatNumberAbbreviated(999999999)).toBe('1B')
})
it('should format billions with B suffix', () => {
@ -145,7 +145,7 @@ describe('formatNumberAbbreviated', () => {
it('should handle edge cases', () => {
expect(formatNumberAbbreviated(950)).toBe('950')
expect(formatNumberAbbreviated(1001)).toBe('1k')
expect(formatNumberAbbreviated(999999)).toBe('1000k')
expect(formatNumberAbbreviated(999999)).toBe('1M')
})
})

View File

@ -130,10 +130,20 @@ export const formatNumberAbbreviated = (num: number) => {
for (let i = 0; i < units.length; i++) {
if (num >= units[i].value) {
const formatted = (num / units[i].value).toFixed(1)
const value = num / units[i].value
let rounded = Math.round(value * 10) / 10
let unitIndex = i
// If rounded value >= 1000, promote to next unit
if (rounded >= 1000 && i > 0) {
rounded = rounded / 1000
unitIndex = i - 1
}
const formatted = rounded.toFixed(1)
return formatted.endsWith('.0')
? `${Number.parseInt(formatted)}${units[i].symbol}`
: `${formatted}${units[i].symbol}`
? `${Number.parseInt(formatted)}${units[unitIndex].symbol}`
: `${formatted}${units[unitIndex].symbol}`
}
}
}