2017-07-17 2540 views
2

我想在Matlab中將科學數字轉換爲字符串,但使用相當具體的格式。我開始與以下幾點:在科學計數法中將數字轉換爲字符串在Matlab中

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

ans = 

    '1.000000e+04' 

然後於formatString發揮各地得到第一部分小數點後襬脫數字

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

ans = 

    '1e+04' 

事情是我想它,我究竟怎麼了用數字表示它,即我想要一個像這樣的字符串'1E4'。我可以使用strrep來擺脫那個加號,但是我拒絕用它來擺脫部分的前導0,因爲我有其他變量的其他實例,如+10。不用一些大的複雜算法就可以將數字再現爲一個字符串?最好使用格式字符串?

回答

0

解決方案

num2str文檔,你需要使用的格式參數和精度參數如下:

num2str(1E4,'%.E') 

結果

ans = 1E+04 
0

閱讀sprintf。讓一個是你的電話號碼,以達到你想要什麼,你可以使用:

sprintf('%1.0e',A) 
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 

接受輸入作爲載體的另一個解決方案:

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

您可以使用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' 

我們可以用令牌和a來修復第二種情況? 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)格式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(負發現E-如果發現E+標誌如果沒有)和組$2(一單個數字)。

相關問題