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

Reply via email to