Create table from structure - alignment

조회 수: 1 (최근 30일)
Alessandro D
Alessandro D 2021년 6월 1일
답변: Stephen23 2021년 6월 2일
I have a structure with scalar fields, say mom, and I would like to display the values of the structure on the screen in aligned columns, possibly with some header. Here is a minimum working example:
mom.a = 1;
mom.b = 2;
mom.veryLongName = 3;
header = {'Moment'; 'Value'};
fnames = fieldnames(mom);
pvec = zeros(numel(fnames),1);
for i = 1:numel(fnames)
pvec(i) = mom.(fnames{i});
end
fprintf('%s \t \t %s \n',header{1},header{2});
for i = 1:numel(fnames)
fprintf('%s \t \t %8.3f \n',fnames{i},pvec(i));
end
This code works OK but the problem is that columns are not aligned, especially if a field has a very long name. This is the output:
Moment Value
a 1.000
b 2.000
veryLongName 3.000
Any suggestion is appreciated!

채택된 답변

Stephen23
Stephen23 2021년 6월 2일
Simpler:
mom.a = 1;
mom.b = 2;
mom.veryLongName = 3;
hdr = {'Moment'; 'Value'};
tmp = [fieldnames(mom),struct2cell(mom)].';
fprintf(' %-20s %-s\n', hdr{:});
Moment Value
fprintf(' %-20s %-8.3f\n', tmp{:});
a 1.000 b 2.000 veryLongName 3.000

추가 답변 (1개)

per isakson
per isakson 2021년 6월 2일
편집: per isakson 2021년 6월 2일
I've modified the format specifier.
%%
mom.a = 1;
mom.b = 2;
mom.veryLongName = 3;
header = {'Moment'; 'Value'};
fnames = fieldnames(mom);
pvec = zeros(numel(fnames),1);
for i = 1:numel(fnames)
pvec(i) = mom.(fnames{i});
end
%%
name_len = max( [ strlength(header(1)); cellfun( @strlength, fnames ) ] ) + 2;
%%
fprintf( '%-*s%8s\n', name_len, header{1}, header{2} );
Moment Value
for i = 1:numel(fnames)
fprintf( '%-*s%8.3f\n', name_len, fnames{i}, pvec(i) );
end
a 1.000 b 2.000 veryLongName 3.000
Two thirds down the page fprintf, Write data to text file you find the description of this use of the format specifier. Search for the subsection "Field Width"

카테고리

Help CenterFile Exchange에서 Import, Export, and Conversion에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by