@@ -468,28 +468,45 @@ void Row_printRate(RichString* str, double rate, bool coloring) {
468468 }
469469
470470 if (!isNonnegative (rate )) {
471- RichString_appendAscii (str , shadowColor , " N/A " );
472- } else if (rate < 0.005 ) {
473- int len = snprintf (buffer , sizeof (buffer ), "%7.2f B/s " , rate );
474- RichString_appendnAscii (str , shadowColor , buffer , len );
471+ RichString_appendAscii (str , shadowColor , " N/A " );
475472 } else if (rate < ONE_K ) {
476- int len = snprintf (buffer , sizeof (buffer ), "%7.2f B/s " , rate );
477- RichString_appendnAscii (str , baseColor , buffer , len );
478- } else if (rate < ONE_M ) {
479- int len = snprintf (buffer , sizeof (buffer ), "%7.2f K/s " , rate / ONE_K );
480- RichString_appendnAscii (str , baseColor , buffer , len );
481- } else if (rate < ONE_G ) {
482- int len = snprintf (buffer , sizeof (buffer ), "%7.2f M/s " , rate / ONE_M );
483- RichString_appendnAscii (str , megabytesColor , buffer , len );
484- } else if (rate < ONE_T ) {
485- int len = snprintf (buffer , sizeof (buffer ), "%7.2f G/s " , rate / ONE_G );
486- RichString_appendnAscii (str , largeNumberColor , buffer , len );
487- } else if (rate < ONE_P ) {
488- int len = snprintf (buffer , sizeof (buffer ), "%7.2f T/s " , rate / ONE_T );
489- RichString_appendnAscii (str , largeNumberColor , buffer , len );
473+ int len = snprintf (buffer , sizeof (buffer ), "%4.0f B/s " , rate );
474+ RichString_appendnAscii (str , shadowColor , buffer , len );
490475 } else {
491- int len = snprintf (buffer , sizeof (buffer ), "%7.2f P/s " , rate / ONE_P );
492- RichString_appendnAscii (str , largeNumberColor , buffer , len );
476+ size_t unitPrefixIndex = 0 ;
477+ do {
478+ if (unitPrefixIndex > ARRAYSIZE (unitPrefixes )- 1 ) {
479+ int len = snprintf (buffer , sizeof (buffer ), " INF " );
480+ RichString_appendnAscii (str , largeNumberColor , buffer , len );
481+ return ;
482+ }
483+ unitPrefixIndex ++ ;
484+ rate /= ONE_K ;
485+ } while (rate >= ONE_K );
486+
487+ unitPrefixIndex -- ; // unitPrefixes starts from K
488+
489+ int precision = 0 ;
490+ if (rate <= 99.9 ) {
491+ if (rate <= 9.99 )
492+ precision = 2 ;
493+ else
494+ precision = 1 ;
495+ }
496+
497+ if (precision < 2 ) {
498+ double upper_limit = (precision == 1 ) ? 10 : 100 ;
499+ if (rate < upper_limit ) {
500+ rate = upper_limit ;
501+ }
502+ }
503+
504+ int len = snprintf (buffer , sizeof (buffer ), "%4.*f" , precision , rate );
505+ int rateDisplayColor = (unitPrefixIndex < 2 ) ? ((!unitPrefixIndex ) ? baseColor : megabytesColor ) : largeNumberColor ;
506+ RichString_appendnAscii (str , rateDisplayColor , buffer , len );
507+ len = snprintf (buffer , sizeof (buffer ), " %c/s " , unitPrefixes [unitPrefixIndex ]);
508+ RichString_appendnAscii (str , shadowColor , buffer , len );
509+
493510 }
494511}
495512
0 commit comments