% Convierte un número a formato ingeniería y % lo devuelve convertido en cadena de caracteres. % El número de argumentos es variable porque puede ser 1 o 2. % Si le pasamos un argumento, será simplemente el número a convertir, y si % le pasamos 2 argumentos, el primero será el número y el segundo una % opción para que se pueda poner el prefijo de la unidad de ingeniería % (mili(m), micro(u),nano(n),...). Dicha opción debe ser '-prefix' % % engineeringFormat(0.35, '-prefix') % ans = 350 m % % engineeringFormat(0.35) % ans = 350e-3 % % % function cadena = engineeringFormat(varargin) % Miramos cuantos argumentos le hemos pasado a la función if nargin==1 % Un argumento vector = varargin{1}; prefix = 0; elseif nargin>1 % Dos argumentos (o más, que serían ignorados) vector = varargin{1}; if strcmp(varargin{2},'-prefix') prefix = 1; else prefix = 0; end else % En otro caso, no salimos de la función ST = dbstack; functionname = ST.name; fprintf('ERROR: Incorrect usage of function ''%s''\n',functionname(1,:)); fprintf('Not enough input arguments.\n'); return; end len=length(vector); for index=1:len numero=vector(index); if (abs(numero)<1000 && abs(numero)>=1)||(numero==0) % Si el número está entre 1 y 1000 (o es 0 exacto), se deja sin % exponente. aux=num2str(numero); cadena(index,1:length(aux)) = aux; else exponente = floor(log10(abs(numero))); resto = mod(exponente,3); if resto>0 exponente = exponente - resto; end base = numero*10^(-exponente); if exponente>=0 signo = '+'; aux=sprintf('%ge%c%i',base,signo,exponente); cadena(index,1:length(aux)) = aux; else aux=sprintf('%ge%i',base,exponente); cadena(index,1:length(aux)) = aux; end end % Le ponemos el prefijo en caso de que lo queramos if prefix==1 && exist('exponente','var') switch exponente case -18 % Atto pref = 'a'; case -15 % Femto pref = 'f'; case -12 % Pico pref = 'p'; case -9 % Nano pref = 'n'; case -6 % Micro pref = 'u'; case -3 % Mili pref = 'm'; case 3 % Kilo pref = 'k'; case 6 % Mega pref = 'M'; case 9 % Giga pref = 'G'; case 12 % Tera pref = 'T'; case 15 % Peta pref = 'P'; case 18 % Exa pref = 'E'; otherwise return; % Si se sale de estos rangos, no se le pone el prefijo. end if mod(base,1)==0 aux=sprintf('%1.0f %s\n',base,pref); else aux=sprintf('%1.3f %s',base,pref); end cadena(index,1:length(aux)) = aux; end end
Download the file engineeringFormat.m