如何让sprintf忽略尾随零

Cit*_*ane 4 matlab printf

我想将一个数字转换为小数点右边最多 15位的字符串.通过顶多我的意思是,如果最后的数字是全零是没用的,打印出来.

例如:

sprintf('%.15f', 3.0001)

==> '3.000100000000000'
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很好,但是这里所有的尾随数字都是零,我会更喜欢:

==> '3.0001' 
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法来使用sprintf格式说明符,或者我应该手动后处理输出以删除尾随零?

注意:我正在使用matlab,以防有任何其他替代方案sprintf.

RTL*_*RTL 9

只需使用g而不是f:

sprintf('%.15g', 3.0001)

ans =

3.0001
Run Code Online (Sandbox Code Playgroud)

doc sprintf

  • %g%e或%f的更紧凑形式,没有尾随零

对于低于0.0001(1e-4)的数字,上述方法失败,在这种情况下,另一种解决方案是使用%f,然后regexprep在这里它替换一个以上的零,后跟一个带空格的空格:

str = sprintf('%.15f ',mat);
str = regexprep(str,'[0]+ ',' ')
Run Code Online (Sandbox Code Playgroud)

此方法还存在一个问题,即数字低于5e-16(这样小数点右边只有15位数的零)删除了这些有效数字.

要解决此问题而不是盲目地替换零,我们可以替换1-9范围内的数字,后跟一个或多个零,然后替换带有该数字后跟空格的空格:

str = sprintf('%.15f ',mat);
str=regexprep(str,'([1-9])[0]+ ','$1 ')
Run Code Online (Sandbox Code Playgroud)