【问题标题】:Matlab Justify StringsMatlab 对齐字符串
【发布时间】:2017-07-27 09:43:45
【问题描述】:

我正在使用Matlab R2014b(这就是为什么我不能使用strings,而只能使用char vectors)。在class 中工作,我必须从table 变量中获取数据,按照我的需要对其进行格式化,然后将其插入到GUI 表中(确切地说是uitable 的一个实例):

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

地点:

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

一切正常。现在我想右对齐插入第 1 列和第 5 列的字符串,以提高表格的可读性。我找到了适合我需要的 Matlab 函数,strjust。看了文档,发现可以和cell arrays of char vectors一起使用,所以我修改了我的UpdateTable的部分代码如下:

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

T第二个没有产生任何变化(字符串仍然不合理)。字符串是否应该已经包含足够的空格以保持相同的长度?

【问题讨论】:

  • strjust 似乎需要一个元胞数组,而这里的主要问题似乎是您无法制作一个。如果这是正确的:您可以简单地使用 for 循环创建单元数组来验证其余部分是否有效?之后您可以随时将其重写为更优雅。
  • 这可能有用吗? tab(:,5) = strjust(arrayfun(@(x){MyClass.FormatNumber(x)},this.Data.Value),'uniformoutput',false));
  • @Wouter 这会引发错误“第一个参数不包含字符串元胞数组”。
  • 我很抱歉。很高兴听到您成功了!

标签: string matlab formatting matlab-uitable


【解决方案1】:

好的,我自己用下面的代码解决了这个问题:

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

这可能不是最优雅的解决方案,但它确实有效。从 Matlab 2016 开始,可以使用内置的 pad 函数进行填充。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2017-04-20
    • 2013-03-25
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多