如何让sprintf忽略尾随零

时间:2014-07-10 09:18:32

标签: matlab printf

我想将数字转换为小数点右侧最多 15位的字符串。通过最多,我的意思是如果最后的数字都是零,则打印它们是没用的。

例如:

sprintf('%.15f', 3.0001)

==> '3.000100000000000'

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

==> '3.0001' 

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

注意:我正在使用matlab,以防有sprintf的任何其他选择。

2 个答案:

答案 0 :(得分:9)

只需使用g代替f

sprintf('%.15g', 3.0001)

ans =

3.0001

来自doc sprintf

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

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

str = sprintf('%.15f ',mat);
str = regexprep(str,'[0]+ ',' ')

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

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

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

答案 1 :(得分:3)

你是说这个吗?

sprintf('%.15g', 3.0001001)
==> 3.0001001
sprintf('%.15g', 3.0001)
==> 3.0001