Является ли строка числом

1. gaytanen 09.07.23 19:05 Сейчас в теме
Проверить является ли строка числом
Нужно разработать программный код, который должен определить является
ли введенная пользователем строка числом (содержит только цифры и
символ ".").
Примеры:
"123а21ф" - не является числом
"45.89" - является числом
"47 руб." = не является числом
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
10. user1880116 09.07.23 22:06 Сейчас в теме
(9) Да как так-то? Автор же клянется, что "на всяких форумах данную тему искал" =)
gaytanen; +1 Ответить
13. gaytanen 09.07.23 22:13 Сейчас в теме
(10)
Я не клялся=)
Но перебрал много инфы ,у меня есть подозрение ,что я просто туплю =)
14. gaytanen 09.07.23 22:16 Сейчас в теме
(10)
И этот вариант я находил.
34. user856012 13 11.07.23 02:36 Сейчас в теме
(32)
Боженьки, какой же бардак у вас в голове....
Это не бардак, это такой стиль программирования, называется "Per aspera ad anum".
(33)
отрицательные числа Вы тоже отрицаете ? )))
Ага, так же, как дроби, степени, числа e и π...

Ибо в исходном ТЗ сказано:
содержит только цифры и символ "."
gaytanen; +1 Ответить
37. user654641_yaga_m 5 11.07.23 12:14 Сейчас в теме
(1)Я делаю "это" проще:

МассивСтрок = СтрРазделить(Строка, "-.1234567890");
Если МассивСтрок.Количество() = 0 Тогда
Сообщить("Это число")
КонецЕсли;
Nikitos_NSK; +1 Ответить
38. user856012 13 11.07.23 14:23 Сейчас в теме
(37)
Я делаю "это" проще
Сравните свой код с (32) - да, ваш попроще... а какой лучше?

P.S. А самое сложное - прочитать то, что написали в ветке до вас! :-)
39. user654641_yaga_m 5 11.07.23 14:47 Сейчас в теме
(38) 32 "более полный" - я подразумеваю что точки не будут ставить где-попало. Так можно заморачиваться и с "-". тогда надо такие же действия с проверкой
40. nomad_irk 67 11.07.23 14:56 Сейчас в теме
(39)
я подразумеваю что точки не будут ставить где-попало

наивный чукотский юноша, ага

Точки будут стоять даже там, где они в принципе стоять не могут :)
41. user654641_yaga_m 5 11.07.23 14:59 Сейчас в теме
(38)
А вообще-то, сейчас придумал, самое простое будет, наверное:

Попытка
ЧислоИзСтроки = Число(ИсходнаяСтрока);
Сообщить("Это число")
Исключение
Сообщить("Это не число")
КонецПопытки

"глотает" даже пробелы...)
Amaigato; +1 Ответить
42. user856012 13 11.07.23 15:21 Сейчас в теме
(41)
сейчас придумал
Ахха, по ссылочке в (9) сходите... ;-P
43. user654641_yaga_m 5 11.07.23 15:22 Сейчас в теме
(42)не ходил - не претендую на первенство...
55. Amaigato 19.11.23 15:05 Сейчас в теме
(41)Спасибо тебе, добрый человек!
2. gaytanen 09.07.23 19:12 Сейчас в теме
Я только учусь программировать на 1С,но данная задача просто вогнала меня в ступор.Уже и Синтаксис помощника перечитал и на всяких форумах данную тему искал ,но никак не могу понять в каком направлении решить данную задачу.
3. user1880116 09.07.23 19:44 Сейчас в теме
(2)
и на всяких форумах данную тему искал
Истинный 1Сник, что уж.

Начем с вопроса, какие функции работы со строками ты вообще знаешь. И как те, которые ты знаешь, можно логически применить к процессу проверки "содержит только цифры и символ ".""
gaytanen; +1 Ответить
5. gaytanen 09.07.23 21:49 Сейчас в теме
(3)
СтрДлина()
• СокрЛ(), СокрП(), СокрЛП()
• Лев(), Прав(), Сред()
• Врег(), НРег(), ТРег()
• СтрНайти()
• СтрЗаменить()
• СтрЧислоСтрок()
• СтрПолучитьСтроку()
• ПустаяСтрока()
• СтрРазделить()
• СтрСоединить()

Сам факт того, что сама задачка я так понял для начального уровня где используется максимум условный оператор с циклом.
7. user1880116 09.07.23 22:00 Сейчас в теме
(5) Ну вот. Осталось научится проверять один символ на вхождение в допустимые, потом научится добывать все символы из строки поочередно и все совместить.
Перечисленных тобой функций для этого достаточно.
gaytanen; +1 Ответить
12. gaytanen 09.07.23 22:09 Сейчас в теме
(7)
Вот именно ,осталось научится ))
Поочередно перебрать символ в строке не проблема тут просто цикл.Но вот дальше у меня ступор вместе с условием проверки.
15. user856012 13 09.07.23 23:42 Сейчас в теме
(12)
Но вот дальше у меня ступор вместе с условием проверки.
Ну вот вам в качестве подсказки: https://forum.infostart.ru/forum26/topic114710/message1186921/#message1186921

Посмотрим, поможет или нет. Если нет, то не стоит вам вообще заниматься программированием - не ваше.
4. Dmitry77 83 09.07.23 21:04 Сейчас в теме
Перебрать строку посимвольно. Каждый символ поискать например в массиве из цифр и точки?
Можно поз вращаться с Число(), но там нюансы с точкой, запятой, минусами, пробелами.
gaytanen; +1 Ответить
6. gaytanen 09.07.23 21:53 Сейчас в теме
(4)
Я думаю ,что использовать массив ,это уже усложнение задачи. Разве нельзя тут обойтись условным оператором с применением цикла?
8. user1880116 09.07.23 22:02 Сейчас в теме
(4)
в массиве из цифр и точки
в строке
gaytanen; +1 Ответить
11. user1880116 09.07.23 22:07 Сейчас в теме
И для полного счастья проверить еще, что первый и последний символы - только числа.
23. gaytanen 10.07.23 18:04 Сейчас в теме
(8)
Как-то так ?

ПерваяСтрока = "f634634634"; 
	ДлинаСтроки = СтрДлина(ПерваяСтрока);
	Для А=1 по ДлинаСтроки Цикл
		Если СтрНайти(ПерваяСтрока,"1234567890.") >= 0 Тогда
			Сообщить("Строка является числом");	
		Иначе
			Сообщить("Строка не является числом");
		КонецЕсли;
	КонецЦикла;
Показать
27. gaytanen 10.07.23 19:03 Сейчас в теме
(23)
Та это неправильно уже сам понял =)
29. gaytanen 10.07.23 22:44 Сейчас в теме
(4)У меня правильное направление?)

ПерваяСтрока = "123а21ф";
	Индекс = 1;
	Перебор = 0;
	ДлинаСтроки = СтрДлина(ПерваяСтрока);
	Для А=1 по ДлинаСтроки Цикл
		Перебор = Лев(ПерваяСтрока,Индекс);
		Если СтрНайти(ПерваяСтрока,"1234567890.",А) >= 0 Тогда
			Индекс = Индекс +1;
			Сообщить("Строка является числом");
		Иначе
			Сообщить("Строка не является числом");
		КонецЕсли;
	КонецЦикла;
Показать
16. Oldsad 10.07.23 03:20 Сейчас в теме
с 23 платформы появилась возможность использовать регулярные выражения:
Функция ЭтоЧисло( ПроверяемаяСтрока)
	
	Шаблон = "\d+\.?\d*";
	Результат = СтрПодобнаПоРегулярномуВыражению( ПроверяемаяСтрока, Шаблон);
	
	Возврат Результат;
	
КонецФункции
Показать


если старая платформа, то:
Функция ЭтоЧисло( ПроверяемаяСтрока) 
	
	Результат = Истина;
	
	Если ПроверяемаяСтрока = "" Тогда
		Результат = Ложь;
	КонецЕсли;
	
	УжеЕстьТочка = Ложь;
	Для Поз = 1 По СтрДлина( ПроверяемаяСтрока) Цикл
		ТекСимвол = Сред( ПроверяемаяСтрока, Поз, 1);
		Если СтрНайти("1234567890", ТекСимвол) > 0 Тогда
			//все ок
		ИначеЕсли ТекСимвол = "." Тогда
			Если УжеЕстьТочка Тогда
				Результат = Ложь;//вторая точка
			КонецЕсли;	
			Если Поз = 1 Тогда
				Результат = Ложь;//точка вначале
			КонецЕсли;
			УжеЕстьТочка = Истина;
			
		Иначе
			Результат = Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции
