PHP Conference Japan 2024

floatval

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

floatval获取变量的浮点值

描述

floatval(混合 $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)

演示: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),而不显示科学计数法或前导零。

FR : 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
function 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('.', '.', '', '', '', '');

return
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))
{
// 在$str中找到数字,因此将$str设置为该数字
$str = $match[0];

if(
strstr($str, ','))
{
// 存在逗号,这很容易,因为我们假设它分隔小数部分。
$str = str_replace('.', '', $str); // 删除千位分隔符
$str = str_replace(',', '.', $str); // 将','转换为'.'用于floatval命令

return floatval($str);
}
else
{
// 不存在逗号,因此我们必须决定如何处理单个点
if(preg_match("/^[0-9]*[\.]{1}[0-9-]+$/", $str) == TRUE && $set['single_dot_as_decimal'] == TRUE)
{
// 将单个点视为小数分隔符
return floatval($str);

}
else
{
// 否则,将所有点视为千位分隔符
$str = str_replace('.', '', $str); // 删除千位分隔符
return floatval($str);
}
}
}

else
{
// 未找到数字,返回零
return 0;
}
}

// 示例

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

// 小数部分也可以包含'-'
echo float('foo 123,-- bar'); // 返回 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>";
}
?>
[email protected]
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”(逗号用作千位分隔符)。

无论如何,如果您确实想使用它,请不要忘记此函数不处理负数。
[email protected]
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
function 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、strval,而在PHP5中使用类型转换结构(例如`(type) parameter`)。
leprau at leprau dot de
17年前
对于那些正在寻找一个能够从字符串中提取第一个,
且尽可能长的浮点数(或至少是整数)的函数的人,
例如从字符串"Price: 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 the string=0.01333
echo (float)string=0
echo floatval(string)=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
function 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
[email protected]
To Top