格式化文本
要将数据转换为文本并控制其格式,您可以将格式化操作符与常见的转换函数(如 num2str
和 sprintf
)结合使用。这些操作符可控制记数法、对齐方式、有效位数以及其他内容。它们与 C 编程语言中的 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 | 指数记数法(使用大写 |
f | 定点记数法。 |
g | 更紧凑的 |
G | 与 |
o | 八进制记数法(无符号)。 |
s | 字符向量或字符串数组。 |
u | 十进制记数法(无符号)。 |
x | 十六进制记数法(无符号,使用小写字母 |
X | 十六进制记数法(无符号,使用大写字母 |
例如,使用不同的转换字符来格式化数值 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 | 输入数据为双精度浮点值,而不是无符号整数。例如,要以十六进制格式输出双精度值,请使用类似 |
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 |
零 ( | 用零而不是空格进行填充。 | %05.2f |
井号 ( | 修改选定的数值转换:
| %#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' |
特殊字符
特殊字符可以是输出文本的一部分。但是,由于它们不能以普通文本形式输入,因此需要使用特定的字符序列来表示。要将特殊字符插入到输出文本中,请使用下表中的任何字符序列。
特殊字符 | 格式设定符中的表示形式 |
---|---|
单引号 |
|
百分比字符 |
|
反斜杠 |
|
警报 |
|
退格符 |
|
换页符 |
|
换行符 |
|
回车符 |
|
水平制表符 |
|
垂直制表符 |
|
其 Unicode® 数值可以通过十六进制数 |
示例: |
其 Unicode 数值可以通过八进制数 |
示例: |
设置字段宽度和精度
格式化操作符遵循一组规则来按指定的字段宽度和精度格式化输出文本。您也可以在格式设定符之外为字段宽度和精度指定值,并将带编号的标识符与字段宽度和精度结合使用。
精度和字段宽度的格式化规则
下图演示了字段宽度和精度设置如何影响格式化函数的输出。在该图中,格式化操作符中 %
符号后面的零表示为输出文本添加前导零,而非空格字符。
如果未指定精度,则精度默认为 6。
如果精度
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'
下表介绍了该示例中每个格式化操作符的作用。
格式化操作符 | 描述 |
---|---|
| 将宽度指定为以下输入参量 |
| 将精度指定为以下输入参量 |
| 将宽度和精度指定为以下输入参量 |
您可以混合使用两种形式。例如,从后跟的输入参量获取字段宽度,从格式设定符获取精度。
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'
下表介绍了该示例中每个格式化操作符的作用。
格式化操作符 | 描述 |
---|---|
|
|
| |
|
|
| |
|
|
| |
|
使用标识符的限制
如果有任一格式化操作符包含标识符字段,则格式设定符中的所有操作符都必须包含标识符字段。如果您在同一函数调用中同时使用顺序和非顺序的次序,则输出将在首次在顺序标识符和非顺序标识符之间切换时被截断。
有效语法 | 无效语法 |
---|---|
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 |
另请参阅
compose
| sprintf
| fprintf
| num2str