Main Content

print

将插件生成的文本写入输出流

说明

示例

print(stream,formatSpec,A1,...,An) 将格式化的数据写入输出 stream。该方法使用 formatSpec 格式化操作符来格式化插件(如 TestRunnerPlugin 实例)在数组 A1,...,An 中生成的数据。

对于不是由插件生成的数据,请使用 fprintf 将数据写入文本文件或屏幕,或使用 sprintf 将数据格式化为字符串或字符向量。

输入参数

全部展开

插件定向文本输出的位置,指定为 OutputStream 实例。

输出字段的格式,使用格式化操作符指定。formatSpec 还可以包括普通文本和特殊字符。

如果 formatSpec 包括表示转义字符的字面文本,如 \n,则 print 将转换转义字符。

formatSpec 可以是用单引号引起来的字符向量,也可以是字符串标量。

格式化操作符

格式化操作符以百分号 % 开头,以转换字符结尾。转换字符是必需的。您也可以在 % 和转换字符之间指定标识符、标志、字段宽度、精度和子类型操作符。(操作符之间的空格无效,在这里显示空格只是为了便于阅读。)

Schematic of formatting operator characters.

转换字符

此表显示了要将数值和字符数据格式化为文本的转换字符。

值类型转换详细信息

有符号整数

%d%i

以 10 为基数

无符号整数

%u

以 10 为基数

%o

以 8 为基数(八进制)

%x

以 16 为基数(十六进制),小写字母 af

%X

%x 相同,大写字母 AF

浮点数

%f

定点记数法(使用精度操作符指定小数点后的位数。)

%e

指数记数法,例如 3.141593e+00(使用精度操作符指定小数点后的位数)。

%E

%e 相同,但为大写,例如 3.141593E+00(使用精度操作符指定小数点后的位数)。

%g

更紧凑的 %e%f,不带尾随零(使用精度操作符指定有效数字位数。)

%G

更紧凑的 %E%f,不带尾随零(使用精度操作符指定有效数字位数。)

字符或字符串

%c

单个字符

%s

字符向量或字符串数组。输出文本的类型与 formatSpec 的类型相同。

可选运算符

