floatval

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

floatval获取变量的浮点数

描述

floatval(混合类型 $value): 浮点数

获取 value浮点数 值。

参数

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
?>

参见

添加笔记

用户贡献笔记 23 个笔记

121
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
57
匿名
19 年前
您也可以使用类型转换而不是函数

(float) $value;
21
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)
27
PapaPinguoin
12 年前
要查看非常大或非常小的数字(例如来自数据库 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

?>
19
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
?>
8
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);
}
?>
2
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"
?>
2
aa at geb-team dot de
17 年前
@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-]+$/"
3
steve at opilo dot net
16 年前
这里列出的处理 $ 和 , 的大多数函数都过于复杂。您可以使用 ereg_replace() 在一行简单的代码中去除所有会导致 floatval 失败的字符

<?php $output = floatval(ereg_replace("[^-0-9\.]","",$input)); ?>
1
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

?>

大赞。
菲利普
1
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>String</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>";
}
?>
0
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"
0
pierpaolocira
7 年前
请注意最后一次的 tofloat($num)。

理论上,拥有一个“分隔符无关”的函数非常有用(我认为“基于区域设置”的解决方案如果你必须解析一个可能具有与服务器不同的区域设置的用户文件,则毫无用处)。

但这会导致误解;简而言之:“123,456”是“123.456”(所以逗号用作小数点分隔符)或“123456”(逗号用作千位分隔符)。

无论如何,如果你真的想使用它,请不要忘记这个函数不处理负数。
0
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
*/
?>
0
jason at shadonet dot com
21 年前
不用使用 floatval,它只出现在 PHP 4.2 中,你可以使用 $variable = (float)$variable

此函数似乎没有添加任何之前不存在的功能。
-1
zfcb13 at gmail dot com
8 年前
更优雅的函数,可以选择小数点(默认,)
<?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$') ;
?>
-1
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 (芬兰)
-1
iliyazelenkog at gmail dot com
5 年前
(float) 在这里将更有效(快 6 倍)。

intval、floatval、doubleval、strva 用于 PHP4 函数(intval、floatval、doubleval、strval),在 PHP5 中使用类型转换结构(即 '(type) parameter')。
-2
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;
}
?>
-1
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

谢谢
-5
info at marc-gutt dot de
15 年前
<?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()。
-7
ted devito
15 年前
我注意到所有(好吧,除非我漏掉了什么)处理小数的函数都会破坏尾部小数位。这个函数会恢复它们,如果你想为用户显示一致的精度。

<?php
function decimal($val, $precision = 0) {
if ((float)
$val) :
$val = round((float) $val, (int) $precision);
list(
$a, $b) = explode('.', $val);
if (
strlen($b) < $precision) $b = str_pad($b, $precision, '0', STR_PAD_RIGHT);
return
$precision ? "$a.$b" : $a;
else :
// 对没有浮点数的值做你想做的任何事
return $val;
endif;
}
?>
-4
vickers at hotpop dot com
20 年前
floatval() 不适用于 "$35,234.43",因为它无法处理 '$' 和 ','。以下方法可以处理所有值,以便只有数字和小数点符号被输入到 floatval() 中。(它可能表明我是一个老式的 'c' 程序员)...这个函数只做了轻微的测试。

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

对于(
$i=0;$i<$il;$i++) {
$cstr = substr($str, $i, 1);
如果(
is_numeric($cstr) || $cstr == ".")
$flt = $flt.$cstr;
}
返回
floatval($flt);
}
?>

Richard Vickers
[email protected]
To Top