6
votes

I like using MATLAB's shortEng notation in the interactive Command Window:

>> a = 123e-12;
>> disp(a);

   1.2300e-10       % Scientific notation. Urgh!

>> format shortEng;
>> disp(a);

   123.0000e-012    % Engineering notation! :-D

But I want to use fprintf:

>> format shortEng;
>> fprintf('%0.3e', a); 
1.2300e-10          % Scientific. Urgh!

How do I print values with fprintf or sprintf with Engineering formatting using the MATLAB Format Operators?

I know I could write my own function to format the values into strings, but I'm looking for something already built into MATLAB.

NOTE: "Engineering" notation differs from "Scientific" in that the exponent is always a multiple of 3.

>> fprintf('%0.3e', a);    % This is Scientific notation.
1.230000e-10
4
looks like there aren't build in function to specify fprintf output to "Engineering" mode... You have to use your own functionMikhail_Sam

4 Answers

5
votes

There is no way to use directly fprintf format specifier for the format you require. A way around is to use the output of disp as a string to be printed. But disp doesn't return a string, it writes directly to the standard output. So, how to do this?

Here's where evalc (eval with capture of output) comes to the rescue:

%// Create helper function
sdisp = @(x) strtrim(evalc(sprintf('disp(%g)', x)));

%// Test helper function
format ShortEng;
a = 123e-12;
fprintf(1, 'Test: %s', sdisp(a));

This is a workaround, of course, and can backfire in multiple ways because of the untested inputs of the helper functions. But it illustrates a point, and is one of the rare occasions where the reviled eval function family is actually irreplaceable.

2
votes

You can use the following utility:

http://www.people.fas.harvard.edu/~arcrock/lib118/numutil/unpacknum.m

This will unpack the number also according to a given number N and makes sure that the exponent will be a multiple of N. By putting N=3 you have the Engineering Notation.

More into detail, unpacknum takes 3 arguments: the number x, the base (10 if you want Engineering Notation) and the value N (3 if you want Engineering Notation) and it returns the couple (f,e) which you can use in fprintf().

Check the unpacknum help for a quick example.

1
votes

This function converts a value into a string in engineering notation:

function sNum = engn(value)
exp= floor(log10(abs(value)));
if ( (exp < 3) && (exp >=0) ) 
    exp = 0; % Display without exponent
else
    while (mod(exp, 3))
        exp= exp - 1;
    end
end
frac=value/(10^exp); % Adjust fraction to exponent
if (exp == 0)
    sNum = sprintf('%+8.5G', frac);
else
    sNum = sprintf('%+8.5GE%+.2d', frac, exp);
end
end

You can finetune the format to your liking. Usage in combination with fprintf is easy enough:

fprintf('%s\t%s\n', engn(543210.123), engn(-0.0000567)) % +543.21E+03  -56.7E-06
fprintf('%s\t%s\n', engn(-321.123), engn(876543210)) % -321.12   +876.54E+06
1
votes

You can use the following utility posted to the MATLAB file exchange: num2eng

It offers extensive control over the formatting of the output string and full input checking, so is more flexible and less prone to error than the simpler evalc approach suggested by user2271770.

It can also output strings using SI prefixes instead of engineering notation, if you prefer.