플로팅 할 PHP 문자열


120

저는 PHP에 전혀 익숙하지 않고 빠른 질문이있었습니다.

2 개의 변수 pricePerUnitInvoicedUnits. 다음은이를 값으로 설정하는 코드입니다.

$InvoicedUnits = ((string) $InvoiceLineItem->InvoicedUnits);
$pricePerUnit = ((string) $InvoiceLineItem->PricePerUnit);

이것을 출력하면 올바른 값을 얻습니다. 말할 수 있습니다 5000청구 단위 및 1.00가격.

이제 총 지출 금액을 표시해야합니다. 이 두 가지를 곱하면 작동하지 않습니다 (예상대로 문자열입니다).

그러나 PHP에서 변수를 구문 분석 / 캐스트 / 변환하는 방법에 대한 단서가 없습니다.

어떻게해야합니까?

답변:


201
$rootbeer = (float) $InvoicedUnits;

당신을 위해해야합니다. Type-Juggling을 확인하십시오 . 또한 문자열을 Numbers로 변환 해야합니다 .


그것의 가장 간단한 방법 .. 그러나 때때로 나는 특정 데이터베이스 설정과 VARCHAR>11길이로 이것을하는 문제에 부딪혔다 . 아직 정확히 왜 그 이유를 좁히지 않았다.
Talvi Watia 2010

2
^ 주목할 가치가있는 것은 (float)가 첫 번째 숫자 인 경우 문자열에서 0을 제거합니다.

또한 "11,000.00"은 예상되는 11000.00 대신 11을 출력합니다
CodeJunkie

64

당신은 원하는 비 로케일 인식 floatval기능 :

float floatval (mixed $ var)-문자열의 float 값을 가져옵니다.

예:

$string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343

4
로케일 인식에 대한 찬사. 난 그냥 일으키는 다른 로케일로 인한 문제가 아래로 1,5h 추적을 보냈다 (float)","로 첫 번째 서버에서 변환하고 ","두 번째에
박사 잔 루이지 젠 Zanettini

23

글쎄, 사용자가 1,00,000을 쓰면 floatvar에 오류가 표시됩니다. 그래서-

floatval(preg_replace("/[^-0-9\.]/","",$input));

이것은 훨씬 더 신뢰할 수 있습니다.

사용법 :

$input = '1,03,24,23,434,500.6798633 this';
echo floatval(preg_replace("/[^-0-9\.]/","",$input));

7
ereg 대신 preg 사용$string=preg_replace("/[^0-9\.\-]/","",$string);
ontananza

4
예, ereg,이 기능은 더 이상 사용되지 않습니다. 따라서 ereg 대신 preg를 사용해야합니다. :)
HADI

9

float에서 마크 업을 처리하는 것은 간단한 작업이 아닙니다. 영어 / 미국식 표기법에서는 1000 플러스 형식을 지정합니다 46*10-2.

1,000.46

그러나 독일에서는 쉼표와 점을 변경합니다.

1.000,46


이로 인해 다국어 응용 프로그램에서 올바른 숫자를 추측하기가 정말 어렵습니다. 이 작업을 위해 Zend 프레임 워크를
사용하는 것이 좋습니다 Zend_Measure. 이 구성 요소는 사용자 언어에 따라 문자열을 부동 소수점으로 구문 분석합니다.


3
요즘 (+3 년) PHP 5.3부터 확장 기능 이있는 NumberFormatter 를 사용할 수 있습니다 intl.
zamnuts 2011

1
내가 질문에 대답했을 때 PHP 5.3을 사용할 수 있었지만 귀하의 의견이 있기 전까지는 비슷한 작업을 수행하는 수십 개의 라이브러리가 있기 때문에이 단일 기능을 인식하지 못했습니다. 그러나 그들은 intl 확장이 가지고있는 것만 큼 좋은 로케일을 가지지 못할 것입니다. 고마워요. 기억해 볼게요.
Tobias P.

1

