在Matlab中,如何使用formatSpec格式化运算符指定指数中的位数?

时间:2018-01-23 11:56:30

标签: matlab printf precision exponent

我正在使用Matlab中的fprintf命令将数据写入输出文本文件。如何将数字写入输出文件,例如,1.12345678e-001,指数中有三位数

formatSpec = '%1.8e\n';

给出1.12345678e-01,而不是期望的结果!

这里有一个类似的问题 https://se.mathworks.com/matlabcentral/answers/100772-how-do-i-use-fprintf-to-write-numbers-in-exponential-notation-of-variable-exponent-digits-on-a-windo

但按照给出的说明没有解决问题!

3 个答案:

答案 0 :(得分:7)

您可以使用此非正则表达式方法:

num = 0.112345678
pow = floor(log10(abs(num)));
sprintf('%.8fe%+.3d', num/10^pow, pow)

ans =
1.12345678e-001

对于多个输入,请使用:

num= [.123 .456 .789];
pow = floor(log10(abs(num)));
sprintf('%.8fe%+.3d ', [num./10.^pow; pow])

答案 1 :(得分:6)

不确定这是否属于解决方案解决方法的类别,但在此处:

x = .123e25; % example number
formatSpec = '%1.8e\n'; % format specification
s = sprintf(formatSpec, x); % "normal" sprintf
pat = '(?<=e)[+-]\d+'; % regex pattern to detect exponent
s = regexprep(s, pat, sprintf('%+04i', str2double(regexp(s, pat ,'match')))); % zero-pad

它使用正则表达式来标识指数子字符串,并用指数零填充替换为三位数。正指数包括加号,与fprintf一样。

答案 2 :(得分:5)

这不是最干净的答案,但你可以做这样的事情。基本步骤按原样写入,使用正则表达式获取指数,重写该部分,然后替换。

var jsonData = JSON.parse(responseBody)
var parties = jsonData.parties

parties.forEach(function(data) {
    if(data.shippingAddress !== null) {
        postman.setEnvironmentVariable("addressLine1",data.shippingAddress.addressLine1)
    }
})

输出:

formatSpec = '%1.8e'

tempStr = sprintf(formatSpec,1.12345678e-1);
oldExp  = regexp(tempStr,'e[+-]([0-9]+)$','tokens');
newExp  = num2str(str2double(oldExp{1}{1}),'%03d');
fixedStr = regexprep(tempStr,[oldExp{1}{1} '$'],newExp)