На вход идет строка, в которой содержатся числа, нужно проверить что внутри этих чисел нет ведущих нулей

1. s0m 04.09.23 17:47 Сейчас в теме
На вход идет строка, в которой содержатся числа, нужно проверить что внутри этих чисел нет ведущих нулей, подскажите пожалуйста, как это можно реализовать
Был вариант с поиском " 0", но тогда ошибка будет и при 0, и при 0.5 + не проверяется первое число
По теме из базы знаний
Найденные решения
4. spacecraft 04.09.23 21:06 Сейчас в теме
(3) для такого типа наборов можно так:
Процедура ПроверитьМассивЧиселСтрокой(ВхСтрока)
	ТипЧисло = Новый ОписаниеТипов("Число");
	МассивЧиселСтрокой = СтрРазделить(ВхСтрока, " ", Ложь);
	Для Каждого ЧислоСтрокой Из МассивЧиселСтрокой Цикл
		Если Формат(ТипЧисло.ПривестиЗначение(ЧислоСтрокой),"ЧРД=.; ЧН=0; ЧГ=0") <> ЧислоСтрокой Тогда
			Сообщить(СтрШаблон("Ошибка числа: %1", ЧислоСтрокой));
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
Показать

Если разделитель дробной части может быть еще и запятая, то делать двойную проверку с другой форматной строкой.
11. user856012 14 05.09.23 03:12 Сейчас в теме
(10)
Это сработает только если число одно, разве нет?
Нет, если это реализовать внутри цикла, как замену процитированному коду из (4).

То есть, на пальцах: разделение строки в массив надо оставить, цикл по массиву - тоже, предлагается только заменить проверку.

Как и в (6), кстати.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 33 04.09.23 17:53 Сейчас в теме
(1)
Был вариант с поиском " 0", но тогда ошибка будет и при 0, и при 0.5 + не проверяется первое число

Добавь проверку, что длина строки должна быть больше 1, и уже тогда ищи 0.
Если нашел первый ноль, то смотри второй символ, что он не точка.
3. s0m 04.09.23 18:14 Сейчас в теме
(2)
Можете пояснить чуть подробнее? Плохо понимаю...
На всякий случай распишу пример
Если на вход будет строка:
00 012 208 0.5 0
Ошибка должна вылезать только на 00 и 012
4. spacecraft 04.09.23 21:06 Сейчас в теме
(3) для такого типа наборов можно так:
Процедура ПроверитьМассивЧиселСтрокой(ВхСтрока)
	ТипЧисло = Новый ОписаниеТипов("Число");
	МассивЧиселСтрокой = СтрРазделить(ВхСтрока, " ", Ложь);
	Для Каждого ЧислоСтрокой Из МассивЧиселСтрокой Цикл
		Если Формат(ТипЧисло.ПривестиЗначение(ЧислоСтрокой),"ЧРД=.; ЧН=0; ЧГ=0") <> ЧислоСтрокой Тогда
			Сообщить(СтрШаблон("Ошибка числа: %1", ЧислоСтрокой));
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
Показать

Если разделитель дробной части может быть еще и запятая, то делать двойную проверку с другой форматной строкой.
5. user1880116 04.09.23 21:55 Сейчас в теме
(4)
Если Формат(ТипЧисло.ПривестиЗначение(ЧислоСтрокой),"ЧРД=.; ЧН=0; ЧГ=0") <> ЧислоСтрокой Тогда
Господи, ну зачем вы строите из себя каких-то неопытных девочек, которые страстно стараются поразить партнера лихими выкрутасами?

ЕстьОшибка = СтрНачинаетсяС(ЧислоСтрокой, "0") 
    И Не СтрНачинаетсяС (ЧислоСтрокой, "0.")
    И ЧислоСтрокой <> "0";


(4)
делать двойную проверку с другой форматной строкой.

...     И Не СтрНачинаетсяС (ЧислоСтрокой, "0,")
6. user856012 14 04.09.23 22:27 Сейчас в теме
(5)
страстно стараются поразить партнера лихими выкрутасами
Можно и вовсе без выкрутасов, даже ваших минималистичных:

Если ЧислоСтрокой <> Строка(Число(ЧислоСтрокой)) Тогда
   Сообщить("Ошибка числа: " + ЧислоСтрокой);
КонецЕсли;
7. user1880116 04.09.23 22:35 Сейчас в теме
(6)
Если ЧислоСтрокой <> Строка(Число(ЧислоСтрокой)) Тогда
И оно элегантно так будет сравнивать "1000" с "1" + Символы.НПП + "000", ага
8. user856012 14 04.09.23 23:45 Сейчас в теме
(7) Ага, давайте еще пофантазируем - какие еще символы можно напихать в "строку, в которой содержатся числа"? Например, апостроф - как разделитель тысяч/миллионов. Или минус - для отрицательных чисел, которые, кстати, ваш супералгоритм не обработает.

Жаль только, что автор нам в этом не поможет - он получил свою плюшку и вряд ли сюда еще заглянет. Но опытную девочку вас ведь это не смутит, верно?
9. s0m 05.09.23 01:35 Сейчас в теме
(8)Ну...
Так-то могу помочь)))
В строке могу быть только следующие символы: " .1234567890")))
14. user1880116 05.09.23 07:25 Сейчас в теме
(8)
Ага, давайте еще пофантазируем - какие еще символы можно напихать в "строку, в которой содержатся числа"?
Чуви, ну ты же сам порождаешь этот НПП, когда выполняешь "Строка(Число(". Исходная строка тут ну совсем не причем.

