На вход идет строка, в которой содержатся числа, нужно проверить что внутри этих чисел нет ведущих нулей, подскажите пожалуйста, как это можно реализовать
Был вариант с поиском " 0", но тогда ошибка будет и при 0, и при 0.5 + не проверяется первое число
Процедура ПроверитьМассивЧиселСтрокой(ВхСтрока)
ТипЧисло = Новый ОписаниеТипов("Число");
МассивЧиселСтрокой = СтрРазделить(ВхСтрока, " ", Ложь);
Для Каждого ЧислоСтрокой Из МассивЧиселСтрокой Цикл
Если Формат(ТипЧисло.ПривестиЗначение(ЧислоСтрокой),"ЧРД=.; ЧН=0; ЧГ=0") <> ЧислоСтрокой Тогда
Сообщить(СтрШаблон("Ошибка числа: %1", ЧислоСтрокой));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
Если разделитель дробной части может быть еще и запятая, то делать двойную проверку с другой форматной строкой.
(2)
Можете пояснить чуть подробнее? Плохо понимаю...
На всякий случай распишу пример
Если на вход будет строка:
00 012 208 0.5 0
Ошибка должна вылезать только на 00 и 012
Процедура ПроверитьМассивЧиселСтрокой(ВхСтрока)
ТипЧисло = Новый ОписаниеТипов("Число");
МассивЧиселСтрокой = СтрРазделить(ВхСтрока, " ", Ложь);
Для Каждого ЧислоСтрокой Из МассивЧиселСтрокой Цикл
Если Формат(ТипЧисло.ПривестиЗначение(ЧислоСтрокой),"ЧРД=.; ЧН=0; ЧГ=0") <> ЧислоСтрокой Тогда
Сообщить(СтрШаблон("Ошибка числа: %1", ЧислоСтрокой));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
Если разделитель дробной части может быть еще и запятая, то делать двойную проверку с другой форматной строкой.
(7) Ага, давайте еще пофантазируем - какие еще символы можно напихать в "строку, в которой содержатся числа"? Например, апостроф - как разделитель тысяч/миллионов. Или минус - для отрицательных чисел, которые, кстати, ваш супералгоритм не обработает.
Жаль только, что автор нам в этом не поможет - он получил свою плюшку и вряд ли сюда еще заглянет. Но опытную девочку вас ведь это не смутит, верно?
(15) это не показатель. Код был предоставлен до этого комментария. И по опыту, требования меняются достаточно часто.
Просто есть универсальные методы, есть хардкорные проверки под текущие обнаруженные условия.
(4) Добрый день, внезапно появилось одно но...
Данная проверка очень плохо работает с плохими числами, возможно сможете подсказать как это пофиксить или хотя бы причину данной проблемы?
(Например: 12432556565456776574363463474356463454536325452354653245462546544434546546653647754754767612432556565456776574124325565654567765743634634743564634545363254523546532454625465444345465466536477547547676124325565654567765743634634743564634545363254523546532454625465444345465466536477547547676124325565654567765743634634743564634545363254)
(21) да. это ограничение разрядности числа у Формат.
Но не только у него.
В новых методах типа ПобитовыйСдвигВлево даже есть описание:
Число, для которого требуется выполнить сдвиг.
Значение должно быть целым числом в диапазоне от 0 до 2^32-1. Если число не целое или не укладывается в данный диапазон - генерируется исключение.
Комичность в том, что истинные 1Сники, увлекшись выкрутасами, подменяют понятия на удобные им. На те, для которых есть ранее нарытый и тщательно оберегаемый ими магический кусочек кода.
Была предоставлена простая задача на анализ строкового представления чисел. А вместо ее решение тут занялись обработкой чисел, яросто натирая тему "универсальности". Хорошо еще до "требования бизнеса, про которые нам лучше знать" добраться не успели.
Оторвись от 1С и сам найди любую статью про причины использования для хранения финансовых данных типов DECIMAL и NUMBER (ну и еще про возникновение MONEY и SMALLMONEY в TSQL). В этой любой статье о причинах будет множество аргументов. Это будет куда полезней.