String Matlab证明字符串
我使用的是String Matlab证明字符串,string,matlab,formatting,matlab-uitable,String,Matlab,Formatting,Matlab Uitable,我使用的是matlabr2014b(这就是为什么我不能使用strings,而只能使用charvectors)。在类中工作时,我必须从表变量中获取数据,根据需要对其进行格式化,然后将其插入GUI表(确切地说是uitable的一个实例): 其中: properties (Access = private, Constant) TypeDef1 = { 'A1' 'Name A1'; 'B1' 'Name B1'; 'C1' 'Name C1';
matlabr2014b
(这就是为什么我不能使用strings
,而只能使用charvectors
)。在类
中工作时,我必须从表
变量中获取数据,根据需要对其进行格式化,然后将其插入GUI表(确切地说是uitable
的一个实例):
其中:
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
。在阅读文档时,我发现它可以与字符向量的单元格数组一起使用,因此我修改了UpdateTable
代码的一部分,如下所示:
tab(:,1) = cellstr(num2str(this.Data.ID));
tab(:,5) = strjust(arrayfun(@(x){MyClass.FormatNumber(x)},this.Data.Value));
t第二个选项不产生任何更改(字符串仍然没有对齐)。字符串是否已经包含足够的空格以保持相同的长度?好的,我自己用以下代码解决了这个问题:
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函数执行填充。好的,我自己用以下代码解决了这个问题:
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函数执行填充。strjust似乎需要一个单元阵列,这里的主要问题似乎是您无法制作一个单元阵列。如果这是正确的:您能简单地创建一个带有for循环的单元数组来验证其余的工作吗?之后,您可以随时将其改写为更加优雅。这可能有效吗<代码>选项卡(:,5)=strjust(arrayfun(@(x){MyClass.FormatNumber(x)},this.Data.Value),'uniformoutput',false))
@Wouter这会引发一个错误“第一个参数不包含字符串的单元格数组”。我很抱歉。很高兴听到你成功了!strjust似乎需要一个单元数组,而这里的主要问题似乎是无法创建一个单元数组。如果这是正确的:您能简单地创建一个带有for循环的单元数组来验证其余的工作吗?之后,您可以随时将其改写为更加优雅。这可能有效吗<代码>选项卡(:,5)=strjust(arrayfun(@(x){MyClass.FormatNumber(x)},this.Data.Value),'uniformoutput',false))@Wouter这会引发一个错误“第一个参数不包含字符串的单元格数组”。我很抱歉。很高兴听到你成功了!