PHP 5.6 SoapClient传递十进制错误


PHP 5.6 SoapClient passing decimal bug

我正在尝试使用SoapClient函数将PHP数组解析为SOAP XML。我必须将一个十进制数解析为SOAP。我的PHP数组看起来像这样:

$contactparams = array(
"DECIMALVARIABLE"=>0.00
);

当执行SOAP调用时,我得到了一个错误,即我应该使用一个带2个小数的十进制数。我猜是PHP函数将0.00转换为普通的0。

抛出错误的示例:

致命错误:未捕获的SoapFault异常:[soap:Client]无效数字2dp值(0)

当我使用0.01时,效果很好。

我已经尝试将其解析为字符串"0.00"&0.00."

我还尝试过使用number_format函数创建0.00,但结果相同。

任何关于如何解开这个谜题的想法都将不胜感激。

经过数小时的搜索,我终于找到了一个狡猾的解决方案。。。

当输入值0.001时,SOAP的函数将其更改为0.00 的正确值

所以:

$contactparams = array(
"DECIMALVARIABLE"=>0.001
);

给出:

DECIMALVALUE=0.00

不是一个干净的解决方案,但它是有效的。。

这个肮脏的技巧可以帮助你理解这个错误是否真的与你的十进制变量有关

<?php
class MySoapClient extends SoapClient
{
    public $decimalValue;
    function __doRequest($request, $location, $action, $version) {
        if (is_null($this->decimalValue) 
            throw new Exception("you forgot to set decimalValue");
        $request = str_replace('#decimalValuePlaceHolder#', $this->decimalValue, $request);
        $ret = parent::__doRequest($request, $location, $action, $version);
        $this->__last_request = $request;
        return $ret;
    } 
}
// usage
$contactparams = array(
    "DECIMALVARIABLE"=>'#decimalValuePlaceHolder#',
);
$client = new MySoapClient(); // initialize this as prev SoapClient
$client->decimalValue = "0.00"; // or number_format($someNumber, 2); // any decimal variable
$client->callFunction(); // call you function as you did before

类型为"shortnumber2dp"的字段必须使用2位小数:0.00而不是0

确保在number_format 中没有传递空字符串

echo "A. ".number_format(null, 2)."'n";
// output 0.00
echo "B. ".number_format(0, 2)."'n";
// output 0.00
echo "C. ".number_format('', 2)."'n";
// error

修复此问题

if(empty($value)){$value = 0;}