Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2014.09.07;
Скачать: [xml.tar.bz2];

Вниз

Хитроумный 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.002 c
15-1391272847
Митрофанов И.С.
2014-02-01 20:40
2014.09.07
Ошибка закрытия Ms Excel


15-1391245952
Kerk
2014-02-01 13:12
2014.09.07
RTTI


15-1391518862
FizzBazz
2014-02-04 17:01
2014.09.07
Ваш вариант реализации FizzBuzz на Delphi?


15-1391027197
Drowsy
2014-01-30 00:26
2014.09.07
Windows XP - Delphi6 => Windows 7 Full (32) - ?


2-1381517161
martinov2014
2013-10-11 22:46
2014.09.07
Adoconnection





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский