Убираем разделители разрядов при разборе числа из Excel

Пришлось еще доработать функцию разбора числа, о которой писал ранее. Потому что запятая внутри целых чисел определялась как точка, разделяющая дробную часть и число определялось неверно (выделил жирным пример):

-7 -> -7
141,701.8 -> 141 701,8
-140.09 -> -140,09
141,708.8 -> 141 708,8
-99,602.88 -> -99 602,88
141,848.89 -> 141 848,89
150,000 -> 150 000
241,451.77 -> 241 451,77
-60,000 -> -60 000
911,451.77 -> 911 451,77

Вот код функции:

Функция ЧислоИзСтроки(Знач С) Экспорт
	СИсх = С;
	
	С = ПолностьюУдалитьСимвол(С, " ");
	С = ПолностьюУдалитьСимвол(С, Символы.НПП);
	
	
	//Если есть запятая, отделяющая более двух разрядов, удаляем ее, это разделитель разрядов
	Пока Истина Цикл
		Поз = Найти(С, ",");                 
		//Пример 1,000 - длина 5, позиция 2 разница 3
		Если Поз = 0 Тогда 
			Прервать;
		КонецЕсли;      
		Если СтрДлина(Сред(С, Поз + 1)) > 2 Тогда
			С = Лев(С, Поз - 1) + Сред(С, Поз + 1); //Удаляем запятую
		Иначе
			Прервать;
		КонецЕсли;
	КонецЦикла;

	С = СтрЗаменить(С, ",", ".");
	Если С = "" Тогда
		Возврат 0;
	КонецЕсли;     
	
	//Если есть несколько точек, заменяем на одну 24.000.00  => 24.000;
	Пока Истина Цикл
		Поз = Найти(С, ".");
		Если Поз <> 0 И Найти(Сред(С, Поз + 1), ".") <> 0 Тогда
			С = Лев(С, Поз - 1) + Сред(С, Поз + 1);
		Иначе
			Прервать;
		КонецЕсли;      
	КонецЦикла;
	
	
	Если ПротоколироватьПреобразованияЧисел	Тогда
		Сообщить("Число: " + СИсх + " => " + С);
	КонецЕсли;
	Попытка
		Р = XMLЗначение(Тип("Число"), С);
	Исключение
		Р = 0;
	КонецПопытки;
	//Сообщить("" + СИсх + " -> " + Р);
	Возврат Р;
КонецФункции

Но вообще решил считывать табличный документ дважды — один раз в тексте, другой раз в значениях, тогда можно нормально и с датами работать и с числами. Жаль, что в 1С нет способа конвертации чисел из Excel в строку при чтении в табличный документ текстом.

fixin

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

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

1 комментарий

  1. 24.06.2024

    […] 2024-06-23: доработал функцию, т.к. разряды воспринимались как […]

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

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