Comment #0 by bearophile_hugs — 2011-05-09T15:27:23Z
This is in reply to comment #3 of bug 5765
> > How do I perform the equivalent of str(ackermann(4, 2)) with BigInt?
>
> format("%d", ackermann(4,2))
I think it doesn't work with DMD 2.053beta:
import std.bigint, std.string;
void main() {
format("%d", BigInt(1));
}
It prints:
std.format.FormatError: std.format Can't convert std.bigint.BigInt to string: "string toString()" not defined
Comment #1 by bearophile_hugs — 2011-08-24T18:59:13Z
import std.bigint, std.conv;
void main() {
string s = text(BigInt(1));
}
In DMD 2.055beta it gives:
...\src\phobos\std\conv.d(829): Error: function std.bigint.BigInt.toString (void delegate(const(char)[]) sink, string formatString) const is not callable using argument types ()
...\src\phobos\std\conv.d(829): Error: expected 2 function arguments, not 0
See also notes in bug 4122 :
My suggestion is to change the signature of BigInt.toString() from this:
void toString(void delegate(const (char)[]) sink, string formatString) const {
To something like this:
string toString(void delegate(string) sink=null, string formatString="d") const
{
And make it return a string filled with the decimal representation when sink is
null; and to return an empty string when sink!=null.
--------
Eventually the signature can even become:
string toString(void delegate(string) sink=null, string formatString="d",
string thousands="") const {
So if thousands="_" the number gets represented as:
"100_000_000_000"
But this is less essential.
Comment #2 by timon.gehr — 2011-08-24T19:38:02Z
alternatively, just provide another overload.
bi.toString(), where bi is a BigInt should just work and return a newly allocated string that represents bi.
(The current toString would actually better be called writeTo. Format string should default to null in each case.)
Comment #3 by clugdbug — 2011-08-25T01:27:40Z
(In reply to comment #0)
> This is in reply to comment #3 of bug 5765
>
> > > How do I perform the equivalent of str(ackermann(4, 2)) with BigInt?
> >
> > format("%d", ackermann(4,2))
>
> I think it doesn't work with DMD 2.053beta:
>
>
> import std.bigint, std.string;
> void main() {
> format("%d", BigInt(1));
> }
>
>
> It prints:
> std.format.FormatError: std.format Can't convert std.bigint.BigInt to string:
> "string toString()" not defined
You're right. writefln() works, but format() doesn't:
import std.bigint, std.stdio;
void main() {
writefln("%d %x", BigInt(114), BigInt(114)); // works
}
A bit strange, since writefln() should really be using format().
Comment #4 by k.hara.pg — 2011-08-25T01:40:12Z
(In reply to comment #3)
> A bit strange, since writefln() should really be using format().
It is not true. std.string.format() still uses std.format.doFormat(), not formattedWrite().
I think that is old feature.
Comment #5 by bearophile_hugs — 2011-08-25T01:53:06Z
See also bug 6448
Comment #6 by bearophile_hugs — 2012-04-24T19:11:22Z
This works correctly:
import std.bigint, std.string, std.stdio;
void main() {
writeln(xformat("%d", BigInt(1)));
}
Change discussed here:
https://github.com/D-Programming-Language/phobos/pull/231
So format() is to be considered obsolete (and eventually deprecated and removed, I presume). So I close this issue.