Убираем разделители разрядов при разборе числа из 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 в строку при чтении в табличный документ текстом.
1 комментарий
[…] 2024-06-23: доработал функцию, т.к. разряды воспринимались как […]