Конвертировать цену Опубликовать в правильное значение вставить в MySql - PullRequest
0 голосов
/ 16 апреля 2019

Не могу понять, как получить правильные входные данные в базе данных 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 ]

4 голосов
/ 16 апреля 2019
  1. Вы указываете ожидаемый формат. Если формат не соответствует, НЕ принимайте значение - попросите пользователя исправить его!

  2. Определите ваши дела: что является действительным, что может быть принято с небольшой доброй волей, что является недействительным?

США: 1 000 000,25

ЕС: 1.000.000,25 (большая часть ЕС)

P.S .: Для базы данных вам понадобится точка в качестве десятичного разделителя.

Edit: В большинстве случаев достаточно объявить десятичный разделитель и разделитель тысяч, а затем полностью удалить разделитель тысяч из строки (это не имеет смысла, а просто помогает улучшить читаемость).

Убедитесь, что в оставшейся строке есть только один десятичный разделитель. Если вы разрешите числа без десятичного разделителя, то также будет принят ноль. Не более ... и убедитесь, что остальное только цифры.

Когда все это дано, вы можете преобразовать строку в формат, понятный базе данных.

Пример кода (попробуй сам)

$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);
0 голосов
/ 16 апреля 2019

Я столкнулся с 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...