double _wcstod_r (struct _reent *ptr, const wchar_t *nptr, wchar_t **endptr) { return _wcstod_l (ptr, nptr, endptr, __get_current_locale ()); }
float _wcstof_r (struct _reent *ptr, const wchar_t *nptr, wchar_t **endptr) { double retval = _wcstod_l (ptr, nptr, endptr, __get_current_locale ()); if (isnan (retval)) return nanf (NULL); return (float)retval; }
extern "C" long double _CRTIMP __cdecl _wcstold_l ( const wchar_t *nptr, wchar_t **endptr, _locale_t plocinfo ) { // delegate to wcstod since double and long double are // both represented by 64 bits in this implementation return _wcstod_l(nptr, endptr, plocinfo); }
typename std::enable_if<std::is_same<CharT,wchar_t>::value,double>::type operator()(const CharT* s, size_t) const { CharT *end = nullptr; double val = _wcstod_l(s, &end, locale_); if (s == end) { JSONCONS_THROW(json_runtime_error<std::invalid_argument>("Convert string to double failed")); } return val; }
inline double string_to_float(const std::wstring& s) { static _locale_t locale = _create_locale(LC_NUMERIC, "C"); const wchar_t* begin = &s[0]; wchar_t* end = const_cast<wchar_t*>(begin)+s.size(); double val = _wcstod_l(begin,&end,locale); if (begin == end) { throw std::invalid_argument("Invalid float value"); } return val; }