typename std::enable_if<std::is_same<CharT,char>::value,double>::type operator()(const CharT* s, size_t length) const { char *end = nullptr; double val = strtold_l(s, &end, locale_); if (s == end) { JSONCONS_THROW(json_runtime_error<std::invalid_argument>("Convert string to double failed")); } return val; }
int soap_s2decimal(struct soap *soap, const char *s, long double *p) { if (s) { if (!*s) return soap->error = SOAP_TYPE; if (!soap_tag_cmp(s, "INF")) *p = (long double)DBL_PINFTY; else if (!soap_tag_cmp(s, "+INF")) *p = (long double)DBL_PINFTY; else if (!soap_tag_cmp(s, "-INF")) *p = (long double)DBL_NINFTY; else if (!soap_tag_cmp(s, "NaN")) *p = (long double)DBL_NAN; else { #if defined(WITH_C_LOCALE) && defined(HAVE_STRTOLD_L) char *r; # ifdef WIN32 *p = _strtold_l(s, &r, SOAP_LOCALE(soap)); # else *p = strtold_l(s, &r, SOAP_LOCALE(soap)); # endif if (*r) #elif defined(HAVE_STRTOLD) char *r; *p = strtold(s, &r); if (*r) #endif #if defined(WITH_C_LOCALE) && defined(HAVE_SSCANF_L) if (sscanf_l(s, SOAP_LOCALE(soap), "%Lg", p) != 1) soap->error = SOAP_TYPE; #elif defined(HAVE_SSCANF) if (sscanf(s, "%Lg", p) != 1) soap->error = SOAP_TYPE; #else soap->error = SOAP_TYPE; #endif } } return soap->error; }