可选标识符、标志、字段宽度、精度和子类型操作符进一步定义了输出文本的格式。

  • 标识符

    处理函数输入参量的顺序。使用语法 n$,其中 n 代表函数调用中其他输入参量的位置。

    示例:('%3$s %2$s %1$s %2$s','A','B','C') 将输入参量 'A''B''C' 输出为:C B A B

    注意:如果输入参量为数组,则不能使用标识符指定该输入参量中的特定数组元素。

  • 标志

    '–'

    左对齐。
    示例:%-5.2f
    示例:%-10s

    '+'

    始终为任何数值输出符号字符(+ 或 –)。
    示例:%+5.2f
    右对齐文本。
    示例:%+10s

    ' '

    在值之前插入空格。
    示例:% 5.2f

    '0'

    在值之前补零以填充字段宽度。
    例如:%05.2f

    '#'

    修改选定的数值转换:

    • 对于 %o%x%X,将输出 00x0X 前缀。

    • 对于 %f%e%E,即使精度为零也将输出小数点。

    • 对于 %g%G,不删除尾随零或小数点。

    示例:%#5.0f

  • 字段宽度

    要输出的最低字符数。字段宽度操作符可以是数字,也可以是指向输入参量的星号 (*)。

    当您将 * 指定为字段宽度操作符时,其他输入参量必须指定打印宽度和要打印的值。宽度和值可以是参量对组,也可以是数值数组中的对组。使用 * 作为字段宽度操作符时,您可以打印具有不同宽度的不同值。

    示例:输入参量 ('%12d',intmax) 等效于 ('%*d',12,intmax)

    示例:输入参量 ('%*d',[2 10 5 100]) 返回 '10 100',其中两个空格分配给 10,五个空格分配给 100。您也可以将字段宽度和值指定为多个参量,如 ('%*d',2,10,5,100) 中所示。

    除非标志另行指定,否则该函数使用空格填充值之前的字段宽度。

  • 精度

    对于 %f%e%E

    小数点右侧的位数
    示例:'%.4f'pi 输出为 '3.1416'

    对于 %g%G

    有效位数
    示例:'%.4g'pi 输出为 '3.142'

    精度操作符可以是数字,也可以是指向参量的星号 (*)。

    当您将 * 指定为字段精度操作符时,其他输入参量必须指定打印精度和要打印的值。精度和值可以是参量对组,也可以是数值数组中的对组。使用 * 作为精度操作符时,您可以打印具有不同精度的不同值。

    *.* 指定为字段宽度和精度操作符时,必须以三元组形式指定字段宽度、精度和值。

    示例:输入参量 ('%.4f',pi) 等效于 ('%.*f',4,pi)

    示例:输入参量 ('%6.4f',pi) 等效于 ('%*.*f',6,4,pi)

    示例:输入参量 ('%*.*f',6,4,pi,9,6,exp(1)) 返回 '3.1416 2.718282',其中以 96 分别作为 exp(1) 输出的字段宽度和精度。

    注意

    如果您为浮点值指定的精度操作符所表示的精度超出输入数值数据类型的精度,则在指定精度内,结果与输入值可能不匹配。结果取决于您的计算机硬件和操作系统。

  • 子类型

    可以使用子类型操作符将浮点值显示为八进制、十进制或十六进制值。子类型操作符紧邻转换字符之前。此表显示了可使用子类型的转换。

    输入值类型

    子类型和转换字符

    输出值类型

    浮点数

    %bx%bX
    %bo
    %bu

    双精度十六进制、八进制或十进制值
    例如:%bxpi 输出为 400921fb54442d18

    %tx%tX
    %to
    %tu

    单精度十六进制、八进制或十进制值
    例如:%txpi 输出为 40490fdb

格式化操作符前或后的文本

formatSpec 还可以在百分号 % 前添加其他文本,或者在转换字符后添加其他文本。文本可以为:

  • 要打印的普通文本。

  • 您无法作为普通文本输入的特殊字符。此表显示了如何在 formatSpec 中表示特殊字符。

    特殊字符

    表示形式

    单引号

    ''

    百分比字符

    %%

    反斜杠

    \\

    警报

    \a

    退格符

    \b

    换页符

    \f

    换行符

    \n

    回车符

    \r

    水平制表符

    \t

    垂直制表符

    \v

    其 Unicode® 数值可以通过十六进制数 N 表示的字符

    \xN

    示例:print('\x5A') 返回 'Z'

    其 Unicode 数值可以通过八进制数 N 表示的字符

    \N

    示例:print('\132') 返回 'Z'

使用格式化操作符进行转换时要注意的行为

  • 数值转换仅输出复数的实部。

  • 如果指定不适合数据的转换(例如数值的文本转换),MATLAB® 将改写指定的转换并使用 %e

    示例:'%s'pi 转换为 3.141593e+00

  • 如果对整数值应用文本转换(%c%s),MATLAB 会将对应于有效字符代码的值转换为字符。

    示例:'%s'[65 66 67] 转换为 ABC

要显示的数据,指定为数值、字符或字符串数组。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string

属性

Abstracttrue

要了解方法的属性,请参阅方法属性

示例

全部展开

在当前文件夹中的一个文件中,创建名为 ToFigure 的类,该类将插件输出重定向到图窗,并将其显示在该图窗内的一个列表框中。定义 FigureListBox 属性,分别表示图窗和列表框的句柄。

classdef ToFigure < matlab.automation.streams.OutputStream
    
    properties(SetAccess = private)
        Figure
    end
    properties(Access = private)
        ListBox
    end

