为啥 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 3 - 如何在删除该事件后保留该事件的值
为啥 echo 语句没有在我的 PHP 代码中生成任何内容?