Matlab sprintf форматирование - PullRequest
       0

Matlab sprintf форматирование

2 голосов
/ 10 апреля 2011

РЕДАКТИРОВАТЬ : я перефразировал вопрос, чтобы быть более ясным.

Кто-нибудь знает умный способ заставить sprintf напечатать "% .6f с удаленными конечными нулями"? Вот что я ищу:

sprintf('%somemagic ', [12345678 123.45])
ans = 1234578 123.45 

где% somemagic - магический спецификатор. Кажется, ни один из форматов не работает.

% no trailing zeros, but scientific for big nums
sprintf('%g ', [12345678 123.45])
ans = 1.23457e+007 123.45 

% not approp for floats
sprintf('%d ', [12345678 123.45])
ans = 12345678 1.234500e+002 

% trailing zeros
sprintf('%f ', [12345678 123.45])
ans = 12345678.000000 123.450000

% cannot specify sig figs after decimal (combo of gnovice's approaches)
mat = [12345678 123.45 123.456789012345];
for j = 1:length(mat)
    fprintf('%s ', strrep(num2str(mat(j),20), ' ', ''));
end

Я не думаю, что есть способ сделать это, кроме циклического прохождения каждого элемента и изменения спецификатора на основе mod (x, 1) == 0 или использования регулярного выражения для удаления конечных нулей. Но вы никогда не знаете, толпа умнее меня.

Мое настоящее приложение - распечатывать элементы массива в HTML-таблице. Это мое текущее неуклюжее решение:

for j = 1:length(mat)
    if mod(mat(j),1) == 0
        fprintf('<td>%d</td>', mat(j));
    else
        fprintf('<td>%g</td>', mat(j));
    end
end

Ответы [ 2 ]

4 голосов
/ 10 апреля 2011

РЕДАКТИРОВАТЬ: Обновлен для решения отредактированного вопроса ...

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

>> mat = [12345678 123.45 123.456789012345];       %# Sample data
>> str = num2str(mat,'<td>%.6f</td>');             %# Create the string
>> str = regexprep(str,{'\.?0+<','\s'},{'<',''});  %# Remove trailing zeroes
                                                   %#   and whitespace
>> fprintf(str);                                   %# Output the string

<td>12345678</td><td>123.45</td><td>123.456789</td>  %# Output
0 голосов
/ 10 апреля 2011

Проблема в том, что вы смешиваете int с плавающей точкой в ​​массиве. Matlab это не нравится, поэтому преобразует ваш int в число с плавающей точкой, чтобы все элементы в массиве были одного типа. Посмотрите на doc sprintf : теперь вы вынуждены использовать% f,% e или% g на поплавках

Хотя я признаю, что мне нравится метод STRREP выше (или ниже)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...