您必须对 OutputStream 的任何子类实现 print 方法。在此示例中,该方法新建一个图窗(如果需要),格式化传入文本,然后将其添加到输出流中。

    methods
        function print(stream,formatSpec,varargin)
            % Create the figure
            if isempty(stream.Figure) || ~ishghandle(stream.Figure)
                stream.createFigure
            end
            newStr = sprintf(formatSpec,varargin{:});
            oldStr = strjoin(stream.ListBox.String','\n');
            
            % Create the full message
            fullStr = strjoin([oldStr,newStr]);
            fullStrArray = strsplit(fullStr,'\n','CollapseDelimiters',false);
            
            % Set the string and selection
            stream.ListBox.String = fullStrArray';
            stream.ListBox.Value = numel(fullStrArray);
            drawnow
        end
    end

在具有 private 访问权限的 methods 代码块中,实现名为 createFigure 的辅助方法,该方法创建插件使用的图窗和列表框。

    methods(Access = private)
        function createFigure(stream)
            stream.Figure = figure(...
                'Name',         'Unit Test Output',...
                'WindowStyle',  'docked');
            
            stream.ListBox = uicontrol(...
                'Parent',       stream.Figure,...
                'Style',        'listbox',...
                'String',       {},...
                'Units',        'normalized',...
                'Position',     [.05 .05 .9 .9],...
                'Max',          2, ...
                'FontName',     'Monospaced',...
                'FontSize',     13);
        end
    end
end

保存 ToFigure 类。现在,在当前文件夹中,创建一个名为 ExampleTest.m 的文件,其中包含以下测试类。testOne 中的 verifyEqual 鉴定导致测试失败。testTwo 中的验证通过。对应于 testThree 的测试通过,但未产生输出。

classdef ExampleTest < matlab.unittest.TestCase
    methods(Test)
        function testOne(testCase)  % Test fails
            testCase.verifyEqual(5,4,'Testing 5==4');
        end
        function testTwo(testCase)  % Test passes
            testCase.verifyEqual(5,5,'Testing 5==5');
        end
        function testThree(testCase)
            % test code
        end
    end
end

在命令提示符下,基于 ExampleTest 类创建测试套件。

import matlab.unittest.TestRunner
import matlab.unittest.plugins.DiagnosticsValidationPlugin

suite = testsuite('ExampleTest');

创建一个将输出显示到命令行窗口中的测试运行器。

runner = TestRunner.withTextOutput;

创建一个 DiagnosticsValidationPlugin 实例,它显式指定应使用 ToFigure 输出流将其输出定向到图窗。

plugin = DiagnosticsValidationPlugin(ToFigure);

将该插件添加到运行器中并运行测试。

runner.addPlugin(plugin)
result = runner.run(suite);
Running ExampleTest

================================================================================
Verification failed in ExampleTest/testOne.
    ----------------
    Test Diagnostic:
    ----------------
    Testing 5==4
    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyEqual failed.
    --> The numeric values are not equal using "isequaln".
    --> Failure table:
            Actual    Expected    Error    RelativeError
            ______    ________    _____    _____________
                                                        
              5          4          1          0.25     
    
    Actual Value:
         5
    Expected Value:
         4
    ------------------
    Stack Information:
    ------------------
    In C:\work\ExampleTest.m (ExampleTest.testOne) at 4
================================================================================
...
Done ExampleTest
__________

Failure Summary:

     Name                 Failed  Incomplete  Reason(s)
    ==================================================================
     ExampleTest/testOne    X                 Failed by verification.

只有测试失败才在屏幕上产生输出。默认情况下,TestRunner.withTextOutput 使用 DiagnosticsOutputPlugin 在屏幕上显示输出。

除了显示在屏幕上的默认文本输出外,DiagnosticsValidationPlugin 输出还定向到停靠的图窗。该图窗显示此文本。

------------------------------
Validation of Test Diagnostic:
------------------------------
Testing 5==4
------------------------------
Validation of Test Diagnostic:
------------------------------
Testing 5==5

DiagnosticsValidationPlugin 显示诊断信息,而不管测试是否遇到失败条件。

版本历史记录

在 R2014a 中推出

另请参阅

|