PHP Conference Japan 2024

floatval

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

floatval取得變數的浮點數值

說明

floatval(mixed $value): float

取得 valuefloat 值。

參數

value

可以是任何純量類型。 floatval() 不應該用於物件,這樣做會發出 E_WARNING 等級的錯誤並返回 1。

返回值

給定變數的浮點數值。空陣列返回 0,非空陣列返回 1。

字串大多數情況下會返回 0,但這取決於字串最左邊的字元。一般的 浮點數轉換 規則仍然適用。

更新日誌

版本 說明
8.0.0 從物件轉換時的錯誤級別已從 E_NOTICE 改為 E_WARNING

範例

範例 #1 floatval() 範例

<?php
$var
= '122.34343The';
$float_value_of_var = floatval($var);
echo
$float_value_of_var; // 122.34343
?>

範例 #2 floatval() 非數字最左邊字元範例

<?php
$var
= 'The122.34343';
$float_value_of_var = floatval($var);
echo
$float_value_of_var; // 0
?>

參見

新增註釋

使用者貢獻的註釋 22 則註釋

brewal dot renault at gmail dot com
10 年前
此函式會採用最後一個逗號或點號(如果有的話)來產生乾淨的浮點數,忽略千位分隔符號、貨幣或任何其他字母。

function tofloat($num) {
$dotPos = strrpos($num, '.');
$commaPos = strrpos($num, ',');
$sep = (($dotPos > $commaPos) && $dotPos) ? $dotPos
((($commaPos > $dotPos) && $commaPos) ? $commaPos : false);

if (!$sep) {
return floatval(preg_replace("/[^0-9]/", "", $num));
}

return floatval(
preg_replace("/[^0-9]/", "", substr($num, 0, $sep)) . '.' .
preg_replace("/[^0-9]/", "", substr($num, $sep+1, strlen($num)))
);
}

$num = '1.999,369€';
var_dump(tofloat($num)); // float(1999.369)
$otherNum = '126,564,789.33 m²';
var_dump(tofloat($otherNum)); // float(126564789.33)

Demo : http://codepad.org/NW4e9hQH
匿名
19 年前
您也可以使用類型轉換而不是函式

(float) $value;
Alexey M
8 年前
處理格式化數字有更簡單的方法

