将价格过帐转换为正确的值插入MySql

时间:2019-04-15 22:09:17

标签: php regex

无法弄清楚如何在mysql数据库中获得正确的输入(DECIMAL 10,2)。

假设人们在输入字段中插入如下数字:

1024,25
1,024,25
1.024.25

甚至是错误和奇怪的错误,例如:

10,24.25
and 10.24,25
or 1,000,000.25
and 1.00,0.000,25

然后使用PHP将所有这些变体转换为以下形式插入数据库:

1024.25 --> for all possible inputs just one **dot** in the number before the cents

number_format以及我尝试过的所有正则表达式均无效。我总是卡在数字的另一种变体上。

到目前为止,我都尝试过所有示例。欢迎任何帮助。

2 个答案:

答案 0 :(得分:4)

  1. 您指定所需的格式。如果不符合该格式,请不要接受该值-请用户进行更正!

  2. 定义您的案例:什么是有效的,只要一点善意就可以接受,什么是无效的?

美国:1,000,000.25

欧盟:1.000.000,25(欧盟大部分地区)

P.S .:对于数据库,您需要使用点作为小数点分隔符。

编辑: 在大多数情况下,声明十进制和千位分隔符,然后从字符串中完全删除千位分隔符就足够了(它没有任何意义,但仅仅是为了提高可读性)。

验证剩余的字符串只有一个十进制分隔符。如果允许数字不带小数点分隔符,则零也将被接受。不多...还要确保,其余仅是数字。

给出所有内容后,您可以将字符串转换为数据库可以理解的格式。

示例代码(尝试一下)

$thousandSeparator = '.';
$decimalSeparator = ',';
$incoming = '1005.666.322,56';
$working = str_replace($thousandSeparator, '', $incoming);
$isOk = preg_match('/^[0-9]+'.($decimalSeparator).'{0,1}[0-9]*$/', $working);
$converted = str_replace($decimalSeparator, '.', $working);
$formatted = number_format($converted, 2, $decimalSeparator, $thousandSeparator);
var_dump($isOk, $incoming, $working, $converted, $formatted);

答案 1 :(得分:0)

我遇到了sprintf,认为我已经解决了。以前从未使用过它,但是可以解决问题。让我知道你的想法。

$num = "1.00,0.000,25";
$num = preg_replace('/[^0-9]/', '', "$num");
$num = sprintf('%.2f', $num / 100);

结果:1​​000000.25

$num = "1,038,25";
$num = preg_replace('/[^0-9]/', '', "$num");
$num = sprintf('%.2f', $num / 100);

结果:1​​038.25