diff --git a/src/DataService.php b/src/DataService.php index 5a958c1..5b64010 100644 --- a/src/DataService.php +++ b/src/DataService.php @@ -348,10 +348,14 @@ public function insertMultipleRows(string $schema, string $table, array $rows, a if ($value === null || $value === '' || in_array($value, ['NULL', 'null'], true)) { $value = null; } else { - // Конвертируем форматы дат для date/datetime полей - if (in_array($info['data_type'], ['date', 'datetime', 'timestamp'])) { - $value = $this->convertDateFormat($value); - } + // Конвертируем форматы дат для date/datetime полей + if (in_array($info['data_type'], ['date', 'datetime', 'timestamp'])) { + $value = $this->convertDateFormat($value); + } + // ✅ Конвертируем числовой формат (запятая → точка для decimal/float) + elseif ($this->isNumericType($info['data_type'])) { + $value = $this->convertNumericFormat($value); + } } } else { // Столбца нет в CSV @@ -532,6 +536,68 @@ private function formatRowData(array $rowData): string // Если не удалось распарсить - возвращаем как есть return $date; } + /** + * Проверяет, является ли тип данных числовым + */ + private function isNumericType(string $dataType): bool + { + $numericTypes = [ + 'int', 'tinyint', 'smallint', 'mediumint', 'bigint', + 'decimal', 'float', 'double', 'numeric', 'real' + ]; + + $dataType = strtolower($dataType); + + foreach ($numericTypes as $type) { + if (str_contains($dataType, $type)) { + return true; + } + } + + return false; + } + + /** + * Конвертирует различные форматы чисел в формат MySQL + * Поддерживает: 1234.56, 1234,56, 1.234,56, 1,234.56 + */ + private function convertNumericFormat($value) + { + if ($value === null || $value === '') { + return null; + } + + $value = trim((string)$value); + + // Убираем пробелы (разделители тысяч в некоторых локалях) + $value = str_replace(' ', '', $value); + + // Уже корректный формат (только точка или только цифры) + if (strpos($value, ',') === false) { + return is_numeric($value) ? $value : null; + } + + // Определяем формат по последнему разделителю + $lastCommaPos = strrpos($value, ','); + $lastDotPos = strrpos($value, '.'); + + // Европейский формат: запятая - десятичный разделитель + // Примеры: 1.234,56 или 1234,56 или 1,5 + if ($lastCommaPos > $lastDotPos) { + // Убираем точки (разделители тысяч) + $value = str_replace('.', '', $value); + // Меняем запятую на точку + $value = str_replace(',', '.', $value); + } + // Американский формат: точка - десятичный разделитель + // Примеры: 1,234.56 или 1234.56 + else { + // Убираем запятые (разделители тысяч) + $value = str_replace(',', '', $value); + } + + return is_numeric($value) ? $value : null; + } public function exportCSV( string $schema,