Matlab ShortEng数字格式通过sprintf()和fprintf()?

时间:2016-02-10 10:25:20

标签: matlab number-formatting

我喜欢在交互式命令窗口中使用MATLAB' shortEng表示法:

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

   1.2300e-10       % Scientific notation. Urgh!

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

   123.0000e-012    % Engineering notation! :-D

但我想使用fprintf:

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

如何使用MATLAB Format Operators使用fprintf或sprintf使用工程格式打印值?

我知道我可以编写自己的函数来将值格式化为字符串,但我正在寻找已经内置到MATLAB中的东西。

注意:"工程"符号与" Scientific"因为指数总是3的倍数。

>> fprintf('%0.3e', a);    % This is Scientific notation.
1.230000e-10

4 个答案:

答案 0 :(得分:3)

无法直接使用fprintf格式说明符来表示您需要的格式。一种方法是使用disp的输出作为要打印的字符串。但是disp没有返回字符串,它直接写入标准输出。那么,怎么做呢?

这里有evalc(获得输出的eval)来救援:

%// 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));

当然,这是一种解决方法,由于辅助函数的未经测试的输入,可能会以多种方式适得其反。但它说明了一个观点,并且是被诅咒的eval函数族实际上不可替代的极少数情况之一。

答案 1 :(得分:2)

您可以使用以下实用程序:

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

这将根据给定的数字 N 解压数字,并确保指数为 N 的倍数。通过输入 N = 3 ,您就拥有了工程符号。

详细信息,unpacknum有3个参数:数字x,基数(10,如果你想要工程符号)和值 N 3如果你想要工程符号),它会返回你可以在f中使用的情侣(efprintf())。

查看unpacknum帮助以获取快速示例。

答案 2 :(得分:1)

此函数将值转换为工程符号中的字符串:

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

您可以根据自己的喜好微调格式。与fprintf结合使用很容易:

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

答案 3 :(得分:1)

您可以使用以下实用程序发布到MATLAB文件交换中: num2eng

它提供了对输出字符串格式和完整输入检查的广泛控制,因此与user2271770建议的更简单的撤消方法相比,它更加灵活且不易出错。

如果愿意,它还可以使用SI前缀而不是工程符号来输出字符串。