题目

编写程序,演示数据与文本双向互转:将浮点数按指定精度格式转换为字符串(<code>num2str</code> 与 <code>sprintf</code>);将数字字符串转回数值(<code>str2double</code>),并演示对无法解析的非法字符串返回 <code>NaN</code> 的容错防御。

输入格式:无需外部输入。

输出格式:输出格式化数字字符串以及反转解析得到的数值。

数据范围与约定:数值与文本转换。

思路与算法

1. num2str 格式化控制
num2str(pi, "%.4f") 能精准控制小数位;而 sprintf 能拼接更复杂的信息模板。

2. str2double 优于 str2num
str2num 底层使用 eval 执行,存在安全注入漏洞且速度较慢;工程规范中强力推荐使用 str2double()。

3. 非法字符容错
str2double("invalid") 遇到解析失败时安全返回 NaN,不会让脚本直接崩溃抛错。

完整程序

% Octave / MATLAB 第73题:数值与文本转换
pi_val = pi;

% 1. 数值转字符串 (控制 4 位小数)
str_pi1 = num2str(pi_val, "%.4f");
str_pi2 = sprintf("圆周率常数是 %.6f", pi_val);

fprintf("num2str 转换: %s (类型: %s)\n", str_pi1, class(str_pi1));
fprintf("sprintf 构造: %s\n", str_pi2);

% 2. 字符串转回数值
raw_str1 = "3.1415926";
raw_str2 = "error_data";

val1 = str2double(raw_str1);
val2 = str2double(raw_str2);

fprintf("\nstr2double(\"3.1415926\") = %.7f (类型: %s)\n", val1, class(val1));
fprintf("str2double(\"error_data\") = %f (非数检测: isnan = %d)\n", val2, isnan(val2));

运行示例

输出:

num2str 转换: 3.1416 (类型: char)
sprintf 构造: 圆周率常数是 3.141593

str2double("3.1415926") = 3.1415926 (类型: double)
str2double("error_data") = NaN (非数检测: isnan = 1)