首页 > 解决方案 > 在 MATLAB 中指定打印值的最大宽度

问题描述

sprintf 和 fprintf 的字段宽度参数(例如,“sprintf('%nf',1234)”中的“n”)指定字段的最小宽度。这意味着较短的数字将被填充,但当需要保持指定的精度时,允许较长的数字超出指定的字段宽度。我正在寻找一种方法来指定最大字段宽度,以便宽度取代精度。

例如,我希望 1234.56、1234.56789 和 1.2345 的宽度为 8 个字符(包括小数点),因此分别打印为 1234.560、1234.567 和 1.234500。

这是一个类似的问题,但没有特定于 MATLAB 的解决方案 为数字指定最大 printf 字段宽度(必要时截断)?

我觉得以前一定有人遇到过这个问题,但我找不到任何相关的东西。如果存在类似问题,请提供链接。谢谢

标签: matlabprintfwidthtruncate

解决方案


您可以使用floor(log10())来确定您有多少个非浮动数字:

X    = [1234.56, 1234.56789, 1.2345]
n    = 8 % number of total digits.
% We create an array of string containing the format: 
%[ '%.4f\n'
%  '%.4f\n'
%  '%.7f\n' ]
form = strcat('%.',num2str(n-1-floor(real(log10(X))).'),'f\n')
% We concatenate this array into one single string and we print the result:
fprintf(reshape(form.',1,[]),X) 

或者您可以使用 for 循环(使用相同的逻辑):

for x = X
    form = strcat('%.',num2str(7-floor(real(log10(x)))),'f\n');
    fprintf(form,x)
end

我们得到:

1234.5600
1234.5679
1.2345000

编辑:

如果数字是集合的一部分(1,10,100 ...) ,我使用floor(log10())而不是ceil(log10())因此代码不会失败。10^n

现在这个片段可以处理负浮点数,因为我只取log10输出的实部。


推荐阅读