如何使用PHP从Excel转换负数

如何使用PHP从Excel转换负数,php,regex,Php,Regex,我使用php将一个“xlsx”文件导入MySQL数据库 在Excel中,数字如下(德语数字格式):2564.30或-2564.30 我将此字符串转换为数字,以便能够在MySQL中将其保存为数字,如下所示: floatval (preg_replace("/[-]?[^-0-9\.]/", "", $row[16])) 数字已导入,但不包括负数。我只得到正数 输出总是 2564.30 不幸的是总是没有负号 我不熟悉正则表达式 更新 抱歉,这些变体都不起作

我使用php将一个“xlsx”文件导入MySQL数据库

在Excel中,数字如下(德语数字格式):2564.30或-2564.30

我将此字符串转换为数字,以便能够在MySQL中将其保存为数字,如下所示:

floatval (preg_replace("/[-]?[^-0-9\.]/", "", $row[16]))
数字已导入,但不包括负数。我只得到正数

输出总是

2564.30
不幸的是总是没有负号

我不熟悉正则表达式

更新 抱歉,这些变体都不起作用

这是Excel中的数字:

在mysql中:

在mysql数据库中,格式为:float(12,2) 下面是import.php中的代码:

您可以使用

preg_replace(“~^-\K|[^-\d.]~”,“,$row[16]”)

细节

  • ^-\K
    -匹配字符串开头的
    -
    ,并忽略匹配项
  • |
    -或
  • [^-\d.]
    -除
    -
    以外的任何字符,`数字和点
见a:

$strs=['2564.30','-2564.30'];
打印(预替换(“~^-\K.[^-\d.]~”,“$strs”);
//=>数组([0]=>2564.30[1]=>2564.30)

试试这个:“/[^-0-9.]/”对于regex

作为使用正则表达式的替代方法,您还可以使用PHP的
NumberFormatter

$formatter=newnumberformatter(“de-de”,NumberFormatter::DECIMAL);
$formatter->parse(“2.564,30”);//给出了2564.3
$formatter->parse(“-2.564,30”);//给出-2564.3
由于
NumberFormatter
是PHP的
Intl
(=国际化)扩展的一部分,它可能已经安装/启用,也可能尚未安装/启用,具体取决于您的PHP版本

如果无法随时提供,请参阅:

有关
NumberFormat
本身,请参阅:


可能相关:您还尝试了哪些解决问题的方法?这看起来是学习TDD的好时机:收集测试用例,编写单元测试以构建“解析器”。我的答案至少不起作用,因为你给出了错误的数字格式——你在原始帖子中给出的是“2564.30”(英文数字格式),屏幕截图(2.817,42)中显示的是德语数字格式。我已经更新了,所以它可以处理后者。请再次编辑您的帖子,使其显示您在Excel文件中实际使用的数字格式,以便提供答案的人有机会调整他们的解决方案。