fix float point import problem

This commit is contained in:
Mikhail Chusavitin
2026-01-21 11:36:55 +03:00
parent 418788f670
commit 4b9cae2312

View File

@@ -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,