无法弄清楚如何在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以及我尝试过的所有正则表达式均无效。我总是卡在数字的另一种变体上。
到目前为止,我都尝试过所有示例。欢迎任何帮助。
答案 0 :(得分:4)
您指定所需的格式。如果不符合该格式,请不要接受该值-请用户进行更正!
定义您的案例:什么是有效的,只要一点善意就可以接受,什么是无效的?
美国: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);
结果:1000000.25
$num = "1,038,25";
$num = preg_replace('/[^0-9]/', '', "$num");
$num = sprintf('%.2f', $num / 100);
结果:1038.25