About to!int
Jonathan M Davis
jmdavisProg at gmx.com
Tue Jan 31 02:09:51 PST 2012
On Monday, January 30, 2012 21:01:38 bearophile wrote:
> In Python int() and float() convert a string into a number even if it
contains some whitespace before and after the number:
> >>> s = " 12\n"
> >>> int(s)
>
> 12
>
> >>> float(s)
>
> 12.0
>
>
> In D to!int(" 12\n") gives a run-time error. So time ago I have weakly
> asked Andrei to change to!int, to let it ignore leading and trailing
> whitespace, but he has ignored my request.
>
> A leading newline comes often from input stdin.readln() and other sources.
> So in D you need to add a strip():
>
> int n = to!int(stdin.readln().strip());
>
> I sometimes forget to add the strip(). Do you know why Andrei has not
> appreciated the idea of to!int and similar functions to ignore leading and
> trailing whitespace?
He's probably completely forgotten about it, and it's the sort of thing that
he's likely to consider bikeshedding at this point - particularly since he's
increasingly against making small changes like this.
Also, the argument can easily be made that " 10 " is _not_ a number. It's a
number surrounded by spaces. In general, std.conv.to does exact conversions,
and to!int(" 10 ") is _not_ an exact conversion, since it includes characters
which are not digits or a leading minus sign. std.conv.parse, on the other
hand, deals with the spaces, because it's parsing the string rather than
converting the whole thing.
Also, if you _want_ to do an exact conversion, and std.conv.to removed the
whitespace for you, then you couldn't use std.conv.to. You'd have to create
your own. On the other hand, if you want to ignore whitespace in the
conversion, you can easily wrap std.conv.to to do it. So, it's more composable
as it is.
There are obviously arguments for having std.conv.to ignore whitespace as well
(you're making them), but at this point, I think that it's simply a matter of
using parse rather than std.conv.to (or stripping the string first) if you want
to ignore whitespace. I don't see std.conv.to changing. And as far Andrei, as
I said, he's increasingly against making small changes like this. He wants
substantial work done, not arguments over shifting around small stuff.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list