在Matlab中将科学记数法中的数字转换为字符串

时间:2017-07-17 06:25:27

标签: matlab

我想在Matlab中将科学数字转换为字符串,但使用的是相当具体的格式。我从以下开始:

>> num2str(1E4, '%e')

ans =

    '1.000000e+04'

然后使用formatstring来摆脱第一部分小数点后面的数字

>> num2str(1E4, '%.0e')

ans =

    '1e+04'

问题是我想要的确是我在数字中表达的方式,即我想要一个像'1E4'这样的字符串。我可以使用strrep去掉那个加号,但是我拒绝使用它去除+04部分的前导0,因为我有其他变量实例,有+10之类的东西1}}。可以将数字重现为字符串而不需要使用一些复杂的算法吗?最好使用formatstring?

4 个答案:

答案 0 :(得分:0)

<强>解决方案

根据num2str文档,您需要使用format参数和precision参数,如下所示:

num2str(1E4,'%.E')

<强>结果

ans = 1E+04

答案 1 :(得分:0)

了解 sprintf 。 LEt A 是你的号码,为了达到你想要的目的,你可以使用:

sprintf('%1.0e',A)

答案 2 :(得分:0)

这是一种将整数转换为科学记数法的方法:

function out= scientific(num)
    E = 0;
    if mod(num,10) == 0
        [f n]=factor(num);
        E=min(n(ismember(f,[2 5])));
    end
    out = sprintf('%dE%d',num/10^E,E);
end

>> scientific(134)
ans = 134E0
>> scientific(134000)
ans = 134E3

另一种接受输入为vector的解决方案:

function out= scientific2(num)
    E = sum(cumsum(num2str(num(:))-48,2,'reverse')==0,2);
    out = num2str([num(:)./10.^E,E],'%dE%d\n');
end

答案 3 :(得分:0)

您可以使用sprintfregexprep的组合。

inline

示例:

my_format = @(x)regexprep(sprintf('%.E',x),'E\+0*','E');

这并非适用于所有情况:

>> my_format(1E4)

ans =

1E4

>> my_format(2E12)

ans =

2E12

我们可以使用token修复第一个案例:

>> my_format(5) % Expect 5E0

ans =

5E

>> my_format(1E-4) % Expect 1E-4

ans =

1E-04

我们可以使用令牌和? quantifier修复第二种情况:

f2 = @(x)regexprep(sprintf('%.E',x),'E\+0*(\d)','E$1');

>> {f2(1E4), f2(1E20), f2(5)}

ans = 

    '1E4'    '1E20'    '5E0'

使用>> f3 = @(x)regexprep(sprintf('%.E',x),'E\+?(-?)0*(\d)','E$1$2'); >> {f3(1E4), f3(1E20), f3(5),f3(1E-1),f3(2E-12)} ans = '1E4' '1E20' '5E0' '1E-1' '2E-12' 以科学记数法解释sprintf('%.E',x)格式x,例如E,然后找到

1E+04

最后,匹配的文字将替换为'E\+?(-?)0*(\d)' E The literal E \+?(-?) Either a + or a -; if - then save to group $1 0* As many 0s as it can match, subject to... (\d) At least one digit, saves digit to group $2 ,即文字E$1$2,然后是E组(如果找到,则为减号$1,如果找到则为{ {1}})和小组E-(单个数字)。