Вот она, ярко так, и есть основная проблема подобной "крутизны" кода.
10. s0m 05.09.23 01:53 Сейчас в теме
(5) Это сработает только если число одно, разве нет?
11. user856012 14 05.09.23 03:12 Сейчас в теме
(10)
Это сработает только если число одно, разве нет?
Нет, если это реализовать внутри цикла, как замену процитированному коду из (4).

То есть, на пальцах: разделение строки в массив надо оставить, цикл по массиву - тоже, предлагается только заменить проверку.

Как и в (6), кстати.
12. пользователь 05.09.23 04:42
Сообщение было скрыто модератором.
...
13. spacecraft 05.09.23 07:06 Сейчас в теме
(5) Отрицательные числа за числа не считаете?
16. spacecraft 05.09.23 07:32 Сейчас в теме
(15) это не показатель. Код был предоставлен до этого комментария. И по опыту, требования меняются достаточно часто.
Просто есть универсальные методы, есть хардкорные проверки под текущие обнаруженные условия.
17. user1880116 05.09.23 07:54 Сейчас в теме
(16)
Просто есть универсальные методы

Ага. И тут же, прямо в (4), начинается их доработка:
Если разделитель дробной части может быть еще и запятая, то делать двойную проверку с другой форматной строкой.
18. user1880116 05.09.23 07:57 Сейчас в теме
(16)
Код был предоставлен до этого комментария
Точно. А твой комментарий про отрицатетельные числа - сильно позже комментария автора с ограничениями. Показатель!
19. s0m 07.09.23 16:04 Сейчас в теме
(4) Добрый день, внезапно появилось одно но...
Данная проверка очень плохо работает с плохими числами, возможно сможете подсказать как это пофиксить или хотя бы причину данной проблемы?
(Например: 124325565654567765743634634743564634545363254523546532454625­465444345465466536477547547676124325565654567765741243255656­545677657436346347435646345453632545235465324546254654443454­654665364775475476761243255656545677657436346347435646345453­632545235465324546254654443454654665364775475476761243255656­54567765743634634743564634545363254)
20. spacecraft 07.09.23 16:28 Сейчас в теме
(19) 1С работает с 32 бит числами. Это "число" больше по разрядности.
21. SlavaKron 07.09.23 17:58 Сейчас в теме
(20) Скорее, это ограничение метода Формат, в остальном в 1С нет ограничения на разрядность чисел.
Тут проще использовать XMLСтрока вместо Формат.
22. spacecraft 07.09.23 18:25 Сейчас в теме
(21) да. это ограничение разрядности числа у Формат.
Но не только у него.
В новых методах типа ПобитовыйСдвигВлево даже есть описание:
Число, для которого требуется выполнить сдвиг.
Значение должно быть целым числом в диапазоне от 0 до 2^32-1. Если число не целое или не укладывается в данный диапазон - генерируется исключение.

А так да, сами числа не имеют такого ограничения.
23. user1880116 07.09.23 22:02 Сейчас в теме
(19) А у тебя хороший преподаватель.
Сразу видит выпендривания с так называемыми "универсальными методами" и гасит их на корню.
24. SlavaKron 08.09.23 00:14 Сейчас в теме
(23) Так без шуток так и есть. В эту фигню упирается https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%B4%D0%B2%D0%BE%D­0%B9%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%­D1%82%D0%B8
На этот форуме бы пользователь herfis (надеюсь, с ним всё хорошо) мне как-то рассказал, что финансовые вычисления презирают плавающую точку. Если найдёшь эту тему, буду тебе благодарен.
26. user1880116 08.09.23 07:44 Сейчас в теме
(24)
Так без шуток так и есть
Комичность в том, что истинные 1Сники, увлекшись выкрутасами, подменяют понятия на удобные им. На те, для которых есть ранее нарытый и тщательно оберегаемый ими магический кусочек кода.

Была предоставлена простая задача на анализ строкового представления чисел. А вместо ее решение тут занялись обработкой чисел, яросто натирая тему "универсальности". Хорошо еще до "требования бизнеса, про которые нам лучше знать" добраться не успели.

(24)
финансовые вычисления презирают плавающую точку
Оторвись от 1С и сам найди любую статью про причины использования для хранения финансовых данных типов DECIMAL и NUMBER (ну и еще про возникновение MONEY и SMALLMONEY в TSQL). В этой любой статье о причинах будет множество аргументов. Это будет куда полезней.
25. PlatonStepan 38 08.09.23 04:58 Сейчас в теме
Вот регулярное выражение (https://regex101.com/)
/(?>^|\D+)(0(?>\d|0[\.])[\d\.]*)/g


Размотай его алгоритм и реализуй на 1С :)
27. user1880116 08.09.23 08:18 Сейчас в теме
(25)
Вот регулярное выражение
Прикрепленные файлы:
28. PlatonStepan 38 08.09.23 09:33 Сейчас в теме
(27) А вот и он: форумный токсик-крусадер, бессмысленный и беспощадный! XD
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот