Printing doubles using string manipulation
number_to_sci_string looks ok, though you could considerably improve performance by chucking the template, restricting to float, double and long double and using snprintf:

std::string number_to_sci_string(long double number, int precision) {
    std::string s(std::snprintf(0, 0, "%.*Le", precision-1, number), '\0');
    std::snprintf(&amp;s[0], s.size()+1, "%.*Le", precision-1, number);
    return s;
}


Also, I really wonder why you are using a different notion of precision than the standard library...
I suggest you be a bit more flexible in what you accept:


The exponent e00 should be optional.
The fractional part (and decimal point) .00 should be optional.
If there's a fractional part, the integer part should be optional.

Don't use using namespace std;, even in the implementation-file: You don't control what symbols it contains, and there are no guarantees none are added.
The opening brace of main()'s body is, in contrast to all other functions, on a separate line. Why?
Prefer the for-range-loop to std::for_each+lambda. The compiler should compile both to the same result, but the former is simpler and looks better.