From m@ech|er @end|ng |rom @t@t@m@th@ethz@ch  Mon Jun  3 17:04:27 2019
From: m@ech|er @end|ng |rom @t@t@m@th@ethz@ch (Martin Maechler)
Date: Mon, 3 Jun 2019 17:04:27 +0200
Subject: [Rd] Possible bug in formatC
In-Reply-To: <00de01d5169f$e07f2de0$a17d89a0$@rcragun.net>
References: <00de01d5169f$e07f2de0$a17d89a0$@rcragun.net>
Message-ID: <23797.14075.734906.735223@stat.math.ethz.ch>

>>>>> Randy Cragun 
>>>>>     on Thu, 30 May 2019 00:26:38 -0400 writes:

    > I do not know if this is a bug or a case of improper
    > documentation. The documentation for formatC() implies
    > that the difference between the options format="f" and
    > format="g" is that with "g", scientific format is
    > sometimes used. There is another difference between them
    > that is not mentioned in the
    > documentation. drop0trailing=FALSE is ignored when format
    > is set to "g" unless flag contains "#" (this is the
    > documented behavior for format="fg").  For instance, the
    > first line below return " 2.5", whereas the second returns
    > the expected "2.50".

    > formatC(2.50, format="g", digits=3, drop0trailing=F)
    > formatC(2.50, format="g", digits=3, drop0trailing=F, flag="#")

Well, you have a point that this behavior is not documented in
details (and I assume the text reference "Kernighan and Richie"
is less available for the typical R users than in 1995...)

However, formatC() has been unchanged like that for close to 20
years, so we will most probably not change the function's behavior.

Notice that   drop0trailing=FALSE  is really the default
(and format="g" is also the default for non-character / non-integer numbers).

The design of formatC(*) for numbers has entailed to default to
format="g" which drops trailing zeros most of the time
[whereas the format = "f" does not, unless drop0trailing=TRUE is set.]

Lastly, note that 2.50 and 2.5 are exactly identical as R
numbers; so, your two examples above are identical to the much shorter

   formatC(2.5, digits=3)
   formatC(2.5, digits=3, flag="#")

If you want "extraneous" trailing zeros, the "f" format is your
friend most of the time anyway:

> t(sapply(1:8, function(D) formatC(c(2.5,pi), format="f", digits= D)))
     [,1]         [,2]        
[1,] "2.5"        "3.1"       
[2,] "2.50"       "3.14"      
[3,] "2.500"      "3.142"     
[4,] "2.5000"     "3.1416"    
[5,] "2.50000"    "3.14159"   
[6,] "2.500000"   "3.141593"  
[7,] "2.5000000"  "3.1415927" 
[8,] "2.50000000" "3.14159265"
> 

I will add more information to the formatC()  help
page, notably not only mentioning but explaining most of the
'flag's that are available typically(*).

Thank you for raising the issue.

Martin Maechler
ETH Zurich and R Core Team

--
*) as formatC() interfaces to the OS C library, some of the
   availability and meaning of 'flags' is platform dependent.



    > ----------------------
    > sessionInfo():

    > R version 3.5.3 (2019-03-11) Platform:
    > x86_64-w64-mingw32/x64 (64-bit) Running under: Windows >=
    > 8 x64 (build 9200)

    > Matrix products: default

    > locale: [1] LC_COLLATE=English_United States.1252
    > LC_CTYPE=English_United States.1252 [3]
    > LC_MONETARY=English_United States.1252 LC_NUMERIC=C

    > [5] LC_TIME=English_United States.1252

    > attached base packages: [1] stats graphics grDevices utils
    > datasets methods base

    > loaded via a namespace (and not attached): [1]
    > compiler_3.5.3 tools_3.5.3

    > ______________________________________________
    > R-devel at r-project.org mailing list
    > https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] Possible bug in formatC
Martin Maechler