Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.09.07;
Скачать: CL | DM;

Вниз

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

 
mfender   (2013-10-13 03:20) [0]

Назрел незатейливый вопрос по 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, взависимости от того что мне нужно.

Как с этим быть? Есть ли какие-то готовые механизмы проверки?


 
mfender   (2013-10-13 03:38) [1]

Забил такой костыль:

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

Наверное, это самое простое что можно сделать в данном случае.


 
bems ©   (2013-10-13 14:47) [2]

Оно растёт из жаваскрипта, смирись :)


 
robt5   (2013-10-13 21:44) [3]

variant не?


 
KilkennyCat ©   (2013-10-13 22:53) [4]


> Забил такой костыль:

а для кого существует try?
а функции типа strtofloatdef?


 
Ega23 ©   (2013-10-14 14:53) [5]


> variant не?


Тогда уж всё флоатом считать.


 
KilkennyCat ©   (2013-10-14 16:27) [6]


> Ega23 ©   (14.10.13 14:53) [5]

вряд ли, там же максимально значение мантиссы меньше интегера



Страницы: 1 вся ветка

Текущий архив: 2014.09.07;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.006 c
15-1391468915
Кузьмич
2014-02-04 03:08
2014.09.07
Ищу табличку!


15-1391423025
Demo
2014-02-03 14:23
2014.09.07
Проверка на nil


2-1381620042
mfender
2013-10-13 03:20
2014.09.07
Хитроумный TJSONNumber: как определиться с Integer или Float?


15-1391076265
Дмитрий СС
2014-01-30 14:04
2014.09.07
Программа для тренеровки вокала.


15-1391169968
Дмитрий СС
2014-01-31 16:06
2014.09.07
Создать md5 коллизию?