Форматирование текста

Чтобы преобразовать данные в текст и управлять его форматом, можно использовать операторы форматирования с общими функциями преобразования, такими как num2str и sprintf. Эти операторы управляют обозначением, выравниванием, значащими цифрами и так далее. Они аналогичны тем, которые используются printf функция на языке программирования С. Типичные способы использования форматированного текста включают текст для файлов отображения и вывода.

Для примера, %f преобразует значения с плавающей точкой в текст с помощью обозначения с фиксированной точкой. Настройте формат путем добавления информации к оператору, например %.2f для представления двух цифр после десятичного знака или %12f для представления 12 символов в выходах, заполнение пространствами по мере необходимости.

A = pi*ones(1,3);
txt = sprintf('%f | %.2f | %12f', A)
txt = 
'3.141593 | 3.14 |     3.141593'

Можно объединить операторы с обычным текстом и специальными символами в спецификатор формата. Для образца, \n вставляет символ новой строки.

txt = sprintf('Displaying pi: \n %f \n %.2f \n %12f', A)
txt = 
    'Displaying pi: 
      3.141593 
      3.14 
          3.141593'

Функции, которые поддерживают операторы форматирования compose, num2str, sprintf, fprintf, и функции обработки ошибок assert, error, warning, и MException.

Поля оператора форматирования

Оператор форматирования может иметь шесть полей, как показано на рисунке. Справа налево поля являются символом преобразования, подтипом, точностью, шириной поля, флагами и числовым идентификатором. (Пробелы в операторе запрещены. Они показаны здесь только для улучшения читаемости рисунка.) Символ преобразования является единственным необходимым полем наряду с начальным % символ.

Символ преобразования

Символ преобразования задает обозначение выхода. Он состоит из одного символа и появляется последним в спецификаторе формата.

Спецификатор

Описание

c

Один символ.

d

Десятичное обозначение (со знаком).

e

Экспоненциальное обозначение (с использованием нижнего регистра e, как в 3.1415e+00).

E

Экспоненциальное обозначение (с использованием верхнего регистра E, как в 3.1415E+00).

f

Обозначение с фиксированной точкой.

g

Чем компактнее %e или %f. (Незначительные нули не печатаются.)

G

То же, что и %g, но с использованием верхнего регистра E.

o

Восьмеричное обозначение (без знака).

s

Вектор символов или строковые массивы.

u

Десятичное обозначение (без знака).

x

Шестнадцатеричное обозначение (без знака, с использованием строчных букв af).

X

Шестнадцатеричное обозначение (без знака, с использованием заглавных букв AF).

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

A = 46*ones(1,4);
txt = sprintf('%d   %f   %e   %X', A)
txt = 
'46   46.000000   4.600000e+01   2E'

Подтип

Поле подтипа является одним буквенным символом, который непосредственно предшествует символу преобразования. Без поля подтипа символы преобразования %o, %x, %X, и %u обрабатывать входные данные как целые числа. Чтобы считать входные данные значениями с плавающей точкой и преобразовать их в восьмеричные, десятичные или шестнадцатеричные представления, используйте один из следующих спецификаторов подтипа.

b

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

t

Входные данные являются значениями с плавающей точностью, а не беззнаковыми целыми числами.

Точность

Поле точности в операторе форматирования является неотрицательным целым числом, которое немедленно следует за периодом. Для примера в операторе %7.3f, точность 3. Для %g оператор, точность указывает количество значащих цифр для отображения. Для %f, %e, и %E операторы, точность указывает, сколько цифр отображать справа от десятичной точки.

Отобразите номера для различных точностей с помощью поля точности.

txt = sprintf('%g   %.2g   %f   %.2f', pi*50*ones(1,4))
txt = 
'157.08   1.6e+02   157.079633   157.08'

В то время как вы можете задать точность в операторе форматирования для входа текста (для примера, в %s оператор), обычно нет причин для этого. Если вы задаете точность следующим p, и p меньше, чем количество символов в вход тексте, тогда выход содержит только первый p персонажи.

Ширина поля

Ширина поля в операторе форматирования является неотрицательным целым числом, которое задает количество цифр или символов в выходе при форматировании входных значений. Для примера в операторе %7.3f, ширина поля 7.

Задайте различные ширины полей. Чтобы показать ширину для каждого выхода, используйте | символ. По умолчанию выходной текст заполняется пробелами, когда ширина поля превышает количество символов.

txt = sprintf('|%e|%15e|%f|%15f|', pi*50*ones(1,4))
txt = 
'|1.570796e+02|   1.570796e+02|157.079633|     157.079633|'

При использовании при входе текста ширина поля может определить, дополнять ли выходной текст пространствами. Если ширина поля меньше или равна количеству символов в входе тексте, то оно не имеет эффекта.

txt = sprintf('%30s', 'Pad left with spaces')
txt = 
'          Pad left with spaces'

Флаги

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

Символ

Описание

Пример

Знак минус (-)

Левое обоснование преобразованного аргумента в его поле.

%-5.2d

Знак плюс (+)

Для числовых значений всегда печатайте начальный символ (+ или -).
Для текстовых значений выровняйте по правому краю преобразованный аргумент в его поле.

%+5.2d
%+5s

Пространство

Вставьте пространство перед значением.

% 5.2f

Нуль (0)

Дополните нулями, а не пространствами.

%05.2f

