2017-07-27 2 views
1

私はMatlab R2014bを使用しています(そのため、stringsは使用できませんが、char vectorsのみ)。 class内部の作業、私は(正確には、uitableのインスタンス)table変数からデータを取らなければならない、フォーマット、それは私のニーズを、以下、その後、GUIテーブルに挿入: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)); 

間に合わ秒1は何も変更(文字列はまだ正当化されない)を生成しません。文字列にはすでにすべて同じ長さの空白が含まれていなければなりませんか?

+0

strjustにはセル配列が必要なように見えますが、ここでの主な問題は、作成に失敗したように見えます。それが正しい場合は、単純にforループを使ってセル配列を作成して、残りが機能することを確認できますか?その後、いつでもよりエレガントになるように書き換えることができます。 –

+1

これは機能する場合がありますか? ' – Wouter

+0

@Wouterこれはエラーをスローします" 'tab(:、5)= strjust(arrayfun(@(x){MyClass.FormatNumber(x)}、this.Data.Value)、 'uniformoutput'、false));最初の引数には文字列のセル配列が含まれていません "。 –

答えて

0

[OK]を、私は次のコードを使用して自分で問題を解決:

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から、組み込みパッド機能を使用して埋め込みを実行することができます。