【问题标题】:Convert number in scientific notation to string in Matlab在Matlab中将科学计数法中的数字转换为字符串
【发布时间】:2017-07-17 20:18:33
【问题描述】:

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

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

ans =

    '1.000000e+04'

然后在第一部分使用格式字符串来摆脱小数点后的数字

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

ans =

    '1e+04'

问题是我想要我用数字表达它的方式,即我想要一个像'1E4' 这样的字符串。我可以使用strrep 去掉那个加号,但我拒绝用它来去掉+04 部分的前导0,因为我还有其他变量实例,其中包含+10 之类的东西。在不求助于一些大而复杂的算法的情况下将数字复制为字符串是否可行?最好使用格式字符串?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    解决方案

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

    num2str(1E4,'%.E')
    

    结果

    ans = 1E+04
    

    【讨论】:

      【解决方案2】:

      阅读 sprintf 。让A成为你的号码,实现你想要的,你可以使用:

      sprintf('%1.0e',A)
      

      【讨论】:

        【解决方案3】:

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

        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
        

        【讨论】:

          【解决方案4】:

          您可以使用sprintfregexprep 的组合。

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

          例子:

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

          我们可以用token 解决第一个情况:

          f2 = @(x)regexprep(sprintf('%.E',x),'E\+0*(\d)','E$1');
          
          >> {f2(1E4), f2(1E20), f2(5)}
          
          ans = 
          
              '1E4'    '1E20'    '5E0'
          

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

          >> 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)E 用科学计数法格式化x,例如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(如果找到E-,则为减号,如果找到E+则没有)和组@987654343 @(一个数字)。

          【讨论】:

            猜你喜欢
            • 2022-01-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-01
            • 1970-01-01
            • 2015-12-27
            • 2010-09-09
            • 2019-04-22
            相关资源
            最近更新 更多