[英]Convert number in scientific notation to string in Matlab
我想在Matlab中將科學數字轉換為字符串,但使用一種相當特定的格式。 我從以下內容開始:
>> num2str(1E4, '%e')
ans =
'1.000000e+04'
然后使用formatstring來消除第一部分中小數點后的數字
>> num2str(1E4, '%.0e')
ans =
'1e+04'
問題是我想要它確切地用數字來表示,即我想要一個像這樣的字符串'1E4'
。 我可以使用strrep
擺脫該加號,但我拒絕使用它擺脫+04
部分的前導0,因為我還有其他變量實例,例如+10
。 將數字重生成為字符串而無需借助一些大的復雜算法是否可行? 最好使用formatstring?
了解有關sprintf的信息 。 LEA 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 = @(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
我們可以用令牌解決第一種情況:
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
(如果找到E-
則為減號,如果找到E+
則E+
)和$2
組(一位數)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.