Преобразования чисел 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: немного переписал функцию, чтобы удаляла не только одну лишнюю точку, но и любое количество лишних точек (использую цикл).

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 4

  1. rzd:

    Теперь не загружаются числа более миллиона?

    • логичное замечание, ведь хотел же в цикле сделать удаление точки. спасибо, поправлю.
      Поправил 2 мая 2024 в 18:00

      • rzd:

        А правильно читать значения, а не текст. Завтра появятся апострофы как разделители или другие неведомые способы представления чисел

        • может быть и правильно, но я как-то намучался с чтением значений типа дата из Excel в 1С, поэтому теперь только текст.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *