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

#matlab #printf

#matlab #printf

Вопрос:

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

Кто-нибудь знает умный способ заставить 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
  

Ответ №1:

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

Я не думаю, что есть какой-либо способ сделать это с помощью определенной строки формата для 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
  

Комментарии:

1. 1 Я надеялся избежать regexprep, но мне нравится, что я могу избежать цикла.

Ответ №2:

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

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

Комментарии:

1. Все мои числа удваиваются. Моя проблема в том, что я не хочу, чтобы числа с большим количеством цифр печатались в научной нотации, но я не хочу, чтобы числа с несколькими цифрами печатались с конечными нулями.