function Metric = num2metric (number, arg2, arg3) % Convert a numeric argument to a string rounded to a specified number of % decimal digits with a metric prefix. % Arguments: % number required quantity to be converted to a metric string % digits optional number of digits to the right of the decimal point % blank optional flag to include/suppress blank for no prefix % % If digits and blank are both specified then digits must precede blank % Check and assign arguments if (nargin == 1) digits = 3; blank = true; elseif (nargin == 2) if (isnumeric (arg2)) digits = arg2; blank = true; elseif (ischar (arg2)) if (strcmp (arg2, 'blank')) digits = 3; blank = true; elseif (strcmp (arg2, 'noblank')) digits = 3; blank = false; else fprintf ('\nnum2metric: unexpected argument\n\n') end else fprintf ('\nnum2metric: unexpected argument\n\n') end elseif (nargin == 3) if (isnumeric (arg2) && ischar (arg3)) digits = arg2; if (strcmp (arg3, 'blank')) blank = true; elseif (strcmp (arg3, 'noblank')) blank = false; else fprintf ('\nnum2metric: unexpected argument\n\n') end else fprintf ('\nnum2metric: unexpected argument\n\n') end else fprintf ('\nnum2metric: unexpected argument\n\n') end % Determine metric exponent if (number == 0) exponent = 0; else exponent = 3 * floor (log10 (abs (number)) / 3); end exponent = max (min (exponent, 24), -24); % Determine mantissa mantissa = round (number * 10^(digits-exponent)) / 10^digits; if (abs (mantissa) == 1000 && exponent ~= 24) mantissa = sign (mantissa); exponent = exponent + 3; end Metric = num2str (mantissa); % Zero padding if (digits > 0) index = strfind (Metric, '.'); if (isempty (index)) Metric = [Metric '.']; index = length (Metric); end k = digits - length (Metric) + index; while (k > 0) Metric = [Metric '0']; k = k-1; end end % Append metric prefix Prefixes = ['yzafpn' char(181) 'm kMGTPEZY']; if (blank || exponent ~= 0) Metric = [Metric ' ' Prefixes(9+exponent/3)]; else Metric = [Metric ' ']; end end