Осторожно баг: JSONGetElement Number
-
- Сообщения: 338
- Зарегистрирован: 11 сен 2017, 13:42
- Откуда: Санкт-Петербург
Осторожно баг: JSONGetElement Number
JSONGetElement возвращает число как текст
этот баг был в версии 16.01 и починен в клиенте в версии 16.02
Вошло ли исправление в обновление для сервера - узнаю завтра, отпишусь
Здесь все достаточно сурово: число, переданное с дробной частью, при извлечении из JSON может быть неправильно распознано.
этот баг был в версии 16.01 и починен в клиенте в версии 16.02
Вошло ли исправление в обновление для сервера - узнаю завтра, отпишусь
Здесь все достаточно сурово: число, переданное с дробной частью, при извлечении из JSON может быть неправильно распознано.
Re: Осторожно баг: JSONGetElement Number
Там наверное как всегда конфликт точек и запятых. Я все через Substitute от греха прогоняю.
-
- Сообщения: 338
- Зарегистрирован: 11 сен 2017, 13:42
- Откуда: Санкт-Петербург
Re: Осторожно баг: JSONGetElement Number
там просто тупо баг. Его осознали и исправили в обновлениях.
В JSON любой текст обрамляется кавычками, любое число записывается без кавычек и разделитель всегда точка, независимо от системных настроек.
Собственно, функция JSONSetElement потому и требует параметра Тип Данных, для того, чтобы правильно записать (с кавычками или без кавычек), а потом правильно извлечь данные.
В 16.01 до исправления число 0.55 извлекалось как "0.55" (что при переводе в число превращает дробь в целое 55 или в дробь 0,55 в зависимости от настроек), более того, целое число 49 извлекалось как "49" и если бы задумали немедленно, без преобразования в число, провести операцию сравнения, то ваш результат был бы меньше 9, например (ибо "49" < 9)/
То есть это принципиальный страшный косяк.
Будьте внимательны и не забывайте обновляться
В JSON любой текст обрамляется кавычками, любое число записывается без кавычек и разделитель всегда точка, независимо от системных настроек.
Собственно, функция JSONSetElement потому и требует параметра Тип Данных, для того, чтобы правильно записать (с кавычками или без кавычек), а потом правильно извлечь данные.
В 16.01 до исправления число 0.55 извлекалось как "0.55" (что при переводе в число превращает дробь в целое 55 или в дробь 0,55 в зависимости от настроек), более того, целое число 49 извлекалось как "49" и если бы задумали немедленно, без преобразования в число, провести операцию сравнения, то ваш результат был бы меньше 9, например (ибо "49" < 9)/
То есть это принципиальный страшный косяк.
Будьте внимательны и не забывайте обновляться
-
- Сообщения: 338
- Зарегистрирован: 11 сен 2017, 13:42
- Откуда: Санкт-Петербург
Re: Осторожно баг: JSONGetElement Number
В реале в JSON нет конфликта точек и запятых (там всегда точка разделитель), чем он мне и нравится и почему я обожаю 16 мейкер.
Re: Осторожно баг: JSONGetElement Number
Кстати.
ExecuteSQL
Тоже возвращает число как текст.
По крайней мере у меня SELECT COUNT(... возвращает число как текст..
ExecuteSQL
Тоже возвращает число как текст.
По крайней мере у меня SELECT COUNT(... возвращает число как текст..
Re: Осторожно баг: JSONGetElement Number
ExecuteSQL вообще по сути всегда возвращает текст. С другой стороны FileMaker неплохо справляется с преобразованием типов на лету.
Re: Осторожно баг: JSONGetElement Number
В продолжение темы..
Столкнулся с таким багом ( я считаю это багом )
$k - результат SQL, в частности 10
Set Value [$k; Value: GetAsNumber ( $к )]
Set Value [$t; Value: GetAsNumber ( $к )]
Set Value [$d; Value: 100]
Set Value [$d1; Value: $d-$k]
Set Value [$d2; Value: $d-$t]
В результате $d1=100 , а $d1=90 ((
FMA16rus, MAC OS 10.13.2
Столкнулся с таким багом ( я считаю это багом )
$k - результат SQL, в частности 10
Set Value [$k; Value: GetAsNumber ( $к )]
Set Value [$t; Value: GetAsNumber ( $к )]
Set Value [$d; Value: 100]
Set Value [$d1; Value: $d-$k]
Set Value [$d2; Value: $d-$t]
В результате $d1=100 , а $d1=90 ((
FMA16rus, MAC OS 10.13.2
Re: Осторожно баг: JSONGetElement Number
у вас в самом примере явные опечатки, поэтому непонятно, что. у вас не работает.
ExecuteSQL возвращает как текст, который (если это в реальности число) можно сразу работать как с цифрой, так как FM преобразует типы на лету. Однако нужно внимательно следить, что именно вернул ExecuteSQL.
Например, есть проблема десятичных знаков - ExecuteSQL, всегда вернет число, с десятичной точкой, вне зависимости от настройки вашей системы. Поэтом если нужны дальнейшие преобразования, то может потребоваться "прогнать" через замену "." на "," - если у вас русские настройки (что скорее всего).
Ну или например, вместо ожидаемого одного числа, из-за некорректного SELECT может вернуться несколько значений (столбиком) - понятно, что ФМ не преобразует подобное корректное, если пытаться работать с таким значением как с цифрой.
ExecuteSQL возвращает как текст, который (если это в реальности число) можно сразу работать как с цифрой, так как FM преобразует типы на лету. Однако нужно внимательно следить, что именно вернул ExecuteSQL.
Например, есть проблема десятичных знаков - ExecuteSQL, всегда вернет число, с десятичной точкой, вне зависимости от настройки вашей системы. Поэтом если нужны дальнейшие преобразования, то может потребоваться "прогнать" через замену "." на "," - если у вас русские настройки (что скорее всего).
Ну или например, вместо ожидаемого одного числа, из-за некорректного SELECT может вернуться несколько значений (столбиком) - понятно, что ФМ не преобразует подобное корректное, если пытаться работать с таким значением как с цифрой.
-
- Сообщения: 338
- Зарегистрирован: 11 сен 2017, 13:42
- Откуда: Санкт-Петербург
Re: Осторожно баг: JSONGetElement Number
1) по описанию это явный баг. Причем настолько нелепый, что поверить в него невозможно. Лучше, если бы нам показали реальный код (скриншот) с результатами исполнения
либо на вывести в кастом диалоге следующие вычисления (одно под другим):
$k
GetAsNumber($k)
$k = GetAsNumber($k)
2)как уже заметил Аркадий, файлмейкер сам производит преобразование переменных при выполнении определенных операций с ними: в числа при выполнении арифметических операций. в строки при применении текстовых функций, в булево при выполнении операций типа NOT, AND, OR, XOR
так что в примере некоторые строки явно лишнее. "A1" + "B2" идентично записи GetAsNumber("A1") + GetAsNumber("B2") потому что сложение - арифметическая операция
либо на вывести в кастом диалоге следующие вычисления (одно под другим):
$k
GetAsNumber($k)
$k = GetAsNumber($k)
2)как уже заметил Аркадий, файлмейкер сам производит преобразование переменных при выполнении определенных операций с ними: в числа при выполнении арифметических операций. в строки при применении текстовых функций, в булево при выполнении операций типа NOT, AND, OR, XOR
так что в примере некоторые строки явно лишнее. "A1" + "B2" идентично записи GetAsNumber("A1") + GetAsNumber("B2") потому что сложение - арифметическая операция