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

在Matlab中将科学记数法中的数字转换为字符串,matlab,Matlab,我想在Matlab中将一个科学数字转换成一个字符串,但要使用一种非常特殊的格式。我从以下几点开始: >> num2str(1E4, '%e') ans = '1.000000e+04' 然后处理formatstring,去掉第一部分小数点后的数字 >> num2str(1E4, '%.0e') ans = '1e+04' 问题是,我想要的正是我用数字表达它的方式,也就是说,我想要一个像这样的字符串'1E4'。我可以用strrep去掉加号,但我拒

我想在Matlab中将一个科学数字转换成一个字符串,但要使用一种非常特殊的格式。我从以下几点开始:

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

ans =

    '1.000000e+04'
然后处理formatstring,去掉第一部分小数点后的数字

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

ans =

    '1e+04'

问题是,我想要的正是我用数字表达它的方式,也就是说,我想要一个像这样的字符串
'1E4'
。我可以用
strrep
去掉加号,但我拒绝用它去掉
+04
部分的前导0,因为我还有其他变量的实例,比如
+10
。不借助复杂的大算法,把数字复制成字符串是可行的吗?最好使用formatstring?

解决方案

根据文档,您需要使用格式参数和精度参数,如下所示:

num2str(1E4,'%.E')
结果

ans = 1E+04
了解sprintf。让A作为您的号码,为了实现您的目标,您可以使用:

sprintf('%1.0e',A)

下面是一种将整数转换为科学符号的方法:

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
另一种将输入作为向量接受的解决方案:

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

您可以使用和的组合

示例:

>> my_format(1E4)

ans =

1E4

>> my_format(2E12)

ans =

2E12
这并非适用于所有情况:

>> my_format(5) % Expect 5E0

ans =

5E

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

ans =

1E-04
我们可以使用以下方法修复第一个案例:

我们可以用代币和一个:

为了解释,
sprintf('.E',x)
使用
E
,例如
1E+04
,在科学记数法中格式化
x
,然后它发现

'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
(如果找到
E-
,则为减号,如果找到
E+
,则为零)和组
$2
(一位数字)

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'
'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