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

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

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

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

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

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

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

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

"глотает" даже пробелы...)
SlavaKron; Bob_Sid; Amaigato; +3 Ответить
42. user856012 14 11.07.23 15:21 Сейчас в теме
(41)
сейчас придумал
Ахха, по ссылочке в (9) сходите... ;-P
43. user654641_yaga_m 13 11.07.23 15:22 Сейчас в теме
(42)не ходил - не претендую на первенство...
55. Amaigato 19.11.23 15:05 Сейчас в теме
(41)Спасибо тебе, добрый человек!
64. Kanigin 22.08.24 10:02 Сейчас в теме
(41) Заинтересовалсо! Надо попробовать умножить на 1 или прибавить 0... )))
63. user2102309 22.08.24 09:31 Сейчас в теме
(1) Процедура ПоискЧисло(ТекСтрока)

Массив = Новый Массив;

Массив.Добавить("1");
Массив.Добавить("2");
Массив.Добавить("3");
Массив.Добавить("4");
Массив.Добавить("5");
Массив.Добавить("6");
Массив.Добавить("7");
Массив.Добавить("8");
Массив.Добавить("9");
Массив.Добавить("0");
Массив.Добавить(".");

Для А = 1 По СтрДлина(ТекСтрока) Цикл
Символ = Лев(ТекСтрока, 1);
ТекСтрока = Прав(ТекСтрока, СтрДлина(ТекСтрока) - 1);
Если Массив.Найти(Символ) = Неопределено Тогда
Сообщить("Не число!!!");
Возврат; // Прервать цикл
КонецЕсли;

КонецЦикла;

Сообщить("Это число!!!");
КонецПроцедуры
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 14 09.07.23 23:42 Сейчас в теме
(12)
Но вот дальше у меня ступор вместе с условием проверки.
Ну вот вам в качестве подсказки: https://forum.infostart.ru/forum26/topic114710/message1186921/#message1186921

Посмотрим, поможет или нет. Если нет, то не стоит вам вообще заниматься программированием - не ваше.
65. Kanigin 22.08.24 10:14 Сейчас в теме
(5) самое простое СтрЗаменить()
А = СтрЗаменить("123 45,00"," ","")*1;
Вернет 12345;
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 Тогда
				Результат = Ложь;//точка вначале
			КонецЕсли;
			УжеЕстьТочка = Истина;
			
		Иначе
			Результат = Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции
Показать
jmw; user645913_pkropp; GigaBit; newbas; nysysimara; user645801_yyyuuu123q; Zevzm; gaytanen; +8 Ответить
25. gaytanen 10.07.23 18:14 Сейчас в теме
В целом вроде понял,благодарю!
Буду сидеть разбираться=)
(16)
17. TokarevV 33 10.07.23 07:41 Сейчас в теме
Функция ЭтоЧисло( ПроверяемаяСтрока) 
Попытка 
а = Число(ПроверяемаяСтрока);
Исключение
Возврат Ложь;
КонецПопытки
Возврат Истина;
КонецФункции
Cерый; MigAV; user1619761; SlavaKron; user5300; +5 Ответить
18. glek 120 10.07.23 08:09 Сейчас в теме
Тип = Новый ОписаниеТипов("Число")
Тип.ПривестиЗначение(Переменная) не должна быть нулем (дополнительно можно проверить, что а) длина строки больше нуля б) что строка <> "0")
Lapitskiy; Merkalov; +2 Ответить
19. karamazoff 118 10.07.23 08:38 Сейчас в теме
че ж у вас все так сложно то, не надо полагаться на платформы, посимвольный перебор со сравнением самое правильное и будет работать везде
gaytanen; +1 Ответить
24. gaytanen 10.07.23 18:08 Сейчас в теме
(19)
А сравниваем мы с чем?
20. Vitaly1C8 10.07.23 09:00 Сейчас в теме
// Проверку на то, что Символы.НПП в начале и только они - не делал

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

    _Стр = СокрЛП(Объект.СтрЧисло);
    _СтрДлина = СтрДлина(_Стр );
    
    Для каждого ц Из М Цикл        
        _Стр = СтрЗаменить(_Стр, ц, ц + Символ(7));        
    КонецЦикла;    
    
    Если 2 * _СтрДлина = СтрДлина(_Стр) Тогда
        Сообщить("Это Число !");
    Иначе
    	Сообщить("Это НЕ число :(");    
    КонецЕсли;
