Форум: "Начинающим";
Текущий архив: 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