2009-10-09 56 views
7

有没有一些简单的方法可以确保当转换为字符串时,近似数字(即带有Real头的数字)不会有尾随“。”?如果在实际上有显示的小数部分的情况下他们只有小数点,我希望它。抑制尾随“。”在Mathematica的数值输出中

我已经找到了解决方案,是不稳健,并依赖于一个尴尬的方式使用PrecisionAccuracy一起NumberForm,或者在一个更加尴尬的方式使用RealDigits

在此先感谢。

回答

5

我已经在过去的数字显示数字时使用此:

Integerise[x_] := If[Round[x] == x, ToString[[email protected]] <> ".0", [email protected]] 

只是删除<> ".0"如果不希望整数以十进制数显示。

更新:正如dreeves在评论中提到的,ToString仍然会截断整数的0.0001左右的数字并显示该点。

一种更好的方式,以除去尾随点是使用Inputform格式的ToString:与测试

NormalNumber[x_] := ToString[x, InputForm] 

NormalNumber /@ {5, 5.5, 123.001, 123.0001} 

这可以被并入到Integerise以上来解决这个问题指出。

+1

我刚刚试过这个,发现它打破了Integerise [123.0001](它返回一个以尾随“。”结尾的字符串)。 – dreeves 2009-10-14 22:37:51

1

我可能只是后处理字符串。检查最后一个字符是否是“。”会更快(并且更容易)。比做冗余算术并考虑到所有精度设置。

编辑:也许你知道这一点,但你可以做这样的事情:

userToString[expr_, form___] := ToString[expr,form]; 

userToString[expr_Real, form___] := removeTrailingDot[ToString[expr,form]]; 
3

我建议这样的:

shownum[x_] := StringReplace[[email protected][x, ExponentFunction->(Null&)], 
          RegularExpression["\\.$"]->""] 

它只是一个正则表达式搜索&在后代替 “”。如果你想要“123”。显示为“123.0”而不是“123”,则只需用“.0”替换最后一个空字符串。

更新:我的原始版本显示错误的数字,默认情况下Mathematica以科学记数法显示。 我用NumberForm修复了这个问题。

下面是我在现实生活中实际使用的版本。它允许可选的舍入:

(* Show Number. Convert to string w/ no trailing dot. Round to the nearest r. *) 
Unprotect[Round]; Round[x_,0] := x; Protect[Round]; 
re = RegularExpression; 
shn[x_, r_:0] := StringReplace[ 
    [email protected][Round[[email protected],r], ExponentFunction->(Null&)], [email protected]"\\.$"->""] 
+0

这在我的答案中扮演着removeTrailingDot的角色。另外,虽然我当然是一个正则表达式的粉丝,但是直接进行字符串操作会更快 - 检查最后一个字符,如果它是“。”,就放弃它。当然,正则表达式的定制速度更快,也许速度不是问题 - 但这种功能可能会被重复调用很多。 (你也可以编译这个函数 - 如果这个函数和regex一起工作的话,不要知道我的头顶) – Cascabel 2009-10-15 06:36:43

1

功能NumberForm,​​,EngineeringForm ...等提供了选项NumberFormat格式化,并安排数的尾数,基地和指数。随着

numberTrim[expr_] := NumberForm[expr, 
    NumberFormat -> (Row[{StringTrim[#1, "."], 
     If[#3 == "", "", "\[ThinSpace]\[Times]\[ThinSpace]" <> #2^#3]}] &)]; 

默认的Mathematica输出转载,但后点被删除。