Преобразования чисел Excel на регионе Eng
Столкнулся с тем, что у пользователя не загружаются из Excel числа более 1000. Считываю Excel через табличный документ, чтение значений как текста, потом преобразовываю строковой функцией в число.
Отладка была невозможна, пришлось добавить в функцию конвертации протоколирование, чтобы понять, в чем проблема:
Функция ЧислоИзСтроки(Знач С) Экспорт СИсх = С; С = ПолностьюУдалитьСимвол(С, " "); С = ПолностьюУдалитьСимвол(С, Символы.НПП); С = СтрЗаменить(С, ",", "."); Если С = "" Тогда Возврат 0; КонецЕсли; //Если есть несколько точек, заменяем на одну 24.000.00 => 24.000; Пока Истина Цикл Поз = Найти(С, "."); Если Поз <> 0 И Найти(Сред(С, Поз + 1), ".") <> 0 Тогда С = Лев(С, Поз - 1) + Сред(С, Поз + 1); Иначе Прервать; КонецЕсли; КонецЦикла; Если ПротоколироватьПреобразованияЧисел Тогда Сообщить("Число: " + СИсх + " => " + С); КонецЕсли; Попытка Возврат XMLЗначение(Тип("Число"), С); Исключение Возврат 0; КонецПопытки; КонецФункции
Получил такой протокол:
Число: -24,000.00 => -24.000.00
Число: 325.83 => 325.83
Число: -1.19 => -1.19
Число: 24325.83 => 24325.83
Число: -23.71 => -23.71
Число: 24327.02 => 24327.02
Число: -460.00 => -460.00
Число: 24350.73 => 24350.73
Число: 9,000.00 => 9.000.00
Число: 24810.73 => 24810.73
Число: -10,544.45 => -10.544.45
Число: 15810.73 => 15810.73
Число: -2.61 => -2.61
Число: 26355.18 => 26355.18
Число: -52.18 => -52.18
Число: 26357.79 => 26357.79
Число: 26,361.13 => 26.361.13
Число: 26409.97 => 26409.97
Как и предполагал, в числе получались две точки, поправил код функции так:
Функция ЧислоИзСтроки(Знач С) Экспорт СИсх = С; С = ПолностьюУдалитьСимвол(С, " "); С = ПолностьюУдалитьСимвол(С, Символы.НПП); С = СтрЗаменить(С, ",", "."); Если С = "" Тогда Возврат 0; КонецЕсли; //Если есть несколько точек, заменяем на одну 24.000.00 => 24.000; Пока Истина Цикл Поз = Найти(С, "."); Если Поз <> 0 И Найти(Сред(С, Поз + 1), ".") <> 0 Тогда С = Лев(С, Поз - 1) + Сред(С, Поз + 1); Иначе Прервать; КонецЕсли; КонецЦикла; Если ПротоколироватьПреобразованияЧисел Тогда Сообщить("Число: " + СИсх + " => " + С); КонецЕсли; Попытка Возврат XMLЗначение(Тип("Число"), С); Исключение Возврат 0; КонецПопытки; КонецФункции
В итоге увидел корректное преобразование:
Число: -24.000.00 => -24000.00
Проблема возникает из-за того, что у пользователя на сервере профиль с английским языком. Сервер иностранный, по умолчанию так. Я решил, что правильнее доработать код, чем настраивать корректный язык. Код должен работать независимо от региональных настроек.
Поэтому в коде я тоже использую преобразование строки в число через XMLЗначение, т.к. оно не зависит от региональных настроек в отличии от функции Число. Кстати, пришлось удалять пробелы, потому что Число их игнорирует, а XMLЗначение нет.
UPD 2024-05-02: немного переписал функцию, чтобы удаляла не только одну лишнюю точку, но и любое количество лишних точек (использую цикл).
UPD 2024-06-23: доработал функцию, т.к. разряды воспринимались как копейки.
Теперь не загружаются числа более миллиона?
логичное замечание, ведь хотел же в цикле сделать удаление точки. спасибо, поправлю.
Поправил 2 мая 2024 в 18:00
А правильно читать значения, а не текст. Завтра появятся апострофы как разделители или другие неведомые способы представления чисел
может быть и правильно, но я как-то намучался с чтением значений типа дата из Excel в 1С, поэтому теперь только текст.