形成sprintf

时间:2015-11-11 17:10:12

标签: string matlab formatting printf

是否可以格式化sprintf的输出,如下所示,或者我应该使用其他功能。

假设我有一个变量dt= 9.765625e-05,我希望使用sprintf来创建一个字符串,以便在保存时说出一个数字

fig = figure(nfig);
plot(x,y);
figStr = sprintf('NS2d_dt%e',dt);
saveas(fig,figStr,'pdf')

标点符号dot给我带来了问题,有些系统错误了文件的格式。

使用

figStr = sprintf('NS2d_dt%.2e',dt);

然后

figStr = NS2d_dt9.77e-05

使用

figStr = sprintf('NS2d_dt%.e',dt);

然后

figStr = NS2d_dt1e-04

这不够精确。我想要这样的东西 使用

figStr = sprintf('NS2d_dt%{??}e',dt);

然后

figStr = NS2d_dt9765e-08

3 个答案:

答案 0 :(得分:1)

基本上,获得所需输出的唯一方法是对值或字符串进行一些操作。所以这里有两个解决方案,首先是一些字符串操作,然后是操纵值。希望这两种方法有助于解决其他问题的解决方案,尤其是数字操作。

字符串操作

解决方案

fmt = @(x) sprintf('%d%.0fe%03d', (sscanf(sprintf('%.4e', x), '%d.%de%d').' .* [1 0.1 1]) - [0 0.5 3]);

说明

首先,我使用sprintf以定义的格式打印数字

>> sprintf('%.4e', dt)
ans =
    9.7656e-05

然后sscanf将其读回来确保删除.e

>> sscanf(sprintf('%.4e', dt), '%d.%de%d').'
ans = 
    9    7656    -5

在打印之前,我们执行一些数据操作以获得正确的打印值

>> (sscanf(sprintf('%.4e', dt), '%d.%de%d').' .* [1 0.1 1]) - [0 0.5 3]
ans = 
    9    765.1    -8

现在我们打印

>> sprintf('%d%.0fe%03d', (sscanf(sprintf('%.4e', dt), '%d.%de%d').' .* [1 0.1 1]) - [0 0.5 3])
ans =
    9765e-08

号码操作

解决方案

orderof = @(x) floor(log10(abs(x)));
fmt = @(x) sprintf('%.0fe%03d', x*(10^(abs(orderof(x))+3))-0.5, orderof(x)-3);

说明

首先,我创建一个匿名orderof函数,它告诉我输入值的顺序(e之后的数字)。所以

>> dt = 9.765625e-05;
>> orderof(dt)
ans =
    -5

接下来我们操纵数字将其转换为4位整数,这是在

中添加3的效果
>> floor(dt*(10^(abs(orderof(dt))+3)))
ans =
    9756

最后在打印值之前,我们需要用

计算出新的指数
>> orderof(x)-3
ans =
    -8

打印将给我们

>> sprintf('%.0fe%03d', floor(dt*(10^(abs(orderof(dt))+3))), orderof(dt)-3)
ans =
    9765e-08

答案 1 :(得分:0)

figStr = sprintf('NS2d_dt%1.4e',dt)
figStr =
NS2d_dt9.7656e-05

将数字(1.4此处)指定为NumbersBeforeDecimal(dot)NumbersAfterDecimal。

关于您的请求:

A = num2str(dt);     %// convert to string
B = A([1 3 4 5]);    %// extract first four digits
C = A(end-2:end);    %// extract power
fspec = 'NS2d_dt%de%d'; %// format spec
sprintf(fspec ,str2num(B),str2num(C)-3)
NS2d_dt9765e-8

答案 2 :(得分:0)

阅读你的问题,

  

标点符号圆点给我带来了问题,有些系统错误了文件的格式。

在我看来,您实际的问题是,当您使用例如

构建文件名时
figStr = sprintf('NS2d_dt%.2e',dt);

你得到了

figStr = NS2d_dt9.77e-05

然后,当您将该字符串用作文件名时,.被解释为扩展名并且.pdf未附加,因此在Explorer中您无法打开文件双击它。

考虑到将dt的数字从9.765e-05更改为9765e-08似乎非常奇怪,您可以尝试以下方法:

  • 使用print功能将您的数字保存在.pdf
  • .pdf说明符
  • 中添加format

这应该允许您拥有正确的文件扩展名和dt值的正确格式。

peaks
figStr = sprintf('NS2d_dt_%.2e.pdf',dt);

print(gcf,'-dpdf', figStr )

希望这有帮助。