3

我使用以下函数将数字转换为字符串以用于显示目的(不要使用科学记数法,不要使用尾随点,按指定舍入):

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

(请注意,这re是 的别名RegularExpression。)

多年来,这一直很好地为我服务。但有时我不想指定要四舍五入的位数,而是想指定一些有效数字。例如,123.456 应显示为 123.5,但 0.00123456 应显示为 0.001235。

为了得到真正的幻想,我可能想在小数点之前和之后指定有效数字。例如,我可能希望 .789 显示为 0.8,但 789.0 显示为 789 而不是 800。

对于这类事情,您是否有一个方便的实用功能,或者对我上面的功能进行概括的建议?

相关:抑制尾随“。” 在 Mathematica 的数值输出中

更新:我试着在这里问这个问题的一般版本:
https ://stackoverflow.com/questions/5627185/displaying-numbers-to-non-technical-users

4

3 回答 3

5

dreeves,我想我终于明白你想要什么了,而且你已经拥有了,差不多。如果没有,请再次尝试解释我所缺少的。

shn2[x_, r_: 0] := 
 StringReplace[
  ToString@NumberForm[x, r, ExponentFunction -> (Null &)], 
  RegularExpression@"\\.0*$" -> ""]

测试:

shn2[#, 4] & /@ {123.456, 0.00123456}
shn2[#, {3, 1}] & /@ {789.0, 0.789}
shn2[#, {10, 2}] & /@ {0.1234, 1234.}
shn2[#, {4, 1}] & /@ {12.34, 1234.56}

Out[1]= {"123.5", "0.001235"}

Out[2]= {"789", "0.8"}

Out[3]= {"0.12", "1234"}

Out[4]= {"12.3", "1235"}
于 2011-03-06T08:22:09.080 回答
1

这可能不是完整的答案(您需要从/转换为字符串),但这个函数需要一个数字xsig想要的有效数字的参数。sig它保留的位数是小数点左侧的最大值或位数。

A[x_,sig_]:=NumberForm[x, Max[Last[RealDigits[x]], sig]]

实数

于 2011-03-06T07:28:23.327 回答
0

这是我原始功能的可能概括。(我已经确定它不等同于向导先生的解决方案,但我还不确定我认为哪个更好。)

re = RegularExpression;

(* Show Number. Convert to string w/ no trailing dot. Use at most d significant
   figures after the decimal point. Target t significant figures total (clipped 
   to be at least i and at most i+d, where i is the number of digits in integer 
   part of x). *)
shn[x_, d_:5, t_:16] := ToString[x]
shn[x_?NumericQ, d_:5, t_:16] := With[{i= IntegerLength@IntegerPart@x},
  StringReplace[ToString@NumberForm[N@x, Clip[t, {i,i+d}],
                                    ExponentFunction->(Null&)],
                re@"\\.$"->""]]

测试:

在这里,我们指定 4 个有效数字,但绝不会在小数点左侧删除任何数字,并且在小数点右侧永远不会使用超过 2 个有效数字。

(# -> shn[#, 2, 4])& /@ 
  {123456, 1234.4567, 123.456, 12.345, 1.234, 1.0001, 0.123, .0001234}

{  123456 -> "123456", 
 1234.456 -> "1234", 
  123.456 -> "123.5"
   12.345 -> "12.35", 
    1.234 -> "1.23", 
   1.0001 -> "1", 
    0.123 -> "0.12", 
0.0001234 -> "0.00012" }
于 2011-03-06T09:43:03.027 回答