Skip to content

Commit 203dafe

Browse files
committed
refactor: tweak digit counting
1 parent 79f322a commit 203dafe

File tree

1 file changed

+78
-32
lines changed

1 file changed

+78
-32
lines changed

builtin/to_string.mbt

Lines changed: 78 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -177,20 +177,33 @@ fn int_to_string_dec(
177177
/// Calculates the number of decimal digits in a u32 value
178178
#cfg(not(target="js"))
179179
fn dec_count32(value : UInt) -> Int {
180-
if value < 100000U {
181-
if value < 100U {
182-
1 + (if value >= 10U { 1 } else { 0 })
180+
// Binary search: split 1-10 digits into halves
181+
if value >= 100000U { // >= 10^5 means 6+ digits
182+
if value >= 10000000U { // >= 10^7 means 8+ digits
183+
if value >= 1000000000U { // >= 10^9 means 10 digits
184+
10
185+
} else if value >= 100000000U { // >= 10^8 means 9 digits
186+
9
187+
} else {
188+
8
189+
}
190+
} else if value >= 1000000U { // >= 10^6 means 7 digits
191+
7
183192
} else {
184-
3 +
185-
(if value >= 10000U { 1 } else { 0 }) +
186-
(if value >= 1000U { 1 } else { 0 })
193+
6
187194
}
188-
} else if value < 10000000U {
189-
6 + (if value >= 1000000U { 1 } else { 0 })
195+
} else if value >= 1000U { // >= 10^3 means 4+ digits
196+
if value >= 10000U { // >= 10^4 means 5 digits
197+
5
198+
} else {
199+
4
200+
}
201+
} else if value >= 100U { // >= 10^2 means 3 digits
202+
3
203+
} else if value >= 10U { // >= 10^1 means 2 digits
204+
2
190205
} else {
191-
8 +
192-
(if value >= 1000000000U { 1 } else { 0 }) +
193-
(if value >= 100000000U { 1 } else { 0 })
206+
1
194207
}
195208
}
196209

@@ -365,30 +378,63 @@ extern "js" fn uint_to_string_js(i : UInt, radix : Int) -> String =
365378
///|
366379
/// Calculates the number of decimal digits in a u64 value
367380
fn dec_count64(value : UInt64) -> Int {
368-
if value < 100000UL {
369-
if value < 100UL {
370-
1 + (if value >= 10UL { 1 } else { 0 })
381+
// Binary search: split 1-20 digits into halves
382+
if value >= 10000000000UL { // >= 10^10 means 11+ digits
383+
if value >= 100000000000000UL { // >= 10^14 means 15+ digits
384+
if value >= 10000000000000000UL { // >= 10^16 means 17+ digits
385+
if value >= 1000000000000000000UL { // >= 10^18 means 19+ digits
386+
if value >= 10000000000000000000UL { // >= 10^19 means 20 digits
387+
20
388+
} else {
389+
19
390+
}
391+
} else if value >= 100000000000000000UL { // >= 10^17 means 18 digits
392+
18
393+
} else {
394+
17
395+
}
396+
} else if value >= 1000000000000000UL { // >= 10^15 means 16 digits
397+
16
398+
} else {
399+
15
400+
}
401+
} else if value >= 1000000000000UL { // >= 10^12 means 13+ digits
402+
if value >= 10000000000000UL { // >= 10^13 means 14 digits
403+
14
404+
} else {
405+
13
406+
}
407+
} else if value >= 100000000000UL { // >= 10^11 means 12 digits
408+
12
409+
} else {
410+
11
411+
}
412+
} else if value >= 100000UL { // >= 10^5 means 6+ digits
413+
if value >= 10000000UL { // >= 10^7 means 8+ digits
414+
if value >= 1000000000UL { // >= 10^9 means 10 digits
415+
10
416+
} else if value >= 100000000UL { // >= 10^8 means 9 digits
417+
9
418+
} else {
419+
8
420+
}
421+
} else if value >= 1000000UL { // >= 10^6 means 7 digits
422+
7
423+
} else {
424+
6
425+
}
426+
} else if value >= 1000UL { // >= 10^3 means 4+ digits
427+
if value >= 10000UL { // >= 10^4 means 5 digits
428+
5
371429
} else {
372-
3 +
373-
(if value >= 10000UL { 1 } else { 0 }) +
374-
(if value >= 1000UL { 1 } else { 0 })
430+
4
375431
}
376-
} else if value < 10000000UL {
377-
6 + (if value >= 1000000UL { 1 } else { 0 })
378-
} else if value < 1000000000UL {
379-
8 + (if value >= 100000000UL { 1 } else { 0 })
380-
} else if value < 100000000000UL {
381-
10 + (if value >= 10000000000UL { 1 } else { 0 })
382-
} else if value < 10000000000000UL {
383-
12 + (if value >= 1000000000000UL { 1 } else { 0 })
384-
} else if value < 1000000000000000UL {
385-
14 + (if value >= 100000000000000UL { 1 } else { 0 })
386-
} else if value < 100000000000000000UL {
387-
16 + (if value >= 10000000000000000UL { 1 } else { 0 })
432+
} else if value >= 100UL { // >= 10^2 means 3 digits
433+
3
434+
} else if value >= 10UL { // >= 10^1 means 2 digits
435+
2
388436
} else {
389-
18 +
390-
(if value >= 10000000000000000000UL { 1 } else { 0 }) +
391-
(if value >= 1000000000000000000UL { 1 } else { 0 })
437+
1
392438
}
393439
}
394440

0 commit comments

Comments
 (0)