toString or not toString, Pt. II
Paul D. Anderson
paul.d.removethis.anderson at comcast.andthis.net
Wed Aug 31 14:00:10 PDT 2011
Paul D. Anderson Wrote:
> Can someone clarify for me the status and/or direction of string formatting in D?
>
> We've got:
>
> 1. toString, the object method with no parameters.
> 2. toString(sink, format)
> 3. to!String()
> 4. format
> 5. writef/writefln
> 6. write/writeln
>
> I realize these exist for various reasons, some (1,3) are simple (unformatted) conversions, others (2,4-6) are designed to provide configurable formatting. The problem is that they are inconsistent with each other.
>
> Using std.bigint as an example: 1, 3, 4 and 6 don't work, or don't work as expected (to me at least). 1. prints 'BigInt', 3 and 4 are compile errors.
>
> I know bigint is a controversial example because Don has strong feelings against 1 and favors 2. (See bug #5231). I don't really have an opinion one way or the other but I need to know what to implement in my arbitrary-precision floating point module. This obviously relies heavily on bigint.
>
> So, is there a transition underway in the language (or just Phobos) from toString, writeln and format, to toString(sink,format) and writefln?
>
> Or is this just a divergence of views, both of which are acceptable and we'll have to get used to choosing one or the other?
>
> Or am I just mistaken in believing there is any significant conflict?
>
> I apologize if this has already been hashed out in the past and, if so, I would appreciate someone pointing me to that discussion. (Or just the results of the discussion.)
>
> Paul
So, IIUC, toString has its faults but it has deep-rooted user expectations, while toString(sink, format) [or writeTo(sink, format)] is a better implementation, but the current state of development doesn't have a lot of support for it.
With respect to the Java implementation: they provide the two number-to-string functions called out in the specification, i.e., toScientificString and toEngineeringString and use the toScientificString method as the default toString. One of the big advantages of doing this is that the read and write routines are complementary -- writing out a number and reading it back in results in not just the same value, but the same internal representation. (This is one of the goals of the specification.)
Based on this, my proposal for the BigDecimal type is to provide similar functionality -- the two functions listed above, with the first being called by the toString function. In addition the toString(sink, format) function will be provided, and/or whatever it takes to work with format and writef.
I poked around a little in the std.stdio and std.format source code and I see that stdio.writef calls std.format.formattedWrite, so anything that works for the one should work for the other.
I don't know what is required to make to!string work but that is a discussion for another day.
Please advise if I've misunderstood.
Thanks,
Paul
More information about the Digitalmars-d
mailing list