fix float point import problem
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user