Add conversion from const char* to float/double

Previously only conversion from std::string to float/double
was possible.
This commit is contained in:
Martchus 2018-09-22 16:47:44 +02:00
parent a6eefc3ab6
commit 3a14d39a14
1 changed files with 27 additions and 0 deletions

View File

@ -484,6 +484,33 @@ IntegralType stringToNumber(const CharType *string, unsigned char base = 10)
return result;
}
/*!
* \brief Converts the given null-terminated \a string to a number assuming \a string uses the specified \a base.
* \tparam FloatingType The data type used to store the converted value.
* \tparam CharType The character type.
* \throws A ConversionException will be thrown if the provided \a string is not a valid number.
* \remarks This function is using std::basic_stringstream interanlly and hence also has its limitations (eg. regarding
* \a base and types).
* \sa numberToString(), bufferToNumber()
* \todo Provide an alternative using std::expected (when switching to C++17).
*/
template <typename FloatingType, class CharType, Traits::EnableIf<std::is_floating_point<FloatingType>> * = nullptr>
FloatingType stringToNumber(const CharType *string, unsigned char base = 10)
{
std::basic_stringstream<CharType> ss;
ss << std::setbase(base) << string;
FloatingType result;
if ((ss >> result) && ss.eof()) {
return result;
}
std::string errorMsg;
errorMsg.reserve(42 + std::char_traits<CharType>::length(string));
errorMsg += "The string \"";
errorMsg += string;
errorMsg += "\" is no valid floating number.";
throw ConversionException(errorMsg);
}
/*!
* \brief Converts the given \a string of \a size characters to an unsigned numeric value using the specified \a base.
* \tparam IntegralType The data type used to store the converted value.