Suppressing a trailing “.” in numerical output fro

2019-04-25 12:35发布

Is there some straightforward way to ensure that, when converted to strings, approximate numbers (i.e., numbers with the Real head) won't have a trailing "."? I would like it if they were to only have the decimal point in cases where there's actually a displayed fractional part.

The solutions I've found are not robust, and depend on using Precision and Accuracy together NumberForm in an awkward way, or using RealDigits in an even more awkward way.

Thanks in advance.

4条回答
淡お忘
2楼-- · 2019-04-25 12:58

I'd probably just post-process the string. It's faster (and way easier) to just check if the last character is "." than to do redundant arithmetic and take into account all the precision settings.

Edit: maybe you know this, but you can do something like this:

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

userToString[expr_Real, form___] := removeTrailingDot[ToString[expr,form]];
查看更多
混吃等死
3楼-- · 2019-04-25 13:05

I've used this in the past when displaying numbers in figures:

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

Just remove <> ".0" if you don't want integers to be displayed with a zero decimal.

Update: As mentioned by dreeves in the comment, ToString will still truncate a number within 0.0001 or so of an integer and display the dot.

A better way to remove the trailing dot is to use the Inputform format for ToString:

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

with a test:

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

This could be incorporated into Integerise above to fix the problem noted.

查看更多
forever°为你锁心
4楼-- · 2019-04-25 13:09

The functions NumberForm, ScientificForm, EngineeringForm, etc. ... offers the option NumberFormat to format and arrange the mantissa, base and exponent of a number. With

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

the default Mathematica output is reproduced, but the trailing dot is removed.

查看更多
smile是对你的礼貌
5楼-- · 2019-04-25 13:10

I recommend this:

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

It just does a regex search&replace on the trailing ".". If you want "123." to display as "123.0" instead of "123" then just replace that final empty string with ".0".

UPDATE: My original version displayed wrong for numbers that Mathematica by default displays in scientific notation. I fixed that with NumberForm.

Here's the version I actually use in real life. It allows for optional rounding:

(* 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@"\\.$"->""]
查看更多
登录 后发表回答