<?php
$str
= '13,232.95';
$var = (double)filter_var($str, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
var_dump($var);
?>
double(13232.95)
PapaPinguoin
13 年前
用於顯示非常大或非常小的數字(例如來自資料庫的 DECIMAL 類型),不顯示科學記號表示法或前導零。

法文:Pour afficher les très grand et très petits nombres (ex. depuis une base de données DECIMAL), sans afficher la notation scientifique, ni les zéros non significatifs.

<?php
function floattostr( $val )
{
preg_match( "#^([\+\-]|)([0-9]*)(\.([0-9]*?)|)(0*)$#", trim($val), $o );
return
$o[1].sprintf('%d',$o[2]).($o[3]!='.'?$o[3]:'');
}
?>
<?php
echo floattostr("0000000000000001");
echo
floattostr("1.00000000000000");
echo
floattostr("0.00000000001000");
echo
floattostr("0000.00010000000");
echo
floattostr("000000010000000000.00000000000010000000000");
echo
floattostr("-0000000000000.1");
echo
floattostr("-00000001.100000");

// 結果
// 1
// 1
// 0.00000000001
// 0.0001
// 10000000000.0000000000001
// -0.1
// -1.1

?>
anonymous at start dot be
20 年前
更容易理解處理逗號問題的函式。

<?php
function Getfloat($str) {
if(
strstr($str, ",")) {
$str = str_replace(".", "", $str); // 將點號(千分位分隔符號)替換為空字串
$str = str_replace(",", ".", $str); // 將逗號替換為點號
}

if(
preg_match("#([0-9\.]+)#", $str, $match)) { // 搜尋可能包含點號的數字
return floatval($match[0]);
} else {
return
floatval($str); // 使用 floatval 進行最後嘗試
}
}

echo
Getfloat("$ 19.332,35-"); // 將會印出:19332.35
?>
chris at georgakopoulos dot com
15 年前
考慮地區設定的 floatval

<?php
function ParseFloat($floatString){
$LocaleInfo = localeconv();
$floatString = str_replace($LocaleInfo["mon_thousands_sep"] , "", $floatString);
$floatString = str_replace($LocaleInfo["mon_decimal_point"] , ".", $floatString);
return
floatval($floatString);
}
?>
secretr at NOSPAM dot e107 dot org
13 年前
setlocale() 和 floatval() 的組合可能會以非常簡單的方式破壞您的資料庫查詢

<?php
setlocale
(LC_ALL, 'bg_BG', 'bgr_BGR');
echo
floatval(0.15); // 輸出 0,15
?>

您需要像這樣的簡單解決方法

<?php
函式 number2db($value)
{
$larr = localeconv();
$search = array(
$larr['decimal_point'],
$larr['mon_decimal_point'],
$larr['thousands_sep'],
$larr['mon_thousands_sep'],
$larr['currency_symbol'],
$larr['int_curr_symbol']
);
$replace = array('.', '.', '', '', '', '');

傳回
str_replace($search, $replace, $value);
}

setlocale(LC_ALL, 'bg_BG', 'bgr_BGR');
$testVal = floatval(0.15); // 結果 0,15
var_dump($testVal, number2db($testVal));

// 結果:
// float(0,15)
// string(4) "0.15"
?>
aa at geb-team dot de
18 年前
@pillepop2003 at yahoo dot de

<?php
float
('-100.00', array('single_dot_as_decimal' => true)); // 哎呀,返回 -10000
?>

使用: "/^[0-9-]*[\.]{1}[0-9-]+$/"
取代: "/^[0-9]*[\.]{1}[0-9-]+$/"
steve at opilo dot net
16 年前
這裡列出的大多數處理 $ 和 , 的函式都過於複雜。您可以使用 ereg_replace() 刪除一行簡單的程式碼中所有會導致 floatval 失敗的字元

<?php $output = floatval(ereg_replace("[^-0-9\.]","",$input)); ?>
pillepop2003 at yahoo dot de
19 年前
使用此程式碼片段從字串中提取任何浮點數。您可以使用 (bool) 'single_dot_as_decimal' 指令選擇如何處理單個點。
此函式應該能夠涵蓋幾乎所有出現在歐洲環境中的浮點數。

<?php

function float($str, $set=FALSE)
{
if(
preg_match("/([0-9\.,-]+)/", $str, $match))
{
// Found number in $str, so set $str that number
$str = $match[0];

if(
strstr($str, ','))
{
// A comma exists, that makes it easy, cos we assume it separates the decimal part.
$str = str_replace('.', '', $str); // Erase thousand seps
$str = str_replace(',', '.', $str); // Convert , to . for floatval command

return floatval($str);
}
else
{
// No comma exists, so we have to decide, how a single dot shall be treated
if(preg_match("/^[0-9]*[\.]{1}[0-9-]+$/", $str) == TRUE && $set['single_dot_as_decimal'] == TRUE)
{
// Treat single dot as decimal separator
return floatval($str);

}
else
{
// Else, treat all dots as thousand seps
$str = str_replace('.', '', $str); // Erase thousand seps
return floatval($str);
}
}
}

else
{
// No number found, return zero
return 0;
}
}

// Examples

echo float('foo 123,00 bar'); // returns 123.00
echo float('foo 123.00 bar' array('single_dot_as_decimal'=> TRUE)); //returns 123.000
echo float('foo 123.00 bar' array('single_dot_as_decimal'=> FALSE)); //returns 123000
echo float('foo 222.123.00 bar' array('single_dot_as_decimal'=> TRUE)); //returns 222123000
echo float('foo 222.123.00 bar' array('single_dot_as_decimal'=> FALSE)); //returns 222123000

// The decimal part can also consist of '-'
echo float('foo 123,-- bar'); // returns 123.00

?>

讚!
Philipp
Michiel
16 年前
最後的 getFloat() 函式並不完全正確。

1.000.000 和 1,000,000 以及它們的負數形式無法被正確解析。為了比較起見,也為了表達清楚,我將新的函式命名為 parseFloat,而不是 getFloat。

<?php
function parseFloat($ptString) {
if (
strlen($ptString) == 0) {
return
false;
}

$pString = str_replace(" ", "", $ptString);

if (
substr_count($pString, ",") > 1)
$pString = str_replace(",", "", $pString);

if (
substr_count($pString, ".") > 1)
$pString = str_replace(".", "", $pString);

$pregResult = array();

$commaset = strpos($pString,',');
if (
$commaset === false) {$commaset = -1;}

$pointset = strpos($pString,'.');
if (
$pointset === false) {$pointset = -1;}

$pregResultA = array();
$pregResultB = array();

if (
$pointset < $commaset) {
preg_match('#(([-]?[0-9]+(\.[0-9])?)+(,[0-9]+)?)#', $pString, $pregResultA);
}
preg_match('#(([-]?[0-9]+(,[0-9])?)+(\.[0-9]+)?)#', $pString, $pregResultB);
if ((isset(
$pregResultA[0]) && (!isset($pregResultB[0])
||
strstr($preResultA[0],$pregResultB[0]) == 0
|| !$pointset))) {
$numberString = $pregResultA[0];
$numberString = str_replace('.','',$numberString);
$numberString = str_replace(',','.',$numberString);
}
elseif (isset(
$pregResultB[0]) && (!isset($pregResultA[0])
||
strstr($pregResultB[0],$preResultA[0]) == 0
|| !$commaset)) {
$numberString = $pregResultB[0];
$numberString = str_replace(',','',$numberString);
}
else {
return
false;
}
$result = (float)$numberString;
return
$result;
}
?>

使用以下函式比較浮點數解析函式

<?php
function testFloatParsing() {
$floatvals = array(
"22 000,76",
"22.000,76",
"22,000.76",
"22 000",
"22,000",
"22.000",
"22000.76",
"22000,76",
"1.022.000,76",
"1,022,000.76",
"1,000,000",
"1.000.000",
"1022000.76",
"1022000,76",
"1022000",
"0.76",
"0,76",
"0.00",
"0,00",
"1.00",
"1,00",
"-22 000,76",
"-22.000,76",
"-22,000.76",
"-22 000",
"-22,000",
"-22.000",
"-22000.76",
"-22000,76",
"-1.022.000,76",
"-1,022,000.76",
"-1,000,000",
"-1.000.000",
"-1022000.76",
"-1022000,76",
"-1022000",
"-0.76",
"-0,76",
"-0.00",
"-0,00",
"-1.00",
"-1,00"
);

echo
"<table>
<tr>
<th>字串</th>
<th>floatval()</th>
<th>getFloat()</th>
<th>parseFloat()</th>
</tr>"
;

foreach (
$floatvals as $fval) {
echo
"<tr>";
echo
"<td>" . (string) $fval . "</td>";

echo
"<td>" . (float) floatval($fval) . "</td>";
echo
"<td>" . (float) getFloat($fval) . "</td>";
echo
"<td>" . (float) parseFloat($fval) . "</td>";
echo
"</tr>";
}
echo
"</table>";
}
?>
T-Soloveychik at ya.ru
7 年前
小於 0.0001 (0.0000999999999999995) 的浮點數值會被 floatval 轉換成科學記號 (指數記號)。
<?php

var_dump
(floatval(0.0000999999999999995)); # >> float(0.0001)

var_dump(floatval("0.000099")); # >> float(9.9E-5)

var_dump((string)floatval(0.000099)); # >> string(6) "9.9E-5"
pierpaolocira
8 年前
請注意最後的 tofloat($num)。

理論上,擁有一個「與分隔符號無關」的函式非常有用(我認為如果必須解析一個可能與伺服器使用不同地區設定的使用者檔案,「基於地區設定」的解決方案是無用的)。

但這可能會導致誤解;簡而言之:「123,456」可以是「123.456」(逗號用作小數點分隔符號)或「123456」(逗號用作千位分隔符號)。

無論如何,如果您真的想使用它,請不要忘記這個函式不處理負數。
zfcb13 at gmail dot com
9 年前
更優雅的函式,可選擇小數點(預設為 ,)
<?php
function floatvaldec($v, $dec=',') { return floatval(ereg_replace("," , "." , ereg_replace("[^-0-9$dec]","",$v))); }

// 範例:
echo '<br>'.floatvaldec('somthing123.456.789,12Euro') ;
echo
'<br>'.floatvaldec('x123,456 789.12 Euro', '.') ;
echo
'<br>'.floatvaldec('123.456 789,12$') ;
?>
Zipi
21 年前
這個函式可以將字串轉換為浮點數,無論小數點分隔符號是點 (.) 還是逗號 (,)。它也可以正確地轉換整數。它會從字串的開頭擷取數字,並忽略所有其他字元。

<?php
函式 floatval($strValue) {
$floatValue = ereg_replace("(^[0-9]*)(\\.|,)([0-9]*)(.*)", "\\1.\\3", $strValue);
if (!
is_numeric($floatValue)) $floatValue = ereg_replace("(^[0-9]*)(.*)", "\\1", $strValue);
if (!
is_numeric($floatValue)) $floatValue = 0;
return
$floatValue;
}
?>

-Zipi (芬蘭)
jason at shadonet dot com
21 年前
与其使用只在 PHP 4.2 出現的 floatval,不如直接使用 $variable = (float)$variable

這個函式似乎沒有增加任何原本沒有的功能。
iliyazelenkog at gmail dot com
6 年前
使用 (float) 的效能會更好(最多可快 6 倍)。

對於 PHP4 函式 intval、floatval、doubleval、strva (intval, floatval, doubleval, strval),在 PHP5 中請使用類型轉換結構 (例如 '(類型) 參數')。
leprau at leprau dot de
17 年前
對於那些正在尋找一個函式,能從字串中擷取第一個,
但盡可能最長的浮點數(或至少是整數)的人來說,
例如從字串 "價格:123,45$" 中擷取 123.45

如果找不到可用的值,函式會返回 false。

會檢查逗號和小數點作為小數點分隔符號,
但不會檢查千位數之間的 3 位數字,
因此 1,234.5 和 1,23,4.5 同樣有效(兩者都會返回 1234.5)

12,.3 將返回 12
1,000,000 將返回 1000.0 !

(如果定義了千位分隔符號,
也應該定義小數點…
事實上,我懶得也去檢查這個)

程式碼如下,歡迎自行優化此函式 ;)
<?php
function getFloat($pString) {
if (
strlen($pString) == 0) {
return
false;
}
$pregResult = array();

$commaset = strpos($pString,',');
if (
$commaset === false) {$commaset = -1;}

$pointset = strpos($pString,'.');
if (
$pointset === false) {$pointset = -1;}

$pregResultA = array();
$pregResultB = array();

if (
$pointset < $commaset) {
preg_match('#(([-]?[0-9]+(\.[0-9])?)+(,[0-9]+)?)#', $pString, $pregResultA);
}
preg_match('#(([-]?[0-9]+(,[0-9])?)+(\.[0-9]+)?)#', $pString, $pregResultB);
if ((isset(
$pregResultA[0]) && (!isset($pregResultB[0])
||
strstr($preResultA[0],$pregResultB[0]) == 0
|| !$pointset))) {
$numberString = $pregResultA[0];
$numberString = str_replace('.','',$numberString);
$numberString = str_replace(',','.',$numberString);
}
elseif (isset(
$pregResultB[0]) && (!isset($pregResultA[0])
||
strstr($pregResultB[0],$preResultA[0]) == 0
|| !$commaset)) {
$numberString = $pregResultB[0];
$numberString = str_replace(',','',$numberString);
}
else {
return
false;
}
$result = (float)$numberString;
return
$result;
}
?>
movila dot e dot v at gmail dot com
8 年前
<?php
$price
= '1.299,00 EUR';
//$price = 'EUR 1.299,00';
//$price = '$1,745.09';
//$price = '$14';
//$price = '$.14';


