@@ -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" ))
179179fn 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
367380fn 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