Thread overview
a function like writeln that returns a string rather than writes to a file
May 02, 2020
dan
May 02, 2020
H. S. Teoh
May 02, 2020
dan
May 02, 2020
dan
May 02, 2020
Ali Çehreli
May 02, 2020
dan
May 02, 2020
I'm looking for a function something like writeln or write, but instead of writing to stdout, it writes to a string and returns the string.

So i would like something like:

import std.stdio;
import std.conv;

string write_to_string(T...)(T values ) {
  string s;
  foreach ( value; values ) s ~= to!string( value );
  return s;
}

But because this is such a standard type of thing to do, i'd like to use whatever the standard function is for doing it, if there is one.

So . . . is there one?  Like maybe some way to dress a string up as a file and pass it through the usual write/writeln apparatus?  My only real requirement is that it be something really easy to do.

Thanks in advance for any pointers.

dan
May 01, 2020
On Sat, May 02, 2020 at 02:22:42AM +0000, dan via Digitalmars-d-learn wrote:
> I'm looking for a function something like writeln or write, but instead of writing to stdout, it writes to a string and returns the string.
[...]

	import std.format : format;
	string str = format("%s %s %s", obj1, obj2, obj3);


T

-- 
Once bitten, twice cry...
May 02, 2020
On Saturday, 2 May 2020 at 02:29:43 UTC, H. S. Teoh wrote:
> On Sat, May 02, 2020 at 02:22:42AM +0000, dan via Digitalmars-d-learn wrote:
>> I'm looking for a function something like writeln or write, but instead of writing to stdout, it writes to a string and returns the string.
> [...]
>
> 	import std.format : format;
> 	string str = format("%s %s %s", obj1, obj2, obj3);
>
>
> T

Thanks HS!

That looks like a good move, if format will do the string conversion for me.

But one thing that would be troublesome is that i would have to make sure to count up the %s so that they match the number of arguments.  I would like to do without that, just like writeln does.

Anyhow, though, thanks for point out format.

dan
May 01, 2020
On 5/1/20 10:40 PM, dan wrote:
> On Saturday, 2 May 2020 at 02:29:43 UTC, H. S. Teoh wrote:
>> On Sat, May 02, 2020 at 02:22:42AM +0000, dan via Digitalmars-d-learn wrote:
>>> I'm looking for a function something like writeln or write, but instead of writing to stdout, it writes to a string and returns the string.
>> [...]
>>
>>     import std.format : format;
>>     string str = format("%s %s %s", obj1, obj2, obj3);
>>
>>
>> T
> 
> Thanks HS!
> 
> That looks like a good move, if format will do the string conversion for me.
> 
> But one thing that would be troublesome is that i would have to make sure to count up the %s so that they match the number of arguments.  I would like to do without that, just like writeln does.

import std.conv: text;

string str = text(obj1, " ", obj2, " ", obj3);

-Steve
May 02, 2020
On Saturday, 2 May 2020 at 02:49:04 UTC, Steven Schveighoffer wrote:
> On 5/1/20 10:40 PM, dan wrote:
>> On Saturday, 2 May 2020 at 02:29:43 UTC, H. S. Teoh wrote:
>>> On Sat, May 02, 2020 at 02:22:42AM +0000, dan via Digitalmars-d-learn wrote:
>>>> [...]
>>> [...]
>>>
>>>     import std.format : format;
>>>     string str = format("%s %s %s", obj1, obj2, obj3);
>>>
>>>
>>> T
>> 
>> Thanks HS!
>> 
>> That looks like a good move, if format will do the string conversion for me.
>> 
>> But one thing that would be troublesome is that i would have to make sure to count up the %s so that they match the number of arguments.  I would like to do without that, just like writeln does.
>
> import std.conv: text;
>
> string str = text(obj1, " ", obj2, " ", obj3);
>
> -Steve

Awesome, thanks Steve.  That's perfect.  So the function i was looking for was text (or, i guess, std.conv.text).

dan
May 02, 2020
On 5/1/20 7:40 PM, dan wrote:> On Saturday, 2 May 2020 at 02:29:43 UTC, H. S. Teoh wrote:
>> On Sat, May 02, 2020 at 02:22:42AM +0000, dan via Digitalmars-d-learn
>> wrote:
>>> I'm looking for a function something like writeln or write, but
>>> instead of writing to stdout, it writes to a string and returns the
>>> string.
>> [...]
>>
>>     import std.format : format;
>>     string str = format("%s %s %s", obj1, obj2, obj3);
>>
>>
>> T
>
> Thanks HS!
>
> That looks like a good move, if format will do the string conversion for
> me.
>
> But one thing that would be troublesome is that i would have to make
> sure to count up the %s so that they match the number of arguments.  I
> would like to do without that, just like writeln does.

If you can live with a mildly awkward way of passing it, format() can take the format string at compile time as well:

  string str = format!"%s %s %s"(obj1, obj2, obj3);

You get a compilation error if format specifications don't match the arguments. (There are bug reports about that check but it mostly works great.)

Ali

May 02, 2020
On Saturday, 2 May 2020 at 10:36:47 UTC, Ali Çehreli wrote:
> On 5/1/20 7:40 PM, dan wrote:> On Saturday, 2 May 2020 at 02:29:43 UTC, H. S. Teoh wrote:
> >> On Sat, May 02, 2020 at 02:22:42AM +0000, dan via
> Digitalmars-d-learn
> >> wrote:
> >>> I'm looking for a function something like writeln or write,
> but
> >>> instead of writing to stdout, it writes to a string and
> returns the
> >>> string.
> >> [...]
> >>
> >>     import std.format : format;
> >>     string str = format("%s %s %s", obj1, obj2, obj3);
> >>
> >>
> >> T
> >
> > Thanks HS!
> >
> > That looks like a good move, if format will do the string
> conversion for
> > me.
> >
> > But one thing that would be troublesome is that i would have
> to make
> > sure to count up the %s so that they match the number of
> arguments.  I
> > would like to do without that, just like writeln does.
>
> If you can live with a mildly awkward way of passing it, format() can take the format string at compile time as well:
>
>   string str = format!"%s %s %s"(obj1, obj2, obj3);
>
> You get a compilation error if format specifications don't match the arguments. (There are bug reports about that check but it mostly works great.)
>
> Ali

Thanks Ali.

That's also a good point, and would remove one of my qualms about all of the %s reps.

So if for any reason i cannot use the text function (or if i want to double check on the types of the objects) this would be a good thing to use.

dan