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

Posted

技术标签:

【中文标题】为啥 Actionscript 对象在我的 php 返回的 XML 输出中转换数字字符串?【英文标题】:Why is the Actionscript object converting the numeric strings in my php-returned XML output?为什么 Actionscript 对象在我的 php 返回的 XML 输出中转换数字字符串? 【发布时间】:2016-08-12 13:07:27 【问题描述】:

我正在从 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 日更新:

感谢第一波 cmets 人,我很感激。我不想修复小数位,它可能超过 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,如果某些东西不再决定我希望它变成数字而不是字符串,那就更好了。

【问题讨论】:

如果您使用var n:Number = Number( event.result.rs.configuration); 会发生什么情况,这会产生 90.0 吗?你不应该定位event.result.rs.configuration.threshhold吗? @VC.One 您的第一个建议不起作用,因为event.result.rs.configuration 不是数字,而是通用对象。建议:var treshhold:Number = Number(event.result.rs.configuration.treshhold); 或者,因为你需要它作为“90.0”,你可能希望将它保留为字符串:treshhold:String = Number(event.result.rs.configuration.treshhold);另一种方法是将其保留为数字(如果您需要它进行计算)并且仅使用 NumberFormatter 更改它的显示方式 @DodgerThud,感谢您的发现。实际上,尽管提问者的问题只是一个四舍五入的问题。 o.threshold 条目很好。真的是90.0。 @Trueskew 考虑var num:Number = Number(o.threshhold).toFixed(1);。无论如何toFixed(n) 是您的解决方案,其中 n 是您所需的小数位。 谢谢大家。我回复了大家,但是有点长,所以我更新了我的问题。 【参考方案1】:

尽管难以理解,字符串的所有数字表示都将解析为最接近的相关非零小数点。所以……

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。然后,在您的 UI 中使用字符串(为客户)应该是一件简单的事情,当您想对结果运行计算时,将值转换为 Number

我会看看你的解析器。它似乎做的比你想要的要多。

【讨论】:

忽略第一次更新,我使用var o:Object = event.result.rs.configuration; 访问传入数据,而您使用var datum:XML = new XML(e.currentTarget.data);。我认为我没有要检查的解析器。我尝试了您提供的内容,但在运行时失败了,因为数据不是属性(我使用的是 Flex 4.5)。但是根据您的提示,我看到event.currentTarget._result.configuration.threshold 在那里,它是“90”。我做了一个新的 XML(event.message.body),可以看到“90.0”成功了。我不知道如何理解它,我将不得不阅读更多内容。自动转换仍然没有意义。谢谢。

以上是关于为啥 Actionscript 对象在我的 php 返回的 XML 输出中转换数字字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Actionscript 中获取对象的属性列表?

Actionscript 3 - 如何在删除该事件后保留该事件的值

为啥 echo 语句没有在我的 PHP 代码中生成任何内容?

Actionscript 3 对象相交时意外修改类属性

为啥我不能在我的 XAMPP 上为这个 PHP 网站设置虚拟主机?

如何解析Actionscript 3中的json对象?