您可以使用sprintf 和regexprep 的组合。
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 @(一个数字)。