Странные символы при окраске определенных данных в ячейках

Я сослался на этот ответ при раскрашивании определенных строк таблицы в графическом интерфейсе, однако вместо реальных чисел, присутствующих в этих строках, появляются некоторые странные символы, как показано ниже:

Это строка кода, которую я использую, чтобы раскрасить:

DataTable = [num2cell(handles.zRaw), num2cell(handles.pRaw), num2cell(handles.zMob),...
            num2cell(handles.PressGrubbs), num2cell(handles.PressRosner), handles.OutlCheckGRubbs,...
            handles.OutlCheckRosner, num2cell(handles.iZones), num2cell(handles.iExcessPress)];

        %# Use HTML to style these cells
        n = 1:size(DataTable, 2);
        DataTable(idx, n) = strcat('<html><span style="color: #FF0000; font-weight: bold;">',...
            DataTable(idx, n));

Кроме того, я также получаю это предупреждение:

Предупреждение: выход за пределы диапазона или нецелые значения усекаются при преобразовании в символ.

В ячейке.стркат на 55

В выше DataTableпеременные handles.OutlCheckGRubbs а также handles.OutlCheckRosner являются массивом строк.

1 ответ

Решение

Проблема в том, что ваша таблица (массив ячеек) содержит как числовые, так и строковые данные. Когда вы используете strcat он обрабатывает все свои входные данные как строки, что означает, что числовые данные усекаются и обрабатываются как кодовые точки ASCII/Unicode. Пример:

%# note that double('d')==100
>> strcat(100.6,'aaa')
ans =
daaa

Вы видите предупреждение, потому что MATLAB действительно поддерживает только первые 2^16 символов кодовых точек (плоскость BMP UTF-16/UCS-2):

>> strcat(2^16 + 100, 'a')
Warning: Out of range or non-integer values truncated during conversion to character. 
> In strcat at 86 
ans =
a

То, что вы должны сделать, это сначала преобразовать числа в строки:

>> strcat(num2str(100), 'a')
ans =
100a

РЕДАКТИРОВАТЬ:

Вот пример, который напоминает ваш код. Обратите внимание, как числовые столбцы нужно было сначала преобразовать в строки:

%# data columns you have. Some are numeric, others are strings
col1 = rand(10,1);
col2 = repmat({'ok'},10,1);
col3 = randi(100, 10,1);

%# combine into a table cell-array (all strings)
convert = @(x) strtrim(cellstr(num2str(x)));
table = [convert(col1) col2 convert(col3)];

%# apply custom formatting to some rows
idx = rand(10,1)>0.7;
table(idx,:) = strcat('<html><span style="color: red;">', table(idx,:));

%# show uitable
uitable('Data',table)

Скриншот

Стоит отметить, что UITABLE отображает строки с выравниванием по левому краю, а числа отображаются с выравниванием по правому краю. Таким образом, преобразовывая числа в строки, мы получаем другое выравнивание текста.

Преобразование числовой-> строка было выполнено с использованием NUM2STR. Вы можете настроить вызов, чтобы точно указать, сколько цифр отображать, если хотите, как в: num2str(10.01, '%.6f')


EDIT2:

В ответ на комментарий, вот один из способов назначить разные цвета:

idx = [1 4 5 9];
clr = {'red'; 'green'; 'rgb(0,0,255)'; '#FF00FF'};
table(idx,:) = strcat('<html><span style="color: ', ...
    clr(:,ones(1,size(table,2))), ...
    ';">', table(idx,:));

Для простоты я предполагаю, что 4 цвета соответствуют 4 рядам.

Другие вопросы по тегам