On Tue, 30 Aug 2011 19:41:37 -0700, Jonathan M Davis wrote: > On Tuesday, August 30, 2011 20:59:06 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.) > > At this point, it's toString with no parameters. Don's completely out in > left field with regards to how things currently work. I believe that > BigInt is the _only_ example of toString(sink, format).
Actually, std.complex.Complex also has toString(sink, format), and Don even fixed the write* functions so that they work with both Complex and BigInt. The following works as you'd expect: BigInt i = "1234567890"; writeln(i); auto z = complex(123.4, 5678.9); writefln("%.10e", z); There is only one important missing piece here: std.conv.to!string should be implemented to call toString with an appropriate sink and "%s" as the format string. -Lars