Mercurial > repos > public > sbplib
changeset 465:a5cebdaad10b
Implement a simple but general text table
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Tue, 01 Aug 2017 12:24:52 +0200 |
parents | 283bdea202d2 |
children | e1a59aafe99c |
files | TextTable.m textTable.m |
diffstat | 2 files changed, 122 insertions(+), 64 deletions(-) [+] |
line wrap: on
line diff
diff -r 283bdea202d2 -r a5cebdaad10b TextTable.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TextTable.m Tue Aug 01 12:24:52 2017 +0200 @@ -0,0 +1,122 @@ +classdef TextTable < handle + properties + data + fmtArray + vertDiv + horzDiv + + nCols + nRows + end + + methods + function obj = TextTable(data, vertDiv, horzDiv); + default_arg('vertDiv', []); + default_arg('horzDiv', []); + + + obj.data = data; + obj.vertDiv = vertDiv; + obj.horzDiv = horzDiv; + + [obj.nRows, obj.nCols] = size(data); + obj.fmtArray = cell(size(data)); + obj.formatAll('%s'); + + end + + function formatAll(obj, fmt) + obj.fmtArray(:,:) = {fmt}; + end + + function formatCell(obj, i, j, fmt) + obj.fmtArray{i,j} = fmt; + end + + function formatRow(obj, i, fmt) + obj.fmtArray(i,:) = {fmt}; + end + + function formatColumn(obj, j, fmt) + obj.fmtArray(:,j) = {fmt}; + end + + function widths = getWidths(obj) + strArray = obj.getStringArray(); + + widths = zeros(1,obj.nCols); + for j = 1:obj.nCols + for i = 1:obj.nRows + widths(j) = max(widths(j), length(strArray{i,j})); + end + end + end + + function str = toString(obj) + strArray = obj.getStringArray(); + widths = obj.getWidths(); + + str = ''; + + % First horzDiv + if ismember(0, obj.horzDiv) + str = [str, obj.getHorzDiv(widths)]; + end + + for i = 1:obj.nRows + str = [str, TextTable.rowToString(strArray(i,:), widths, obj.vertDiv, obj.horzDiv)]; + + % Interior horzDiv + if ismember(i, obj.horzDiv) + str = [str, obj.getHorzDiv(widths)]; + end + end + end + + function str = getHorzDiv(obj, widths) + str = TextTable.rowToString(cell(1,obj.nCols), widths, obj.vertDiv, obj.horzDiv); + str(find(' ' == str)) = '-'; + str(find('|' == str)) = '+'; + end + + function strArray = getStringArray(obj) + strArray = cell(size(obj.data)); + + for i = 1:obj.nRows + for j = 1:obj.nCols + strArray{i,j} = sprintf(obj.fmtArray{i,j}, obj.data{i,j}); + end + end + end + end + + methods (Static) + function str = rowToString(strs, widths, vertDiv, horzDiv) + % First vertDiv + if ismember(0, vertDiv) + str = '| '; + else + str = ' '; + end + + % Interior cols + for j = 1:length(strs) - 1 + str = [str, sprintf('%*s ', widths(j), strs{j})]; + + % Interior vertDiv + if ismember(j, vertDiv) + str = [str, '| ']; + end + end + + % Last col + str = [str, sprintf('%*s ', widths(end), strs{end})]; + + if ismember(length(strs), vertDiv) + str = [str, '|']; + end + + str = [str, sprintf('\n')]; + end + end +end \ No newline at end of file
diff -r 283bdea202d2 -r a5cebdaad10b textTable.m --- a/textTable.m Mon Jun 19 09:41:03 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ - -% data -- cell array of numbers -% leftColstrings -- cell array of strings, for left column -% topRowStrings -- cell array of strings, for top row -% dataFormat -- (optional) format specifier, e.g. '%.2f' -function textTable(data, leftColStrings, topRowStrings, dataFormat) - - default_arg('dataFormat','%.2f') - - nRows = length(leftColStrings); - nCols = length(topRowStrings); - [m,n] = size(data); - - if(m ~= nRows || n ~=nCols) - error('Data dimensions must match labels'); - end - - % Find column widths - headerLength = 0; - for i = 1:nCols - headerLength = max(headerLength, length(topRowStrings{i} )); - end - - dataLength = 0; - for i = 1:nRows - for j = 1:nCols - temp = length(sprintf(dataFormat, data{i,j})); - dataLength = max(dataLength, temp); - end - end - dataLength = length(sprintf(dataFormat, data{1,1})); - - colWidth = max(headerLength,dataLength); - - % Print headers - fprintf(' %*s |',colWidth,'') - for i = 1:nCols - fprintf(' %-*s |', colWidth, topRowStrings{i}); - end - fprintf('\n'); - - % Print divider - m_dev = repmat('-',1,colWidth); - column_dev = repmat('-',1,colWidth); - fprintf('-%s-+',m_dev); - for i = 1:nCols - fprintf('-%s-+', column_dev); - end - fprintf('\n'); - - - % Print each row - dataFormat = ['%*' dataFormat(2:end)]; - for i = 1:nRows - fprintf(' %*s |',colWidth,leftColStrings{i}); - for j = 1:nCols - fprintf([' ' dataFormat ' |'], colWidth, data{i,j}); - end - fprintf('\n'); - end - - fprintf('\n'); - -end \ No newline at end of file