Bug 5970 – fix BigInt.toString

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
phobos
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2011-05-09T15:27:00Z
Last change time
2012-04-24T19:11:22Z
Keywords
rejects-valid
Assigned to
nobody
Creator
bearophile_hugs

Comments

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.