为什么Actionscript对象在php返回的XML输出中转换数字字符串?

时间:2016-04-20 04:35:38

标签: php xml actionscript-3 flex mxml

我正在从flex向我的php后端发送一个POST,而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>

没关系,但是当我通过

访问我的flex返回处理程序中的解析XML字段时
var o:Object = event.result.rs.configuration;

我看到(通过使用FlashDevelop)o.threshold是“90”而不是“90.0”。

我需要“90.0”。为什么会发生这种转换,我该如何阻止呢?

感谢阅读,以及您可以提供的任何见解。

2016年4月20日更新:

感谢第一波评论人员,我很感激。我不想修复小数位,它可能超过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”。我原以为如果“90.0”在XML中并且使用通用对象来访问它,我会看到一个字符串保持90.0(为了它的价值,它也作为TINYTEXT存储在MySQL中,但我不知道看看为什么在XML输出的情况下这应该是重要的)。 90.1和90.18回到90.1和90.18。

我已经知道我可以像对待字符串一样对待它,找一个'。',如果不存在,则将“.0”连接到它,以便我的编辑表单显示我想要的内容。但是什么是比我更聪明的实体决定我的90.0字符串应该存储为90,我该如何告诉它将其删除?

2016/4/21更新

在从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,如果某些东西停止决定我希望它变成一个数字而不是一个字符串,它会更好。

1 个答案:

答案 0 :(得分: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时,才会发生这种情况,这正是您在上面明确做的事情。不过,你说这种情况正在发生,并且会自动发生#34;当您的解析器加载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);
}

此负载的结果&amp;创建操作如下:

A debugger printout of the contents of datum

正如您所看到的,&#34; 90.0&#34;仍然存在并存储为String。这应该是在UI(对于客户)中使用字符串的简单问题,并且当您想要对结果运行计算时,将值转换为Number

我要看看你的解析器。它看起来比你想做的更多。