Проверка не должна использовать функции C++ 11 или дополнительные библиотеки, например. Boost, Regex и т. Д. Я придумал следующее решение. Ничего, кроме работы. Получается ли он более элегантным и/или быстрее отсюда?Быстрый способ определить, является ли строка номером JSON
bool isJsonNumber(const std::string& text)
{
if(text.empty()) return false;
bool foundE = false;
bool foundESign = false;
bool leadingZero = false;
bool lastIsDigit = false;
bool foundDot = false;
for(uint32_t i=0; i < text.length(); ++i)
{
const unsigned char c = text[i];
lastIsDigit = false;
const bool currIsNoDigit = (c < '0' || c > '9');
if(i == 0)
{
if(currIsNoDigit && c != '-') return false;
if(c == '0') leadingZero = true;
if(c != '-') lastIsDigit = true;
}
else
{
if(leadingZero)
{
leadingZero = false;
if(c != '.') return false;
foundDot = true;
}
else if(c == '.')
{
if(foundDot) return false;
foundDot = true;
}
else if(c == 'e' || c == 'E')
{
if(foundE) return false;
foundE = true;
}
else if(foundE && !foundESign)
{
if(currIsNoDigit && c != '-' && c != '+') return false;
if(c == '+' || c == '-')
{
foundESign = true;
}
else
{
lastIsDigit = true;
}
}
else
{
foundESign = false;
if(currIsNoDigit) return false;
lastIsDigit = true;
}
}
}
if(lastIsDigit == false) return false;
return true;
}
Прецедент небольшой встроенный сервер, который recieves огромные CSV файлов и anwsers клиентов с частями в формате JSON.
Спецификация JSON описывает числа произвольного размера, которые могут превышать размер двойника. Также Infinity и NaN не являются допустимыми значениями для чисел, то же самое для гекса-десятичных чисел. также std :: stod is C++ 11 – aggsol
Функция std :: strtod не подходит для проверки номера JSON. Спектр можно найти в RFC 4627. Версия OP (возможно) ОК. (Предполагая, что есть соответствующие модульные тесты;)) – CouchDeveloper