Я отправляю POST от flex на свой бэкэнд php, а php-код возвращает это обратно:
<?xml version="1.0" encoding="utf-8">
<rs>
<action>getConfiguration</action>
<num>1</num>
<configuration>
<armed>1</armed>
<threshold>90.0</threshold>
</configuration>
</rs>
Это нормально, но когда я получаю доступ к проанализированным полям XML в моем обработчике возврата через
var o:Object = event.result.rs.configuration;
Я вижу (шагая с FlashDevelop), что o.threshold равен «90» вместо «90.0».
Мне нужен «90.0». Почему происходит это обращение, и как мне его остановить?
Спасибо за чтение и за любые идеи, которые вы можете предоставить.
20.04.2016 Обновление:
Спасибо за первую волну комментариев, ребята, я ценю это. Я не хотел фиксировать десятичные разряды, это может быть больше, чем 1 место (например, 90,25), но я не хочу «90,00». Мне не нужно делать какие-либо математические расчеты, это делается на другом устройстве, но мне нужны .0 вместо цифр, таких как 90.
90.0 идет на форму для редактирования, и я хочу, чтобы это была строка. Я пошел вперед и попробовал это:
// fails
var num:Number = Number(event.result.rs.configuration.threshold);
var num2:Number = Number(o.threshold);
var num3:String = Number(o.threshold).toString();
var num4:String = String(o.threshold).toString();
// works
var num5:String = Number(o.threshold).toFixed(1).toString();
Ничего волшебного не произошло с Number (), что ожидается, так как проверка объекта показала, что он содержит «90». Я ожидал бы, что если в XML есть «90.0» и для доступа к нему используется универсальный объект, я бы увидел строку, содержащую 90.0 (хотя она и стоит, она также хранится в MySQL как TINYTEXT, но я не не понимаю, почему это должно иметь значение, учитывая вывод XML). 90,1 и 90,18 возвращаются как 90,1 и 90,18.
Я уже знал, что могу рассматривать его как строку, искать «.» И, если его нет, объединить «.0», чтобы моя форма редактирования показала, что я хочу. Но что за сущность умнее меня решает, что моя строка 90.0 должна храниться как 90, и как мне сказать, чтобы она вырезалась?
21.04.2016 Обновление
После некоторого построения поиска / угадывания по ответу Atriace я попытался выполнить более атомарно выполненный анализ XML, с
var dataX:String = new XML(event.message.body).toXMLString();
var xmlDoc:XMLDocument = new XMLDocument(dataX);
var decode:SimpleXMLDecoder = new SimpleXMLDecoder(true);
var resultObj:Object = decode.decodeXML(xmlDoc);
и все же я вижу, что resultObj.rs.configuration.threshhold содержит «90». Я тоже попробовал несколько вариантов, тоже самое. Было приятно видеть, что event.message.body имеет 90.0, и было бы еще лучше, если бы что-то перестало решать, что я хочу, чтобы оно превратилось в число вместо строки.
Как бы трудно это ни было проглотить, все числовые представления строк будут преобразованы в ближайшую соответствующую ненулевую десятичную точку. Следовательно…
var a:Number = Number("90.010"); // 90.01
var b:Number = Number("90.000"); // 90
var c:Number = Number("00.100"); // 0.1
var x:String = Number("90.000").toFixed(1); // "90.0"
Имейте в виду, что это происходит только тогда, когда вы разыгрываете String
как Number
, что вы явно делаете выше. Тем не менее, вы сказали, что это происходит «автоматически», когда ваш парсер загружает XML; это сбивает с толку. Заметим:
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE, readXML);
urlLoader.load(new URLRequest("configuration.xml"));
function readXML(e:Event):void {
var datum:XML = new XML(e.currentTarget.data);
}
Результат этой загрузки & Операция создания выглядит следующим образом:
Как видите, «90.0» все еще там и хранится как String
, Затем следует просто использовать строку в вашем пользовательском интерфейсе (для клиента) и привести значение как Number
когда вы хотите выполнить расчеты на результат.
Я бы посмотрел на ваш парсер. Кажется, он делает больше, чем вы хотели.
Других решений пока нет …