Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Хитроумный TJSONNumber: как определиться с Integer или Float?

8
13 октября 2013 года
mfender
3.5K / / 15.06.2005
Назрел незатейливый вопрос по TJSONValue. Как известно, он может быть типов TJSONString, TJSONNumber, TJSONObject, TJSONArray, TJSONTrue, TJSONFalse и TJSONNull. Всё хорошо и всё легко привести к нужному типу в Delphi. Но вот, зараза, TJSONNumber портит всё.

Например, парсим строку вида {"Key":"Этот строка"}. Тут он легко соображает, что это TJSONString, и в вариант очень просто запихнуть строку:

 
Код:
procedure TRequestParamObject._SetJSON(const Value: TJSONValue);
var
  V: TJSONValue;
  FParamValue: Variant;
begin
  V := (Value as TJSONObject).Get('Key').JsonValue;
  if V is TJSONString then
    FParamValue := V.Value;
То же самое с прочими. Например, с булями:
{"Key":false}
 
Код:
if (V is TJSONTrue) or (V is TJSONFalse) then
    FParamValue := StrToBool(V.Value);
Но как определиться с числами?
Например, два случая:
{"Key":465746} и {"Key":1254.3658}

В обоих случаях они будут TJSONNumber, и остаётся загадкой, как их интерпретировать, чтобы применить правильную функцию приведения. Например, в первом случае ничего страшного не случится, если я напишу
 
Код:
if V is TJSONNumber then
    FParamValue := StrToFloat(V.Value);
Но вызовет исключение, если приводить StrToInt('1245.3658').

К тому же я сильно заинтересован, чтобы тип в варианте был конкретно varInteger или varDouble, взависимости от того что мне нужно.

Как с этим быть? Есть ли какие-то готовые механизмы проверки?
8
13 октября 2013 года
mfender
3.5K / / 15.06.2005
Забил такой костыль:

 
Код:
if V is TJSONNumber then
 begin
   if Frac(StrToFloat(V.Value)) <> 0 then
     FParamValue := StrToFloat(V.Value)
   else
     FParamValue := StrToInt(V.Value);
 end;

Наверное, это самое простое что можно сделать в данном случае.
326
13 октября 2013 года
sadovoya
757 / / 19.11.2005
Вполне разумно, если только целая часть веществ. числа не превысит емкости инта. Например, 5 000 000 000,0 :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог