Проверить является ли строка числом
Нужно разработать программный код, который должен определить является
ли введенная пользователем строка числом (содержит только цифры и
символ ".").
Примеры:
"123а21ф" - не является числом
"45.89" - является числом
"47 руб." = не является числом
39.
user654641_yaga_m
1311.07.23 14:47 Сейчас в теме
(38) 32 "более полный" - я подразумеваю что точки не будут ставить где-попало. Так можно заморачиваться и с "-". тогда надо такие же действия с проверкой
Для А = 1 По СтрДлина(ТекСтрока) Цикл
Символ = Лев(ТекСтрока, 1);
ТекСтрока = Прав(ТекСтрока, СтрДлина(ТекСтрока) - 1);
Если Массив.Найти(Символ) = Неопределено Тогда
Сообщить("Не число!!!");
Возврат; // Прервать цикл
КонецЕсли;
Я только учусь программировать на 1С,но данная задача просто вогнала меня в ступор.Уже и Синтаксис помощника перечитал и на всяких форумах данную тему искал ,но никак не могу понять в каком направлении решить данную задачу.
Начем с вопроса, какие функции работы со строками ты вообще знаешь. И как те, которые ты знаешь, можно логически применить к процессу проверки "содержит только цифры и символ ".""
(5) Ну вот. Осталось научится проверять один символ на вхождение в допустимые, потом научится добывать все символы из строки поочередно и все совместить.
Перечисленных тобой функций для этого достаточно.
(7)
Вот именно ,осталось научится ))
Поочередно перебрать символ в строке не проблема тут просто цикл.Но вот дальше у меня ступор вместе с условием проверки.
Перебрать строку посимвольно. Каждый символ поискать например в массиве из цифр и точки?
Можно поз вращаться с Число(), но там нюансы с точкой, запятой, минусами, пробелами.
ПерваяСтрока = "f634634634";
ДлинаСтроки = СтрДлина(ПерваяСтрока);
Для А=1 по ДлинаСтроки Цикл
Если СтрНайти(ПерваяСтрока,"1234567890.") >= 0 Тогда
Сообщить("Строка является числом");
Иначе
Сообщить("Строка не является числом");
КонецЕсли;
КонецЦикла;
ПерваяСтрока = "123а21ф";
Индекс = 1;
Перебор = 0;
ДлинаСтроки = СтрДлина(ПерваяСтрока);
Для А=1 по ДлинаСтроки Цикл
Перебор = Лев(ПерваяСтрока,Индекс);
Если СтрНайти(ПерваяСтрока,"1234567890.",А) >= 0 Тогда
Индекс = Индекс +1;
Сообщить("Строка является числом");
Иначе
Сообщить("Строка не является числом");
КонецЕсли;
КонецЦикла;
с 23 платформы появилась возможность использовать регулярные выражения:
Функция ЭтоЧисло( ПроверяемаяСтрока)
Шаблон = "\d+\.?\d*";
Результат = СтрПодобнаПоРегулярномуВыражению( ПроверяемаяСтрока, Шаблон);
Возврат Результат;
КонецФункции
Показать
если старая платформа, то:
Функция ЭтоЧисло( ПроверяемаяСтрока)
Результат = Истина;
Если ПроверяемаяСтрока = "" Тогда
Результат = Ложь;
КонецЕсли;
УжеЕстьТочка = Ложь;
Для Поз = 1 По СтрДлина( ПроверяемаяСтрока) Цикл
ТекСимвол = Сред( ПроверяемаяСтрока, Поз, 1);
Если СтрНайти("1234567890", ТекСимвол) > 0 Тогда
//все ок
ИначеЕсли ТекСимвол = "." Тогда
Если УжеЕстьТочка Тогда
Результат = Ложь;//вторая точка
КонецЕсли;
Если Поз = 1 Тогда
Результат = Ложь;//точка вначале
КонецЕсли;
УжеЕстьТочка = Истина;
Иначе
Результат = Ложь;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Тип = Новый ОписаниеТипов("Число")
Тип.ПривестиЗначение(Переменная) не должна быть нулем (дополнительно можно проверить, что а) длина строки больше нуля б) что строка <> "0")
// Проверку на то, что Символы.НПП в начале и только они - не делал
Цифры = "0 1 2 3 4 5 6 7 8 9 . " + Символы.НПП;
М = СтрРазделить(Цифры, " ");
_Стр = СокрЛП(Объект.СтрЧисло);
_СтрДлина = СтрДлина(_Стр );
Для каждого ц Из М Цикл
_Стр = СтрЗаменить(_Стр, ц, ц + Символ(7));
КонецЦикла;
Если 2 * _СтрДлина = СтрДлина(_Стр) Тогда
Сообщить("Это Число !");
Иначе
Сообщить("Это НЕ число :(");
КонецЕсли;
Для каждого ц Из М Цикл
_Стр = СтрЗаменить(_Стр, ц, ц + Символ(7));
КонецЦикла;
Боженьки, какой же бардак у вас в голове....
ЧислоСтрокой = СокрЛП(Объект.СтрЧисло);
ЭтоЧисло = СтрРазделить(ЧислоСтрокой, "0123456789.", Ложь).Количество() = 0
И Не СтрНачинаетсяС(ЧислоСтрокой, ".")
И Не СтрЗаканчиваетсяНа(ЧислоСтрокой, ".")
И СтрЧислоВхождений(ЧислоСтрокой, ".") <= 1;
Сообщить("Это Число ? " + ЭтоЧисло);
(32)
И ваш код работает?)
Я не сомневаюсь,просто данная задачка мне была данная после того ,как я прошел условный оператор циклы,процедуры и функции.У вас я вижу использованы методы до которых я еще не доучился=)
Но ваш код очень интересный!=)
(47) Разве этот код будет выполнять поставленную задачу?
При сложении Типа "Строка" с Типом Число на выходе будет "Строка", т.е. сообщение всегда будет "это не число".
ВО!
ТекОбъект="15422.р";
Строка=".0123456789";
ДлинаСтроки=СтрДлина(ТекОбъект);
Для Счетчик=1 по ДлинаСтроки Цикл
ИзмСтр=Сред(ТекОбъект,Счетчик,1);
ИзмСтр=?(СтрНайти(Строка,ИзмСтр),1,0);
Если ИзмСтр=0 ИЛИ СтрЧислоВхождений(ТекОбъект,".")>1 Тогда
Сообщить(ТекОбъект+" - не является числом");
Прервать;
КонецЕсли;
Если Счетчик=ДлинаСтроки Тогда
Сообщить(ТекОбъект+" - является числом");
КонецЕсли;
КонецЦикла;
(58) твой код исключает наличие более одной точки, но не исключает возможности ее появления в начале либо в конце или и вовсе когда там только лишь она одна единственная без цифр. Ведь Число(".5") или Число("789.") или Число(".") не являются числом.
Правильнее ИМХО будет вот так:
Функция ЭтоЧисло(стр)
стр = СокрЛП(стр);
Возврат СтрНайти(стр, ".",,,2) = 0 И СтрРазделить(стр,"0123456789.",Ложь).Количество() = 0
И Не СтрНачинаетсяС(стр, ".") И Не СтрЗаканчиваетсяНа(стр, ".") ;
КонецФункции
РезФункции = ЭтоЧисло("275");
Если РезФункции = Истина Тогда
Сообщить("Это число? = " + РезФункции);
Иначе
Сообщить("Это число? = " + РезФункции);
КонецЕсли;
Ответ был дан еще в (17), т.к. это самый быстрый и нативный способ, исходя из самого определения числа в понимании 1С. Хотя, кто-то обязательно скажет, что Попытка - плохо и не по стандарту.
Значение = "45.89";
Попытка
Определить = Число(Значение);
Сообщить("" + Значение + " - строка является числом")
Исключение
Сообщить("" + Значение + " - строка не является числом")
КонецПопытки;