2017-12-29 7 views
1

서버에서 일부 데이터를 가져 오기 위해 SOAP 호출을 만들고 PHP에서 사용 가능한 SimpleXML 확장을 사용하여 읽는 중입니다. 자, amount 필드에서이 값이 2.796565248E9과 같이 나오고 round 또는 number_format 함수를 사용하여 전체/십진수로 변환 할 수 있지만 결과는 2 일뿐입니다.PHP에서 지수 숫자 (SimpleXML 객체 문자열)를 십진수로 변환하는 방법

이제 SOAP 호출에서 여러 금액 값을 가져옵니다. 그리고 2.796565248E9, 200.0, 2000.0과 같은 금액 값이 표시됩니다. round 또는 number_format 함수를 사용하면 200.02000.0은 각각 2002000과 같은 적절한 값을 얻습니다. 하지만 2.796565248E9의 경우 2 만 수신 중이며 2796565248이 아니라 예상됩니다.

먼저 I 혼란 이었지만,이 값을 $value->amount 즉 가변 보유하는 것을 덤프 때, I는

object(SimpleXMLElement)#354 (1) { 
    [0]=> string(13) "2.796565248E9" 
} 

지금, I 때문에 그 결과 원하는 표시되지 생각할이 응답을 얻었다. 친절하게 여기 나를 안내. 10 진 후 값을 오프셋 두 번째 인수와

답변

3

당신이 round에 전달하는 값은 PHP 엔진에 의해 함수가 실행되기 전에 떠 캐스팅 할 필요가 명시 적으로 코드에 의해, 또는 암시. 문자열을 전달하면 자동으로 float로 강제 변환되지만 여기에있는 SimpleXMLElement과 같은 객체를 전달하면 대신 int로 변환됩니다.

이것은 PHP bug #53033 (및 거의 중복되지 않음)으로 정리 된 PHP의 내부 문제로 인해 발생했으며 Nikita Popov has fixed for PHP 7.3입니다. 기본적으로 엔진은 "숫자"에 대한 사용자 지정 변환 코드를 가진 개체를 요청할 수있는 방법이 없었기 때문에 float와 int 사이에서 현명하게 선택할 수 없었습니다.

한편, float로 명시 적으로 캐스팅합니다 (예 : $value = round((float)$my_object, $precision);을 사용하면이 문제를 피할 수 있습니다.

엔진이이 상황에서 문자열을 float로 변환해야한다는 것을 알고 있기 때문에 문자열에 캐스팅하는 것이 효과적이므로 SimpleXML에서 추출 할 때 요소 및 속성 앞에 (string)을 추가하는 것이 유용한 일반적인 습관이 될 수 있습니다 . 또한 실수로 세션에서 객체를 직렬화하려고 시도하거나 일부 값 객체에서 액세스 할 수 있기 때문에 필요 이상으로 메모리에 XML을 유지하는 등의 다른 문제는 피할 수 있습니다.

1

해보십시오 라운드() -

round(2.79656,2) 

당신은이 링크를 참조 할 수 있습니다 : - https://www.w3schools.com/php/func_math_round.asp

+0

죄송합니다. 내 시나리오에서 작동하지 않았습니다. –

+0

정수/부동 소수점 값이 아닌 문자열을 반올림하려고 시도했을 수 있습니다. 문자열을 (귀하의 경우) int/float로 변환 한 다음 반올림하려고 시도 했습니까? – groot

+0

W3Schools는 이전보다 약간 끔찍하지만 PHP 함수의 경우 php.net의 공식 참조가 일반적으로 더 나은 리소스입니다. 예 : 이 경우 http : // php.net/round 나는 w3schools [존재하지 않는'delete' 함수에 대한 설명] (https://www.w3schools.com/php/func_filesystem_delete.asp)은 여전히 ​​존재하지만 더 이상 어디서나 링크되지 않은 것으로 보입니다. – IMSoP

1

(float) 사용 도움. 다음 코드를보십시오 :

<?php 
$scientific_str="2.796565248E9"; 
$scientific_num=(float) $scientific_str; 
var_dump($scientific_num); 
+0

효과가있었습니다. 나는'(float)'도 시도했지만, 작동하지 않거나 나는 그것을 간과했을지도 모른다. 그러나 귀하의 솔루션이 효과가 좋았습니다. 어떤 생각, 왜'round' 함수가 내 시나리오에서 작동하지 않는 걸까요? –

+0

이상 하네. '둥근'도 효과가있다. 나는'echo round ('2.796565248E9');를 시도했는데 같은 결과를 준다. – Phil

+0

이'echo round ('2.796565248E9');'를 사용하면 원하는 답변을 얻을 수 있습니다. 그러나 나는 왜 XML에서 데이터를 읽는지, 내 시나리오에서는 작동하지 않는 이유를 모른다. 항상'2'을 얻는다. 전문가에게 조언이 필요합니다. –

관련 문제