User input parsing

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Oct 14 00:33:13 PDT 2015


On 10/14/2015 12:14 AM, Joel wrote:
> Is there a fast way to get a number out of a text input?
>
> Like getting '1.5' out of 'sdaz1.5;['.
>
> Here's what I have at the moment:
>              string processValue(string s) {
>                  string ns;
>                  foreach(c; s) {
>                      if (c >= '0' && c <= '9')
>                          ns ~= c;
>                      else if (c == '.')
>                          ns ~= '.';
>                  }
>
>                  return ns;
>              }
>

Regular expressions:

import std.stdio;
import std.regex;

void main() {
     auto input = "sdaz1.5;[";
     auto pattern = ctRegex!(`([^-0-9.]*)([-0-9.]+)(.*)`);
     auto m = input.matchFirst(pattern);

     if (m)  {
         assert(m[0] == "sdaz1.5;[");    // whole
         assert(m[1] == "sdaz");         // before
         assert(m[2] == "1.5");          // number
         assert(m[3] == ";[");           // after
     }
}

1) I am not good with regular expressions. So, the floating point 
selector [-0-9.]+ is very primitive. I recommend that you search for a 
better one. :)

2) ctRegex is slow to compile. Replace ctRegex!(expr) with regex(expr) 
for faster compilations and slower execution (probably unnoticeably slow 
in most cases).

3) If you want to extract a number out of a constant string, 
formattedRead (or readf) can be used as well:

import std.stdio;
import std.format;

void main() {
     auto input = "Distance: 1.5 feet";
     double number;

     const quantity = formattedRead(input, "Distance: %f feet", &number);
     assert(number == 1.5);
}

Ali



More information about the Digitalmars-d-learn mailing list