Показать
nysysimara; user645801_yyyuuu123q; Zevzm; gaytanen; +4 Ответить
25. gaytanen 10.07.23 18:14 Сейчас в теме
В целом вроде понял,благодарю!
Буду сидеть разбираться=)
(16)
17. TokarevV 30 10.07.23 07:41 Сейчас в теме
Функция ЭтоЧисло( ПроверяемаяСтрока) 
Попытка 
а = Число(ПроверяемаяСтрока);
Исключение
Возврат Ложь;
КонецПопытки
Возврат Истина;
КонецФункции
Cерый; MigAV; user1619761; SlavaKron; user5300; +5 Ответить
18. glek 119 10.07.23 08:09 Сейчас в теме
Тип = Новый ОписаниеТипов("Число")
Тип.ПривестиЗначение(Переменная) не должна быть нулем (дополнительно можно проверить, что а) длина строки больше нуля б) что строка <> "0")
Lapitskiy; Merkalov; +2 Ответить
19. karamazoff 94 10.07.23 08:38 Сейчас в теме
че ж у вас все так сложно то, не надо полагаться на платформы, посимвольный перебор со сравнением самое правильное и будет работать везде
gaytanen; +1 Ответить
24. gaytanen 10.07.23 18:08 Сейчас в теме
20. Vitaly1C8 10.07.23 09:00 Сейчас в теме
// Проверку на то, что Символы.НПП в начале и только они - не делал

Цифры = "0 1 2 3 4 5 6 7 8 9 . " + Символы.НПП;
    М = СтрРазделить(Цифры, " ");        

    _Стр = СокрЛП(Объект.СтрЧисло);
    _СтрДлина = СтрДлина(_Стр );
    
    Для каждого ц Из М Цикл        
        _Стр = СтрЗаменить(_Стр, ц, ц + Символ(7));        
    КонецЦикла;    
    
    Если 2 * _СтрДлина = СтрДлина(_Стр) Тогда
        Сообщить("Это Число !");
    Иначе
    	Сообщить("Это НЕ число :(");    
    КонецЕсли;
Показать
21. karamazoff 94 10.07.23 09:26 Сейчас в теме
(20)чеж с вами не так-то? нафига пробелы, нафига НПП???
СтрНайти ("1234567890.,") ищем символ если не найдено, то не число
22. user1880116 10.07.23 09:39 Сейчас в теме
(21)
чеж с вами не так-то?
"оно и так работает" и "бизнес требует". Хе-хе. Хе-хе-хе.
26. Vitaly1C8 10.07.23 18:47 Сейчас в теме
(21) а если из оборотно-сальдовой сумму из ячейки надо будет проверить ?
вот тут НПП и пригодится ! :)
28. comptr 3 10.07.23 20:07 Сейчас в теме
(21) "...,,," - число получается?
31. Vitaly1C8 10.07.23 23:49 Сейчас в теме
(28)
Цифры = "0 1 2 3 4 5 6 7 8 9 . " + Символы.НПП;
    М = СтрРазделить(Цифры, " ");    
    
    _Стр = СокрЛП(Объект.СтрЧисло);
    _СтрДлина = СтрДлина(_Стр);
    
    Для каждого ц Из М Цикл        
        _Стр = СтрЗаменить(_Стр, ц, ц + Символ(7));        
    КонецЦикла;    
    
    ЭтоЧисло = Ложь;
    Если 2 * _СтрДлина = СтрДлина(_Стр) Тогда
        инд1 = М.Найти(Лев(_Стр, 1));
        Если инд1 <> Неопределено И инд1 <= 9 Тогда // Начинается с цифры
            Если СтрЧислоВхождений(_Стр, М[10]) <= 1 Тогда  // Одна .
                ЭтоЧисло = Истина;        
            КонецЕсли;
        КонецЕсли;           
    КонецЕсли;
    
    Сообщить("Это Число ? " + ЭтоЧисло);
Показать
32. user1880116 11.07.23 00:24 Сейчас в теме
(31)

Для каждого ц Из М Цикл
_Стр = СтрЗаменить(_Стр, ц, ц + Символ(7));
КонецЦикла;
Боженьки, какой же бардак у вас в голове....

    ЧислоСтрокой = СокрЛП(Объект.СтрЧисло);
    
    ЭтоЧисло = СтрРазделить(ЧислоСтрокой, "0123456789.", Ложь).Количество() = 0
        И Не СтрНачинаетсяС(ЧислоСтрокой, ".")
        И Не СтрЗаканчиваетсяНа(ЧислоСтрокой, ".")
        И СтрЧислоВхождений(ЧислоСтрокой, ".") <= 1;
        
    Сообщить("Это Число ? " + ЭтоЧисло);