Знак фунта (#)

Измените выбранные числовые преобразования:

  • Для %o, %x, или %X, печать 0, 0x, или 0X префикс.

  • Для %f, %e, или %E, напечатайте десятичную точку, даже если точность равна 0.

  • Для %g или %G, не удаляйте конечные нули или десятичную точку.

%#5.0f

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

txt = sprintf('right-justify: %12.2f\nleft-justify: %-12.2f',...
              12.3, 12.3)
txt = 
    'right-justify:        12.30
     left-justify: 12.30       '

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

txt = sprintf('no sign: %12.2f\nsign: %+12.2f',...
              12.3, 12.3)
txt = 
    'no sign:        12.30
     sign:       +12.30'

Дополните влево пространствами и нулями. Поведение по умолчанию состоит в том, чтобы дополнить пространствами.

txt = sprintf('Pad with spaces: %12.2f\nPad with zeroes: %012.2f',...
              5.2, 5.2)
txt = 
    'Pad with spaces:         5.20
     Pad with zeroes: 000000005.20'

Примечание

Можно задать несколько флагов в операторе форматирования.

Идентификаторы значений

По умолчанию функции, такие как sprintf вставьте значения из входных параметров в выход текст в последовательном порядке. Чтобы обработать входные параметры в неравном порядке, задайте порядок с помощью числовых идентификаторов в спецификаторе формата. Задайте неравноценные аргументы с целым числом сразу после % знак, за которым следует $ знак.

Упорядоченный последовательноУпорядоченный по идентификатору
sprintf('%s %s %s',...
        '1st','2nd','3rd')

ans =

    '1st 2nd 3rd'
sprintf('%3$s %2$s %1$s',...
        '1st','2nd','3rd')

ans =

    '3rd 2nd 1st'

Специальные символы

Специальные символы могут быть частью выхода текста. Но поскольку они не могут быть введены как обычный текст, им требуются определенные последовательности символов, чтобы представлять их. Чтобы вставить специальные символы в выходной текст, используйте любую из последовательностей символов в таблице.

Специальный символ

Представление в спецификаторе формата

Одинарная кавычка

''

Процент символа

%%

Обратная косая черта

\\

Тревога

\a

Клавиша Backspace

\b

Подача формы

\f

Новая линия

\n

Возврат каретки

\r

Горизонтальная вкладка

\t

Вертикальная вкладка

\v

Символ, чей Юникод® числовое значение может быть представлено шестнадцатеричным числом, N

\xN

Пример: sprintf('\x5A') возвращает 'Z'

Символ, числовое значение в Юникоде которого может быть представлено восьмеричным числом N

\N

Пример: sprintf('\132') возвращает 'Z'

Установка ширины и точности поля

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

Правила форматирования точности и ширины поля

Рисунок иллюстрирует, как ширина поля и настройки точности влияют на выход функций форматирования. На этом рисунке нуль после % войти в оператор форматирования означает добавить начальные нули в выход текст, а не в пробел символов.

  • Если точность не задана, то по умолчанию это значение равняется шести.

  • Если точность p меньше, чем количество цифр в дробной части входа, то только p цифры показаны после десятичной точки. Дробное значение округлится в выходе.

  • Если точность p больше, чем количество цифр f в дробной части входа, затем p цифры показаны после десятичной точки. Дробная часть расширена вправо с p-f нули в выходе.

  • Если ширина поля не задана, то по умолчанию она равна p+1+n, где n - количество цифр во всей части входного значения.

  • Если ширина поля w больше p+1+n, затем вся часть выхода значения заполняется налево w-(p+1+n) дополнительные символы. Дополнительные символы являются пробелами, если оператор форматирования не включает в себя 0 флаг. В этом случае дополнительные символы являются нулями.

Задайте ширину поля и точность спецификатора внешнего формата

Ширину и точность поля можно задать, используя значения из последовательного списка аргументов. Используйте звездочку (*) вместо ширины поля или полей точности оператора форматирования.

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

txt = sprintf('%*f   %.*f   %*.*f',...
              15,123.45678,...     
              3,16.42837,...       
              6,4,pi)
txt = 
'     123.456780   16.428   3.1416'

Таблица описывает эффекты каждого оператора форматирования в примере.

Оператор форматирования

Описание

%*f

Задайте ширину в качестве следующего входного параметра, 15.

%.*f

Задайте точность как следующий входной параметр, 3.

%*.*f

Задайте ширину и точность как следующие входные параметры, 6, и 4.

Можно смешать эти два стиля. Для примера получите ширину поля из следующего входного параметра и точность из спецификатора формата.

txt = sprintf('%*.2f', 5, 123.45678)
txt = 
'123.46'

Задайте нумерованные идентификаторы в полях ширины и точности

Вы также можете задать ширину поля и точность как значения из неэквенциального списка аргументов, используя альтернативный синтаксис, показанный на рисунке. В операторе форматирования задайте ширину и точность поля со звездочками, которые следуют за нумерованными идентификаторами и $ знаки. Задайте значения ширины и точности поля с входные параметры, которые следуют спецификатору формата.

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

txt = sprintf('%1$*4$f   %2$.*5$f   %3$*6$.*7$f',...
              123.45678, 16.42837, pi, 15, 3, 6, 4)
txt = 
'     123.456780   16.428   3.1416'

Таблица описывает эффект каждого оператора форматирования в примере.

Оператор форматирования

Описание

%1$*4$f

1$ задает первый входной параметр, 123.45678, как значение

*4$ задает четвертый входной параметр, 15, как ширина поля

%2$.*5$f

2$ задает второй входной параметр, 16.42837, как значение

.*5$ задает пятый входной параметр, 3, как точность

%3$*6$.*7$f

3$ задает третий входной параметр, pi, как значение

*6$ задает шестой входной параметр, 6, как ширина поля

.*7$ задает седьмой входной параметр, 4, как точность

Ограничения на использование идентификаторов

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

Допустимый синтаксисНедопустимый синтаксис
sprintf('%d %d %d %d',...
        1,2,3,4)

ans =

    '1 2 3 4'
sprintf('%d %3$d %d %d',...
        1,2,3,4)

ans =

    '1 '

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

Допустимый синтаксисНедопустимый синтаксис
sprintf('%d',1,2,3,4)

ans =

    '1234'
sprintf('%1$d',1,2,3,4)

ans =

    '1'

Если вы используете нумерованные идентификаторы, когда входные данные являются вектором или массивом, то выход не содержит форматированных данных.

Допустимый синтаксисНедопустимый синтаксис
v = [1.4 2.7 3.1];
sprintf('%.4f %.4f %.4f',v)

ans =

    '1.4000 2.7000 3.1000'
v = [1.4 2.7 3.1];
sprintf('%3$.4f %1$.4f %2$.4f',v)

ans =

  1×0 empty char array

См. также

| | |

Похожие темы