이 함수를 사용하여 모든 종류의 텍스트 스타일에서 부동 소수점 값을 캐스팅합니다.

function parseFloat($value) {
    return floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,3}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}

이 솔루션은 로케일 설정에 종속되지 않습니다. 따라서 사용자 입력을 위해 사용자는 원하는 방식으로 부동 값을 입력 할 수 있습니다. 이것은 정말 도움이됩니다. 예를 들어 영어로만되어있는 프로젝트가 있지만 전 세계 사람들이 그것을 사용하고 있고 프로젝트가 float 값에 대해 쉼표 대신 점을 원한다는 것을 염두에 두지 않을 수 있습니다. 혼합에 자바 스크립트를 던져 브라우저 기본 설정을 가져올 수 있지만 여전히 많은 사람들이 이러한 값을 영어로 설정했지만 여전히 1.25 대신 1,25를 입력합니다 (특히 번역 산업, 연구 및 IT에만 국한되지 않음).


이것이 왜 나쁜지 / 어디에서 실패하는지에 대한 의견이 있습니까?
Hafenkranich

아니면 더 빠른 유연한 방법이 있습니까?
Hafenkranich 2017-06-30

1
"더 이상 지원되지 않는"e 플래그를 사용합니다. 제 추측입니다.
Leif

0

이 작업을 수행하는 표준 방법에 문제가 있습니다.

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

유효한 숫자가 없으면 파서는 숫자를 반환하지 않아야하며 오류가 발생해야합니다. (이것은 내 코드 YMMV에서 잡으려는 조건입니다)

이 문제를 해결하기 위해 다음을 수행했습니다.

$string = "one";

$float = is_numeric($string) ? (float)$string : null;

echo $float; : ( Prints nothing )

그런 다음 변환을 추가로 처리하기 전에 유효한 문자열 구문 분석이없는 경우 오류를 확인하고 반환 할 수 있습니다.


0

별도로 변환 할 수없는 값을 처리해야하는 경우 다음 방법을 사용할 수 있습니다.

try {
    $valueToUse = trim($stringThatMightBeNumeric) + 0;
} catch (\Throwable $th) {
    // bail here if you need to
}

0

링크 를 따라 PHP에서 문자열 / 숫자를 숫자 / 부동 소수점 / 십진수로 변환하는 방법에 대해 자세히 알아볼 수 있습니다. 이 링크의 내용은 다음과 같습니다.

방법 1 : number_format () 함수 사용. number_format () 함수는 문자열을 숫자로 변환하는 데 사용됩니다. 성공하면 형식화 된 숫자를 반환하고 그렇지 않으면 실패하면 E_WARNING을 제공합니다.

$num = "1000.314"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num), "\n"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num, 2); 

방법 2 : 유형 캐스팅 사용 : 유형 캐스팅은 문자열을 float, double 또는 integer 기본 유형으로 직접 변환 할 수 있습니다. 함수없이 문자열을 숫자로 변환하는 가장 좋은 방법입니다.

// Number in string format 
$num = "1000.314"; 

// Type cast using int 
echo (int)$num, "\n"; 

// Type cast using float 
echo (float)$num, "\n"; 

// Type cast using double 
echo (double)$num; 

방법 3 : intval () 및 floatval () 함수 사용. intval () 및 floatval () 함수를 사용하여 문자열을 각각 해당하는 정수 및 부동 소수점 값으로 변환 할 수도 있습니다.

// Number in string format 
$num = "1000.314"; 

// intval() function to convert  
// string into integer 
echo intval($num), "\n"; 

// floatval() function to convert 
// string to float 
echo floatval($num); 

방법 4 : 0을 더하거나 수학 연산을 수행합니다. 문자열에 0을 추가하여 문자열 번호를 정수 또는 부동 소수점으로 변환 할 수도 있습니다. PHP에서 수학 연산을 수행하면 문자열이 암시 적으로 정수 또는 부동 소수점으로 변환됩니다.

// Number into string format 
$num = "1000.314"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.1;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.