PHP函数安全地从字符串返回浮点值

PHP函数安全地从字符串返回浮点值,php,type-conversion,Php,Type Conversion,比如说,我有一个表格,要求提供产品的价格。基本上,我不考虑用户添加数千逗号的情况,即:1000或1000000</p>。 我只考虑用户输入1000或1000,00或1000000,但从来没有1000,或10000000,甚至最坏,10000,0.00,00 < /P>的情况。 我提出了这个函数 function getPrice($price) { if (is_string($price)) { if (strpos($price, ",") !== false) {

比如说,我有一个表格,要求提供产品的价格。基本上,我不考虑用户添加数千逗号的情况,即:1000或1000000</p>。

我只考虑用户输入1000或1000,00或1000000,但从来没有1000,或10000000,甚至最坏,10000,0.00,00 < /P>的情况。 我提出了这个函数

function getPrice($price)
{
    if (is_string($price)) {
        if (strpos($price, ",") !== false) {
            $price = str_replace(',', '.', $price);
        }
    }
    return (is_numeric($price)) ? floatval($price) : false;
}

你认为这个函数是安全的吗?你能指出改进的地方吗?

在我看来,除了最后一行带有
floatval
之外,你的函数看起来还可以

我对这种方法的主要考虑是
PHP
无法正确表示浮点,这要归功于:
floatval
、强制转换为
float
或使用浮点变量的算术运算

例如,
PHP
可以根据精度设置将10000.00转换为9999,99。(您可以在此处了解更多信息)

如果在解析到
FLOAT
(在
getPrice
函数中)之后,您需要将这些价格用于某些算术计算,并且需要精度,那么我的建议是避免解析到
FLOAT
,并且:

  • 将它们保留为字符串,并使用字符串进行计算
  • 使用
    BC MATH
    extension在php中进行更精确的数学操作

@Devon再次阅读问题。。。他没有考虑1000.00的案子,只是1000。00@Jackowski,你说得对,我第一次浏览了一遍。字符串替换是不必要的,floatval已经将
视为十进制分隔符。+1用于考虑精度,我没有这样做。我将删除floatval(),因为我将对该数字进行算术运算。另外,+1表示链接和BC数学扩展。