Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP将带空格的字符串数字转换为浮点数_Php_String_Floating Point_Type Conversion - Fatal编程技术网

PHP将带空格的字符串数字转换为浮点数

PHP将带空格的字符串数字转换为浮点数,php,string,floating-point,type-conversion,Php,String,Floating Point,Type Conversion,我有一个带有字段price的类。它以varchar(100)的形式存储在数据库中(不要问我为什么,不是我的想法),我必须检索它并将其除以另一个价格,这个价格也是从数据库中检索的 在数据库中,数字看起来像:1000.00-数千个部分用空格分隔(一百万个看起来像->1000.00) 我在网站w3resource.com/php上试用,并配有在线解释器 我所做的是 $a = "3 999.99"; $b = "1 500.11"; $aa = floatval

我有一个带有字段
price
的类。它以
varchar(100)
的形式存储在数据库中(不要问我为什么,不是我的想法),我必须检索它并将其除以另一个价格,这个价格也是从数据库中检索的

在数据库中,数字看起来像:
1000.00
-数千个部分用空格分隔(一百万个看起来像->
1000.00

我在网站w3resource.com/php上试用,并配有在线解释器

我所做的是

$a = "3 999.99";
$b = "1 500.11";

$aa = floatval(str_replace(' ', '', $a));
$bb = floatval(str_replace(' ', '', $b));

$c = $aa - $bb;
echo $aa . ' - ' . $bb . ' = ' . $c;

$a = "3 999.99";
$b = "1 500.11";

$aa = floatval(str_replace(' ', '', $a));
$bb = floatval(str_replace(' ', '', $b));

$c = $aa - $bb;
echo $aa . ' - ' . $bb . ' = ' . $c;
并显示正确的输出:

3999.99-1500.11=2499.88

但当我在我的项目中这样做时,它就像:

在我的项目中,price被截断——空格之后的所有内容都被截断,并且只对第一个数字执行计算,在我的例子中是:
3-1


有人能告诉我在哪里查找bug吗?

很可能您有一个不可见的字符作为千位分隔符。在清理输入字符串时,过滤除数字和
之外的所有字符更安全。这可以通过
preg\u replace
功能实现

您的脚本可以修改为以下内容:

$a = "3 999.99";
$b = "1 500.11";

$aa = floatval(preg_replace('/[^0-9.]/', '', $a));
$bb = floatval(preg_replace('/[^0-9.]/', '', $b));

$c = $aa - $bb;
echo $aa . ' - ' . $bb . ' = ' . $c;

此外,特别是在处理资金时,使用浮动有点危险和不精确。请查看此存储库,它对解决此问题有很大帮助:

很可能您有一个不可见的字符作为千位分隔符。在清理输入字符串时,过滤除数字和
之外的所有字符更安全。这可以通过
preg\u replace
功能实现

您的脚本可以修改为以下内容:

$a = "3 999.99";
$b = "1 500.11";

$aa = floatval(preg_replace('/[^0-9.]/', '', $a));
$bb = floatval(preg_replace('/[^0-9.]/', '', $b));

$c = $aa - $bb;
echo $aa . ' - ' . $bb . ' = ' . $c;

此外,特别是在处理资金时,使用浮动有点危险和不精确。请查看此存储库,它对解决此问题有很大帮助:

最大的错误是
price
作为
varchar(100)
-它是一个
字符串,可以以一百万种方式显示,但无法重新计算。没有借口。它应该是一个
整数
十进制
,任何减法都应该使用SQL完成

第二个错误是使用
浮点
作为
价格
的值。将php
float
留给天体物理学家,使用
int

$a = "3 999.99";
$b = "1 500.11";

$a1 = (int) preg_replace('/[^0-9]/', '', $a);
$b1 = (int) preg_replace('/[^0-9]/', '', $b);

var_dump($a1, $b1);                         // test
echo'<hr>';

$c1 = $a1 - $b1;

var_dump($a1, $b1, $c1);                    // test

最大的错误是
price
作为
varchar(100)
——它是一个
字符串
,可以以一百万种方式显示,但无法重新计算。没有借口。它应该是一个
整数
十进制
,任何减法都应该使用SQL完成

第二个错误是使用
浮点
作为
价格
的值。将php
float
留给天体物理学家,使用
int

$a = "3 999.99";
$b = "1 500.11";

$a1 = (int) preg_replace('/[^0-9]/', '', $a);
$b1 = (int) preg_replace('/[^0-9]/', '', $b);

var_dump($a1, $b1);                         // test
echo'<hr>';

$c1 = $a1 - $b1;

var_dump($a1, $b1, $c1);                    // test

只需添加
var_dump($aa,$bb)和look outputI建议您将数据库表更改为int,然后将所有值存储为int,而不是float(或float字符串),因为。因此,不是保存
399999.99
,而是将其乘以100,保存
399999
。这将有助于您继续前进,防止可能的浮动问题,并将更容易处理。在db中将价格作为格式化字符串是错误的,这只会增加不必要的复杂性,而不会带来任何好处。我知道将此类值存储为字符串不是一个好主意,也不是一个很奇怪的主意,但我们假设我无法改变这一点-还有什么我可以做的吗@Slava Rozhnew~我甩了它,它告诉我我减去了
3-1
不是我想要的-
3999.99-1500.11
老实说,你应该尽一切可能尽快做出改变。这个问题已经证明了它会引发问题。特别是当我们谈论价格的时候。你现在所做的类似于用管道胶带固定房屋地基上的裂缝。这是一个快速解决方案,但我不想住在那里,甚至不想去参观。如果你不想将值乘以100,你可以使用。因此,不是
$c=$aa-$bb
您可以使用
$c=bcsub($aa,$bb)只需添加
变量转储($aa,$bb)和look outputI建议您将数据库表更改为int,然后将所有值存储为int,而不是float(或float字符串),因为。因此,不是保存
399999.99
,而是将其乘以100,保存
399999
。这将有助于您继续前进,防止可能的浮动问题,并将更容易处理。在db中将价格作为格式化字符串是错误的,这只会增加不必要的复杂性,而不会带来任何好处。我知道将此类值存储为字符串不是一个好主意,也不是一个很奇怪的主意,但我们假设我无法改变这一点-还有什么我可以做的吗@Slava Rozhnew~我甩了它,它告诉我我减去了
3-1
不是我想要的-
3999.99-1500.11
老实说,你应该尽一切可能尽快做出改变。这个问题已经证明了它会引发问题。特别是当我们谈论价格的时候。你现在所做的类似于用管道胶带固定房屋地基上的裂缝。这是一个快速解决方案,但我不想住在那里,甚至不想去参观。如果你不想将值乘以100,你可以使用。因此,不是
$c=$aa-$bb
您可以使用
$c=bcsub($aa,$bb)