Search code examples
stringmatlabformattingmatlab-uitable

Matlab Justify Strings


I'm using Matlab R2014b (that's why I cannot use strings, but only char vectors). Working inside a class, I have to take data from a table variable, format it following my needs, and then insert it into a GUI table (an instance of uitable, to be exact):

function UpdateTable(this)
    siz = size(mydata);

    tab = cell(siz);
    tab(:,1) = num2cell(this.Data.ID);
    tab(:,2) = cellstr(datestr(this.Data.Date,'dd/mm/yyyy'));
    tab(:,3) = arrayfun(@(x){MyClass.TypeDef1{x,1}},this.Data.Type1);
    tab(:,4) = arrayfun(@(x){MyClass.TypeDef2{x,1}},this.Data.Type2);
    tab(:,5) = arrayfun(@(x){MyClass.FormatNumber(x)},this.Data.Value);

    this.UITable.Data = tab;
end

Where:

properties (Access = private, Constant)
    TypeDef1 = {
        'A1' 'Name A1';
        'B1' 'Name B1';
        'C1' 'Name C1';
        'D1' 'Name D1';
        ...
    }
    TypeDef2 = {
        'A2' 'Name A2';
        'B2' 'Name B2';
        'C2' 'Name C2';
        'D2' 'Name D2';
        ...
    }
end

methods (Access = private, Static)
    function str = FormatNumber(num)
        persistent df;

        if (isempty(df))
            dfs = java.text.DecimalFormatSymbols();
            dfs.setDecimalSeparator(',');
            dfs.setGroupingSeparator('.');

            df = java.text.DecimalFormat();
            df.setDecimalFormatSymbols(dfs);
            df.setMaximumFractionDigits(2);
            df.setMinimumFractionDigits(2);
        end

        str = char(df.format(num));
    end
end

Everything is working fine. Now I would like to right justify the strings to be inserted in columns 1 and 5, to improve the table readability. I found the Matlab function that suits my needs, strjust. Reading the documentation, I saw that it can be used with cell arrays of char vectors, so I modified part of my UpdateTable code as follows:

tab(:,1) = cellstr(num2str(this.Data.ID));
tab(:,5) = strjust(arrayfun(@(x){MyClass.FormatNumber(x)},this.Data.Value));

TThe second one produces no changes (strings are still not justified). Should the strings already contain enough whitespace to be all the same length?


Solution

  • Ok, I solved the problem by myself using the following code:

    function UpdateTable(this)
        siz = size(this.Data);
    
        los = arrayfun(@(x){MyClass.FormatNumber(x)},this.Data.Value);
        los_lens = cellfun(@(x)numel(x),los);
        pad = cellfun(@blanks,num2cell(max(los_lens) - los_lens),'UniformOutput',false);
    
        tab = cell(siz);
        tab(:,1) = cellstr(num2str(this.Data.ID));
        tab(:,2) = cellstr(datestr(this.Data.Date,'dd/mm/yyyy'));
        tab(:,3) = arrayfun(@(x){MyClass.TypeDef1{x,1}},this.Data.Type1);
        tab(:,4) = arrayfun(@(x){MyClass.TypeDef2{x,1}},this.Data.Type2);
        tab(:,5) = cellstr(strcat(pad,los));
    
        this.UITable.Data = tab;
    end
    

    It's probably not the most elegant solution, but it works. Starting from Matlab 2016, the padding can be performed using the built-in pad function.