Показать
21. karamazoff 118 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 35 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;
        
    Сообщить("Это Число ? " + ЭтоЧисло);
Показать
user1619761; gaytanen; +2 Ответить
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) Ну наконец-то мы нашли истинного постановщика задачи, который точно знает исходные условия!
user1619761; user1706724; +2 Ответить
49. gaytanen 14.07.23 06:34 Сейчас в теме
60. user2063400 05.06.24 20:59 Сейчас в теме
(47) Разве этот код будет выполнять поставленную задачу?
При сложении Типа "Строка" с Типом Число на выходе будет "Строка", т.е. сообщение всегда будет "это не число".

(32)
ЧислоСтрокой = СокрЛП(Объект.СтрЧисло);

А что означает Объект.СтрЧисло ?

(32)
И Не СтрНачинаетсяС(ЧислоСтрокой, ".")
И Не СтрЗаканчиваетсяНа(ЧислоСтрокой, ".")
И СтрЧислоВхождений(ЧислоСтрокой, ".") <= 1;

И вот эта задумка хорошая, вот только как реализовать эти условия?
61. user1880116 05.06.24 22:16 Сейчас в теме
(60)
вот только как реализовать эти условия?
Вот это вот сейчас вообще топчик было, от души!
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 14 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 6 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)
58. sasasupov 03.06.24 07:53 Сейчас в теме
37 - больше всех понравилось, но маленькая правка 123.12.3 съест, а это не число.
Функция ЭтоЧисло(стр)
        стр = СокрЛП(стр);
	Возврат СтрНайти(стр, ".",,,2) = 0 И СтрРазделить(стр,"0123456789.",Ложь).Количество() = 0;
КонецФункции 
59. user1880116 03.06.24 08:30 Сейчас в теме
(58)
но маленькая правка
Эдак ты скоро вариант из (32) напишешь.
62. user2063400 05.06.24 23:23 Сейчас в теме
(58) твой код исключает наличие более одной точки, но не исключает возможности ее появления в начале либо в конце или и вовсе когда там только лишь она одна единственная без цифр. Ведь Число(".5") или Число("789.") или Число(".") не являются числом.

Правильнее ИМХО будет вот так:
  Функция ЭтоЧисло(стр)
        стр = СокрЛП(стр);
    Возврат СтрНайти(стр, ".",,,2) = 0 И СтрРазделить(стр,"0123456789.",Ложь).Количество() = 0
	И Не СтрНачинаетсяС(стр, ".") И Не СтрЗаканчиваетсяНа(стр, ".") ;
КонецФункции 
  
РезФункции = ЭтоЧисло("275");
Если РезФункции = Истина Тогда
	Сообщить("Это число? = " + РезФункции);
Иначе
	Сообщить("Это число? = " + РезФункции);
КонецЕсли; 
  
Показать
66. jmw 61 22.08.24 12:02 Сейчас в теме
В (16) уже было, только без проверки „-“ в начале строки.
Добавить в начало проверку на возможное отрицательное и больше не нужно колхозить:
рез = СтрПодобнаПоРегулярномуВыражению(Строка, "^-?\d+\.?\d*$");
67. SlavaKron 22.08.24 12:25 Сейчас в теме
Ответ был дан еще в (17), т.к. это самый быстрый и нативный способ, исходя из самого определения числа в понимании 1С. Хотя, кто-то обязательно скажет, что Попытка - плохо и не по стандарту.
68. DmitriyFlash 03.09.24 22:58 Сейчас в теме
Всё гораздо проще
	Значение = 45.89;
	Проверка = ТипЗнч(Значение);
	Сообщить(Проверка);
69. Zevzm 04.09.24 09:37 Сейчас в теме
(68) А теперь возьмите 45.89 в кавычки.
70. DmitriyFlash 07.09.24 13:34 Сейчас в теме
А стоп, тогда вот так:
	Значение = "45.89";
	Попытка
		Определить = Число(Значение);
	    Сообщить("" + Значение + " - строка является числом")
	Исключение
	    Сообщить("" + Значение + " - строка не является числом")
	КонецПопытки;
Показать
Оставьте свое сообщение

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