2017-07-27 35 views
1

我使用的是Matlab R2014b(这就是为什么我不能使用strings,但只有char vectors)。一个class里面工作,我不得不从table变量取数据,格式化之后我的需求,然后将其插入到一个GUI表(的uitable一个实例,是精确的):Matlab Justify Strings

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)); 

里边反第二个没有产生变化(字符串仍没有道理的)。字符串是否应该包含足够的空白以保持相同的长度?

+0

strjust似乎需要一个单元阵列,这里的主要问题似乎是你没有做出一个。如果这是正确的:你能简单地用for循环创建单元阵列来验证其余的工作吗?之后,您可以随时将其重写为更加优雅。 –

+1

这可能工作? 'tab(:,5)= strjust(arrayfun(@(x){MyClass.FormatNumber(x)},this.Data.Value),'uniformoutput',false));' – Wouter

+0

@Wouter this throws a error“第一个参数不包含字符串的单元数组“。 –

回答

0

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

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功能执行填充。