Вы можете использовать sscanf и проверить возвращаемое значение, чтобы увидеть, если он сделал что-то полезное, например ::
bool parseValue (const char *buffer, long &value)
{
if (sscanf(buffer,"%ld",&value)==1) return true;
if (sscanf(buffer,"0x%lx",&value)==1) return true;
...
return false;
}
Вы можете легко добавить больше видов форматов в этот список.
Чтобы расширить это и для значений с плавающей запятой, отсканируйте буфер в значение с плавающей запятой, затем приведите или округлите его до целочисленного значения, например:
bool parseValue (const char *buffer, long &value)
{
if (sscanf(buffer,"%ld",&value)==1) return true;
if (sscanf(buffer,"0x%lx",&value)==1) return true;
...
double d;
if (sscanf(buffer,"%lf",&d)==1) {value=d; return true;}
...
return false;
}