@@ -39,13 +39,15 @@ bool CheckStringEquality(const std::string& v1, const std::string& v2,
3939 }
4040 }
4141#if __cpp_lib_to_chars >= 201611L
42- auto [ptr, ec] = std::from_chars (str.data (), str.data () + str.size (), result);
43- return (ec == std::errc ());
42+ const char * end = str.data () + str.size ();
43+ auto [ptr, ec] = std::from_chars (str.data (), end, result);
44+ return ec == std::errc () && ptr == end;
4445#else
4546 try
4647 {
47- result = std::stoi (str);
48- return true ;
48+ std::size_t pos = 0 ;
49+ result = std::stoi (str, &pos);
50+ return pos == str.size ();
4951 }
5052 catch (...)
5153 {
@@ -60,15 +62,26 @@ bool CheckStringEquality(const std::string& v1, const std::string& v2,
6062 return true ;
6163 }
6264 // compare as real numbers next
63- auto ToReal = [](const std::string& str, auto & result) -> bool {
65+ auto ToReal = [enums](const std::string& str, auto & result) -> bool {
66+ if (enums)
67+ {
68+ auto it = enums->find (str);
69+ if (it != enums->end ())
70+ {
71+ result = it->second ;
72+ return true ;
73+ }
74+ }
6475#if __cpp_lib_to_chars >= 201611L
65- auto [ptr, ec] = std::from_chars (str.data (), str.data () + str.size (), result);
66- return (ec == std::errc ());
76+ const char * end = str.data () + str.size ();
77+ auto [ptr, ec] = std::from_chars (str.data (), end, result);
78+ return ec == std::errc () && ptr == end;
6779#else
6880 try
6981 {
70- result = std::stod (str);
71- return true ;
82+ std::size_t pos = 0 ;
83+ result = std::stod (str, &pos);
84+ return pos == str.size ();
7285 }
7386 catch (...)
7487 {
0 commit comments