Показать
gaytanen; +1 Ответить
33. пользователь 11.07.23 01:37
Сообщение было скрыто модератором.
...
35. пользователь 11.07.23 07:11
Сообщение было скрыто модератором.
...
44. gaytanen 11.07.23 20:30 Сейчас в теме
(32)
И ваш код работает?)
Я не сомневаюсь,просто данная задачка мне была данная после того ,как я прошел условный оператор циклы,процедуры и функции.У вас я вижу использованы методы до которых я еще не доучился=)
Но ваш код очень интересный!=)
46. SlavaKron 13.07.23 14:25 Сейчас в теме
(32) Нет запретов на точку в начале и в конце. Число(".05") или Число("123.") или Число(".") не вызовет ошибку.
48. user1880116 13.07.23 19:16 Сейчас в теме
(46) Ну наконец-то мы нашли истинного постановщика задачи, который точно знает исходные условия!
user1706724; +1 Ответить
49. gaytanen 14.07.23 06:34 Сейчас в теме
36. пользователь 11.07.23 11:58
Сообщение было скрыто модератором.
...
45. areavel 12.07.23 18:08 Сейчас в теме
а = ВведеннаяСтрока;
Попытка
б = а/2;
Сообщить("число");
Исключение
Сообщить("не число");
КонецПопытки;
47. Alizevin 13.07.23 16:46 Сейчас в теме
Если ТипЗнч (Строка + 5) = Тип("Число")
Тогда
Сообщить("это число");
Иначе Сообщить("это не число")
КонецЕсли;
user1706724; +1 Ответить
50. user1706724 23.09.23 19:17 Сейчас в теме
(47) А "строка + 5" зачем? Вроде и без "+ 5" работает
51. user856012 13 23.09.23 19:59 Сейчас в теме
(50)
Вроде и без "+ 5" работает
Очевидно же: с "+ 5" работает лучше. На целую пятерку лучше! ;-)
user1936667; user1706724; +2 Ответить
52. Alizevin 05.10.23 15:38 Сейчас в теме
(50) необязательно + 5, любая операция с числами.
53. user1936667 05.10.23 20:31 Сейчас в теме
(52)
любая операция с числами.
Сам-то проверял? Или традиционно увидел комочек в интернете и притащил?
54. user2015123 15.11.23 16:21 Сейчас в теме
ВО!
ТекОбъект="15422.р";
Строка=".0123456789";
ДлинаСтроки=СтрДлина(ТекОбъект);
Для Счетчик=1 по ДлинаСтроки Цикл
	ИзмСтр=Сред(ТекОбъект,Счетчик,1);
	ИзмСтр=?(СтрНайти(Строка,ИзмСтр),1,0);
	Если ИзмСтр=0 ИЛИ СтрЧислоВхождений(ТекОбъект,".")>1 Тогда
	Сообщить(ТекОбъект+" - не является числом");
	Прервать;
	КонецЕсли;
	Если Счетчик=ДлинаСтроки Тогда
	Сообщить(ТекОбъект+" - является числом");
	КонецЕсли;
КонецЦикла;
Показать
56. user2019120 24.11.23 07:08 Сейчас в теме
А как вам такое решение

ИсходнаяСтрока = "12.руб 345";
НачСтрока = СтрРазделить(ИсходнаяСтрока, ".1234567890");
КонСтрока = СтрСоединить(НачСтрока);
ТекСтрока = СтрСравнить(НачСтрока, КонСтрока) - 1;

Если ТекСтрока = 0 Тогда
Сообщить("Строка вляется числом!");
Иначе
Сообщить("Строка не является числом!");
КонецЕсли;
57. user1880116 24.11.23 08:53 Сейчас в теме
(56)
как вам
Вымученное говно.

Всё, что после СтрРазделить выбросить, и останется работающее решение из (37)
Оставьте свое сообщение
Вакансии
1С-Программист (интегратор Битрикс24)
Санкт-Петербург
зарплата от 150 000 руб. до 250 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 100 000 руб.
Временный (на проект)

Разработчик 1С
Москва
зарплата от 150 000 руб.
Полный день

Программист
Санкт-Петербург
зарплата от 180 000 руб. до 240 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 150 000 руб. до 250 000 руб.
Полный день