On Friday, 12 May 2017 at 09:03:39 UTC, Jonathan M Davis wrote:
That's the wrong isNumeric. Unfortunately, both std.string and
std.traits have an isNumeric. std.traits.isNumeric is an
eponymous template that tests whether a type is an integral or
floating point type, whereas std.string.isNumeric is a
templated function which tests whether a string (or other range
of characters) represents an integer or floating point literal.
So, std.traits.isNumeric won't work at all for what you want,
and std.string.isNumeric will sort of do what you want - the
main caveat being that it will also accept floating point
values, whereas to!int will not.
So, if you have
auto i = str.isNumeric ? to!int(str).ifThrown(0) : 0;
then it will work but will still throw (and then be caught by
ifThrown) if str is a floating point value. Alternatively, you
could check something like
auto i = str.all!isDigit ? to!int(str).ifThrown(0) : 0;
(where all is in std.algorithm and isDigit is in std.ascii),
and that _almost_ wouldn't need ifThrown, letting you do
auto i = str.all!isDigit ? to!int(str) : 0;
except that str could be an integral value that wouldn't fit in
an int, in which case to!int would throw. But
std.string.isNumeric will work so long as you're willing to
have have an exception be thrown and caught if the string is a
floating point literal.
- Jonathan M Davis
-----------------------------------------------------------------
Thank you for mentioning it. Since I had seen D-conference 2016
in YouTube and it talked about isNumeric in std.traits, then I
used std.traits. and does not worked as I wanted.
But std.string: isNumeric, worked.
string str = "string";
int index = str.isNumeric ? to!int( str ) : 0;
writeln( "index: ", index ); // 0 and without throwing any
exceptions