While having the ability to convert from string to a decimal is a valid expectation, I do not think it is justified to require that this must be done via a constructor. If not anything else, the author may want to keep the headers smaller and not couple the representation with string parsing.
You may consider from_chars too clumsy, but how do you propose to signal parsing failures given that this library is designed to service environments without exceptions?
If this constructor is to follow the behavior of charconv I think something like this could work: decimal_t (const std::string& str) { decimal_t x {}; const auto r {from_chars(str, x)}; if (!r) *this = NAN; else *this = x; } No exceptions is definitely a large concern as I know a number of the users run exception free environments. Matt