function floatValue($str){
if(
preg_match("/([0-9\.,-]+)/", $str, $match)){
$value = $match[0];
if(
preg_match("/(\.\d{1,2})$/", $value, $dot_delim) ){
$value = (float)str_replace(',', '', $value);
}
else if(
preg_match("/(,\d{1,2})$/", $value, $comma_delim) ){
$value = str_replace('.', '', $value);
$value = (float)str_replace(',', '.', $value);
}
else
$value = (int)$value;
}
else {
$value = 0;
}
return
$value;
}

echo
floatValue($price);
/*
1.299,00
1.299,00
1,745.09
14
0.14
*/
?>
radler63 at hotmail dot com
6 年前
我得到以下令人困擾的結果
var_dump string(10) "0.01333"
echo 字串=0.01333
echo (float)字串=0
echo floatval(字串)=0

該字串是 array_map('str_getcsv', file(… 的結果
我找不到第 8-10 個字元

謝謝
info at marc-gutt dot de
16 年前
<?php
function floatvalue($value) {
return
floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,2}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}
?>

它更簡短,並且也能處理這些情況
xx,-
xx,--
xx'xxx,xx

使用 floatvalue() 之後,您可以照常使用 number_format()。
vickers at hotpop dot com
20 年前
floatval() 無法處理 "$35,234.43",因為它無法處理 '$' 和 ','。以下程式碼處理所有值,以便只有數字和小數點被輸入到 floatval() 中。(這可能顯示我是一個老派的 'c' 人)... 這個函式只經過輕度測試。

<?php
函式 strtflt($str) {
$il = strlen($str);
$flt = "";
$cstr = "";

for(
$i=0;$i<$il;$i++) {
$cstr = substr($str, $i, 1);
if(
is_numeric($cstr) || $cstr == ".")
$flt = $flt.$cstr;
}
return
floatval($flt);
}
?>

Richard Vickers
vickers@hotpop.com
To Top