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