@@ -227,6 +227,27 @@ void Unit::GetSIScalingFactor(double num, double& scaleFactor, string& prefix) c
227227 prefix = " " ;
228228 num = fabs (num);
229229
230+ // Bytes: use binary rather than decimal scaling factors
231+ if (m_type == UNIT_BYTES)
232+ {
233+ if (num >= 1024 )
234+ {
235+ scaleFactor = 1.0 / 1024 ;
236+ prefix = " k" ;
237+ }
238+ if (num >= 1024 *1024 )
239+ {
240+ scaleFactor = 1.0 / (1024 *1024 );
241+ prefix = " M" ;
242+ }
243+ if (num >= 1024 *1024 *1024 )
244+ {
245+ scaleFactor = 1.0 / (1024 *1024 *1024 );
246+ prefix = " G" ;
247+ }
248+ return ;
249+ }
250+
230251 if (num >= 1e12f)
231252 {
232253 scaleFactor = 1e-12 ;
@@ -953,13 +974,29 @@ double Unit::ParseString(const string& str, bool useDisplayLocale)
953974 continue ;
954975
955976 if (c == ' T' )
977+ {
956978 scale = 1e12 ;
979+ if (m_type == UNIT_BYTES)
980+ scale = 1024 * 1024 * 1024 * 1024LL ;
981+ }
957982 else if (c == ' G' )
983+ {
958984 scale = 1e9 ;
985+ if (m_type == UNIT_BYTES)
986+ scale = 1024 * 1024 * 1024 ;
987+ }
959988 else if (c == ' M' )
989+ {
960990 scale = 1e6 ;
991+ if (m_type == UNIT_BYTES)
992+ scale = 1024 * 1024 ;
993+ }
961994 else if (c == ' K' || c == ' k' )
995+ {
962996 scale = 1e3 ;
997+ if (m_type == UNIT_BYTES)
998+ scale = 1024 ;
999+ }
9631000 else if (c == ' m' )
9641001 scale = 1e-3 ;
9651002 else if ( (c == ' u' ) || (str.find (" μ" , i) == i) )
@@ -1066,13 +1103,33 @@ int64_t Unit::ParseStringInt64(const string& str, bool useDisplayLocale)
10661103 continue ;
10671104
10681105 if (c == ' T' )
1069- mulscale *= 1e12 ;
1106+ {
1107+ if (m_type == UNIT_BYTES)
1108+ mulscale *= 1024 * 1024 * 1024 * 1024LL ;
1109+ else
1110+ mulscale *= 1e12 ;
1111+ }
10701112 else if (c == ' G' )
1071- mulscale *= 1e9 ;
1113+ {
1114+ if (m_type == UNIT_BYTES)
1115+ mulscale *= 1024 * 1024 * 1024 ;
1116+ else
1117+ mulscale *= 1e9 ;
1118+ }
10721119 else if (c == ' M' )
1073- mulscale *= 1e6 ;
1120+ {
1121+ if (m_type == UNIT_BYTES)
1122+ mulscale *= 1024 * 1024 ;
1123+ else
1124+ mulscale *= 1e6 ;
1125+ }
10741126 else if (c == ' K' || c == ' k' )
1075- mulscale *= 1e3 ;
1127+ {
1128+ if (m_type == UNIT_BYTES)
1129+ mulscale *= 1024 ;
1130+ else
1131+ mulscale *= 1e3 ;
1132+ }
10761133 else if (c == ' m' )
10771134 divscale *= 1e3 ;
10781135 else if ( (c == ' u' ) || (str.find (" μ" , i) == i) )
0 commit comments