无法从字符串中删除空格

3

我的脚本读取txt文件,然后将值写入数据库表中。有一个价格字段,在txt文件中,4位数的价格在第一位后有空格(2 500 ex.)。我使用了这个函数(str_replace可以很好地替换逗号,但是当我用它来去除空格时,它无法做到,最后我使用preg_replace,但它也跳过了空格):

$model->price = preg_replace('/\s+/','',str_replace(',', '.', $row_data[3]));

我的表中价格字段的数据类型是varchar,当我使用int或decimal时,它会跳过空格后面的数字(2 070变成2,12 015变成12)。我必须在集成阶段删除这个空格,因为当我对价格字段进行操作时,php会跳过空格后面的数字,导致我的进一步操作出现错误。
问题是什么呢?
更新:@jeroen的解决方案非常好,我将价格字段更改为decimal(10,2),并添加了这行代码来解析价格字符串。
$model->price = filter_var(str_replace(',', '.', $row_data[3]), FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); 
2个回答

2

我不会使用正则表达式,而是使用过滤器来实现:

// replace if necessary
$number = str_replace(',', '.', $row_data[3]);

// filter unwanted characters
$model->price = filter_var($number, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

您需要确保在数据库中更新所有价格,以便可以在数据库本身中切换到数值。


我可以删除已存在的,这不是问题。我应该更改价格的数据类型吗? - Eugene
@Eugene 当然,你可能将来想按价格排序或搜索价格范围,因此数字值始终是首选。整数或小数都可以,但浮点数会导致舍入误差。 - jeroen
空格已经消失,但它现在将我的价格中的'.'去掉了,例如35.75变成了3575。 - Eugene
@Eugene 抱歉,忘记添加正确的标志了。请查看我的编辑和http://php.net/manual/en/filter.filters.sanitize.php。 - jeroen

0

为什么不在空格上使用str_replace呢?这比正则表达式容易得多。

str_replace(array(',', ' '), array('.', ''), $row_data[3]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接