代码之家  ›  专栏  ›  技术社区  ›  Pillsy

在Mathematica的数字输出中抑制尾随“.”

  •  7
  • Pillsy  · 技术社区  · 16 年前

    是否有一些直接的方法来确保在转换为字符串时,近似的数字(即 Real head)不会有尾随“.”?我希望他们只有小数点的情况下,有实际显示的分数部分。

    我发现的解决方案不可靠,依赖于 Precision Accuracy 在一起 NumberForm 以一种尴尬的方式,或使用 RealDigits 更尴尬的是。

    事先谢谢。

    4 回复  |  直到 10 年前
        1
  •  5
  •   Will Robertson    16 年前

    我以前在用数字显示数字时使用过:

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

    刚刚删除 <> ".0" 如果不希望整数显示为零小数。

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

    移除尾随点的更好方法是使用 Inputform ToString格式:

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

    测试:

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

    这可以并入 Integerise 解决上述问题。

        2
  •  3
  •   dreeves    16 年前

    我建议这样做:

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

    它只是在尾部“.”上执行regex搜索和替换。如果希望“123.”显示为“123.0”而不是“123”,则只需将最后一个空字符串替换为“.0”。

    更新:对于Mathematica默认以科学记数法显示的数字,我的原始版本显示错误。 我用数字形式把它修好了。

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

    (* 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[
      ToString@NumberForm[Round[N@x,r], ExponentFunction->(Null&)], re@"\\.$"->""]
    
        3
  •  1
  •   Cascabel    16 年前

    我可能只是在后期处理字符串。检查最后一个字符是否为“.”比执行冗余算术并考虑所有精度设置更快(也更容易)。

    编辑:也许你知道,但你可以这样做:

    userToString[expr_, form___] := ToString[expr,form];
    
    userToString[expr_Real, form___] := removeTrailingDot[ToString[expr,form]];
    
        4
  •  1
  •   Choronaut    10 年前

    功能 NumberForm , ScientificForm , EngineeringForm 等…提供选项 NumberFormat 编排一个数的尾数、基数和指数的格式和排列。用

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

    将复制默认的Mathematica输出,但删除尾随的点。