Имя: Пароль:
IT
 
Проверить, что в строке только цифры
0 Fragster
 
модератор
09.08.13
17:17
Интересные варианты есть?

Пока побеждает

СтрЗаменить(СН,"1","");
СтрЗаменить(СН,"2","");
СтрЗаменить(СН,"3","");
СтрЗаменить(СН,"4","");
СтрЗаменить(СН,"5","");
СтрЗаменить(СН,"6","");
СтрЗаменить(СН,"7","");
СтрЗаменить(СН,"8","");
СтрЗаменить(СН,"9","");
СтрЗаменить(СН,"0","");
Возврат СН = "";
1 Tatitutu
 
09.08.13
17:19
КодСимвола() не ?
2 DexterMorgan
 
09.08.13
17:20
Функция ВернутьЦифрыИзСтроки(СтрокаПроверки, УдалитьЛидирующиеНули = Истина)
    
    Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
        Возврат "";
    КонецЕсли;
    
    ЦифрыИзСтроки = "";
    
    Для ё = 1 По СтрДлина(СтрокаПроверки) Цикл
        Символ = Сред(СтрокаПроверки, ё, 1);
        Если ЭтоЦифра(Символ) Тогда
            ЦифрыИзСтроки = ЦифрыИзСтроки + Символ;
        КонецЕсли;
    КонецЦикла;
    
    Если УдалитьЛидирующиеНули Тогда
        ЦифрыИзСтроки = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(ЦифрыИзСтроки, "0");
    КонецЕсли;
        
    Возврат ЦифрыИзСтроки;
    
КонецФункции


Функция ЭтоЦифра(Символ)
    КодСимвола = КодСимвола(Символ);
    Возврат (КодСимвола >= 48 И КодСимвола <= 57)
КонецФункции
3 arsik
 
гуру
09.08.13
17:22
(0) Регулярные выражения
4 Fragster
 
модератор
09.08.13
17:23
(0) не цифры из строки, а только цифры. в общем, пробегание по строке с проверкой каждого символа, понятно
(3) на линукс-сервере не работает
5 Tatitutu
 
09.08.13
17:24
Цель какую преследуешь ?
Попытка
  А=Сн*1;
Сообщить("Это число");
Исключение
Сообщить("Это не число");
КонецПопытки;
6 Торин
 
09.08.13
17:25
опередили...

попытка
   времЧисло = Число(исхСтрока);
   толькоЧисла = истина;
исключение
   толькоЧисла = Ложь;
КонецПопытки;
7 DS
 
09.08.13
17:27
(5) Название темы перечитай внимательно.
8 Невский
 
09.08.13
17:28
(5) (6) недавно тут много кричали про попытки и про то, что это омнокод
9 Fragster
 
модератор
09.08.13
17:29
(5)(6) не правильно работает для А = "1.1"


(8) не, норм
10 DexterMorgan
 
09.08.13
17:30
(4) СтрЗаменить, лучше проверки всей строки?
11 DS
 
09.08.13
17:30
(9) А в строке "1.1" разве только цифры?
12 DexterMorgan
 
09.08.13
17:31
(0) Из типовой

Функция ТолькоЦифрыВСтроке(Знач СтрокаПроверки, Знач УчитыватьЛидирующиеНули = Истина, Знач УчитыватьПробелы = Истина) Экспорт
    
    Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
        Возврат Ложь;
    КонецЕсли;
    
    Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда
        Возврат Истина;
    КонецЕсли;
    
    Если НЕ УчитыватьПробелы Тогда
        СтрокаПроверки = СтрЗаменить(СтрокаПроверки, " ", "");
    КонецЕсли;
    
    Если НЕ УчитыватьЛидирующиеНули Тогда
        НомерПервойЦифры = 0;
        Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
            НомерПервойЦифры = НомерПервойЦифры + 1;
            КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1));
            Если КодСимвола <> 48 Тогда
                Прервать;
            КонецЕсли;
        КонецЦикла;
        СтрокаПроверки = Сред(СтрокаПроверки, НомерПервойЦифры);
    КонецЕсли;
    
    Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
        КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1));
        Если НЕ (КодСимвола >= 48 И КодСимвола <= 57) Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Истина;
    
КонецФункции
13 Dimonster
 
09.08.13
17:32
(12) Опередил )) СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке (в УПП)
14 DexterMorgan
 
09.08.13
17:33
(11) ну так он и пишет, что не правильно (5) и (6) отработает
15 Fragster
 
модератор
09.08.13
17:33
(11) вот именно. а (5) и (6) думает, что да, только цифры. вообще неплохая задача на собеседование для отсеивания 1сников, которые не могут понять задачу
16 Fenrik
 
09.08.13
17:33
(0)
Возврат Вопрос("В строке """ + СН + """ только цифры?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да;
17 Невский
 
09.08.13
17:35
(16) )))))))
18 KishMish
 
09.08.13
17:35
Возврат Найти(Стр,"1")+Найти("Стр","2")+...+Найти("Стр","0")=0
19 Frost616
 
09.08.13
17:36
(16) это победа)))
20 arsik
 
гуру
09.08.13
17:41
В линуксе какие ни будь компоненты вообще возможно запускать?
Хоть самонаписанные.
21 Живой Ископаемый
 
09.08.13
17:53
2(20) это что, похоже на аниме-форум?
22 arsik
 
гуру
09.08.13
17:57
(21) Я имею ввиду внутри сервера приложений.
23 Fragster
 
модератор
09.08.13
17:58
(20) можно
24 arsik
 
гуру
09.08.13
18:08
(23) а примерчики есть?
25 Fragster
 
модератор
09.08.13
18:13
26 KishMish
 
09.08.13
19:01
(0) Если заведомо известно, что строка конечной длины то можно так
Дли=СтрДлина(Стр);
Возврат Стр>=Прав("00000000000000000000000000000000000000000000000",Дли) и Стр<=Прав("9999999999999999999999999999999999999999999",Дли);
27 KishMish
 
09.08.13
19:04
(26) а нет, пардон
28 NikVars
 
09.08.13
20:53
/******************************************************************************
// ВСтрокеОставитьТолькоЦифры(СтрокаИзСимволовИЦифр)
//
// Параметры:
//  СтрокаИзСимволовИЦифр (строка) - из которой будут удалены символы, которые не являются десятичными цифрами
//
// Описание:
//  Возвращает строку, которая является результатом удаления из строки
//СтрокаИзСимволовИЦифр всех символов, не являющих десятичными цифрами
//
Функция ВСтрокеОставитьТолькоЦифры(СтрокаИзСимволовИЦифр)
    Перем Рез;
    //Заменяем все символы не цифры на точку, чтобы при выполнении цикла на изменилась длина строки
    Для i = 1 По СтрДлина(СтрокаИзСимволовИЦифр) Цикл
        СтрокаИзСимволовИЦифр1 = Сред(СтрокаИзСимволовИЦифр, i, 1); //1 символ
        Если Найти("0123456789", СтрокаИзСимволовИЦифр1) = 0 Тогда
            СтрокаИзСимволовИЦифр = СтрЗаменить(СтрокаИзСимволовИЦифр, СтрокаИзСимволовИЦифр1, ".");
        КонецЕсли;
    КонецЦикла;    
    //Удаляем символы, которые являются точкой
    Рез = СтрЗаменить(СтрокаИзСимволовИЦифр,".", "");    
    Возврат Рез;
КонецФункции // ВСтрокеОставитьТолькоЦифры
29 Fragster
 
модератор
09.08.13
20:59
(28) если бы это было собеседование, ты бы его не прошел
30 NikVars
 
09.08.13
21:03
(29) Слишком много "бы"...

Это побеждает???????
"Возврат СН = "";"

Ок, всегда буду использовать!
31 Vovik
 
09.08.13
21:05
Зн=СокрЛП(К2.Наименование);
                        ЗнПреобр="";
                        ДопустСим="+0123456789";//В номерах телефона другого не надо (синхр. с мобилой)
                        Для п3=1 по СтрДлина(Зн) Цикл
                            Сим=Сред(Зн,п3,1);
                            Если Найти(ДопустСим,Сим)>0 Тогда
                                ЗнПреобр=ЗнПреобр+Сим;    
                            КонецЕсли;                            
                        КонецЦикла;
32 Fragster
 
модератор
09.08.13
21:07
(30) нет, в (0) - пример работающего кода (ну, кроме забытых СН = в строках с СтрЗаменить), выполняющего задачу. Интересно, что даже имея пример многие 1сники не смогли понять, что же требуется.
33 Vovik
 
09.08.13
21:10
В (0) нет присвоения. сн=саменить(СН...)
34 Fragster
 
модератор
09.08.13
21:11
(33) прочитал (32) в скобках? без присвоения оно, кстати, не проходит синтаксический контроль.
35 NikVars
 
09.08.13
21:12
(32) Так что же требуется - разжуй.
36 CepeLLlka
 
09.08.13
21:13
У меня первым делом пришла мысль про код символа..
37 Vovik
 
09.08.13
21:14
(36)А если код а не мысли. Не понял что за идея с код символа?
38 Vovik
 
09.08.13
21:16
Можно сравнить еще как то извратнее:
СтрДлина(Число("5ап1а1")) = 1
СтрДлина("5ап1а1") = 6

(7.7)
39 CepeLLlka
 
09.08.13
21:22
(36)Эээм.. перебираешь символы в строке, заранее создав список из кодов символов цифр, и проверяешь находится ли КодСимвола() текущего символа, в списке.
40 sirsp
 
09.08.13
21:23
Ставлю на перебор через Символ(КодСимвола(...)) и поиск в строке "0123456789."
41 Vovik
 
09.08.13
21:25
(39)(40) я не понял зачем код символа? Если проще сразу брать символ? Что это дает?
42 Мария Елена
 
09.08.13
21:27
Возврат СтрДлина(Тест) = СтрДлина(Число(Тест))
43 sirsp
 
09.08.13
21:27
хз, привычка из других ЯП ;)
44 Vovik
 
09.08.13
21:27
(42)Еще на "0" условие надо
45 CepeLLlka
 
09.08.13
21:29
(41)Ну браток.. мы видимо просто не такие крутые как ты ещё.. вот и всё..
46 NikVars
 
09.08.13
21:30
+(44) На первый ноль.
47 NikVars
 
09.08.13
21:30
+(44) На первые два нуля...
48 Vovik
 
09.08.13
21:31
(45)Фух.. славо богу. А то я подумал что я слишком туп:)
49 miron25
 
09.08.13
21:34
Вроде работает и с действительными числами..Дайте пирожок.
    штоТам="";
      ВвестиСтроку(штоТам);
      штоТам2= ВРег(штоТам);
      
       если штоТам=штоТам2 тогда
           сообщить("только цифры");
       иначе
           сообщить("есть и буквы");
           конецесли;
50 NikVars
 
09.08.13
21:36
(49) А если введу только большие буквы?
51 Vovik
 
09.08.13
21:36
(49)Не катит. Много исключений в виде точек, запятых, знаков доллара и т.п. кракозябр.
52 miron25
 
09.08.13
21:37
(51)Логично..Надо думать.
53 Mnemonic1C
 
09.08.13
21:41
Часто регулярные выражения используются для тестирования строк, например пользовательского ввода.
Этот пример позволяет узнать, является ли строка целым числом.
Код 1C v 7.x
///////////////////////////////////////////////////////////////////////
//Проверка подстроки
Процедура RegExp_Test()
    RegExp = CreateObject("VBScript.RegExp");
    RegExp.Pattern =  "^\d+$"; //Шаблон, который соответствует целому числу
    стр="12345";//Строка, которую тестируем
    Если RegExp.Test(стр)=0 Тогда
        Сообщить("Это не целое число");
    Иначе
        Сообщить("Это целое число");
    КонецЕсли;
    //Выдаст в окно сообщений:    
    //"Это целое число"
КонецПроцедуры
54 Mnemonic1C
 
09.08.13
21:41
55 КонецЦикла
 
09.08.13
21:43
Вот такое когда-то придумал, помогает. Правда для 7.7

http://1c911.by/stati_1s/statya-poleznye-melochi.htm#4
56 Fragster
 
модератор
09.08.13
21:57
(35) требуется ровно то, что в сабже: "Проверить, что в строке только цифры". результат проверки - да или нет
57 Torquader
 
09.08.13
22:06
Интересный вопрос, а строка "" - это строка, содержащая только цифры или нет ?
58 sirsp
 
09.08.13
22:12
(57) +10050
ЗЫ ИМХО удобно, когда нормальный парсер типа Число(Строка) в таких случаях возвращает 0
59 banco
 
09.08.13
22:15
Возврат СтрДлина(СН) =
(СтрЧислоВхождений(СН, "0") +
СтрЧислоВхождений(СН, "1") +
СтрЧислоВхождений(СН, "2") +
СтрЧислоВхождений(СН, "3") +
СтрЧислоВхождений(СН, "4") +
СтрЧислоВхождений(СН, "5") +
СтрЧислоВхождений(СН, "6") +
СтрЧислоВхождений(СН, "7") +
СтрЧислоВхождений(СН, "9") )
60 Fragster
 
модератор
09.08.13
22:33
(57) вопрос и правда интересный. будем считать, что да, тем более, что имеющийся в (0) код тоже так считает.
61 КонецЦикла
 
09.08.13
22:45
(60) Хм... а с чего бы "" являлось числом? Какие предпосылки? Твоя штука может и ошибаться...
62 Fragster
 
гуру
09.08.13
23:34
(61) числа и цифры - видишь разницу?
63 GedKo
 
09.08.13
23:39
Очередная попытка выпендриться, не выдан полное задание.

зы. VI - число? а FFFF?
64 Torquader
 
09.08.13
23:49
(60) Просто тогда метод
Если Строка(Число(ПроверяемаяСтрока))=ПроверяемаяСтрока Тогда ЭтоЧисло=Да;
Но, 001 - это числовая строка, а не число, а 1.1 - число, но не строка из цифр.
65 Fragster
 
гуру
09.08.13
23:55
(64) сколько раз нужно повторить 1снику, что нужна проверка на то, что строка содержит только цифры, чтобы он это понял?
66 Karavanych
 
10.08.13
04:33
мне не нравится код в (0) тем что сложность метода = число символов*10;
(65) много, потому что 1с ники обычно решают практические задачи, и не любят теоретические :)
67 John D
 
10.08.13
05:29
А почему нельзя по-простому: ехать от начала к концу и, как только текущий символ НЕ цифры - сразу возвращать ЛОЖЬ, а, если доехал до конца - ИСТИНУ? Проще-то некуда, вроде.
68 Prilepsky
 
10.08.13
06:30
А можно вообще извратиться и сделать проверку через запрос :)

ТолькоЦифры = Истина;    
    
КС = Новый КвалификаторыСтроки();
Массив = Новый Массив;
Массив.Добавить(Тип("Строка"));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);

    
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Наименование",ОписаниеТиповС,"Наименование");
    СтрокаТЗ = Тз.Добавить();
    СтрокаТЗ.Наименование = СН;
    КоличествоСимволов = СтрДлина(СН);
    Подобие = "";
    
    Для Н = 1 По КоличествоСимволов Цикл
        Подобие = Подобие + "[0-9]";
    КонецЦикла;
    
    
        Запрос = Новый Запрос("ВЫБРАТЬ
                              |    ИСТИНА КАК ТолькоЦифры
                              |ПОМЕСТИТЬ времТаб
                              |ИЗ
                              |    &ТЗ КАК ТЗ
                              |ГДЕ
                              |    ТЗ.Наименование ПОДОБНО &Подобие
                              |;
                              |
                              |////////////////////////////////////////////////////////////////////////////////
                              |ВЫБРАТЬ
                              |    Т.ТолькоЦифры
                              |ИЗ
                              |    времТаб КАК Т");
    
    Запрос.УстановитьПараметр("ТЗ", ТЗ);
    Запрос.УстановитьПараметр("Подобие", Подобие);

    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
        ТолькоЦифры = Ложь;
    КонецЕсли;
    
    Сообщить(ТолькоЦифры);
69 arsik
 
гуру
10.08.13
09:27
Вот такой вариант. Для ускорения лучше "Цифры = "0123456789";" вынести из функции

Функция ТолькоЦифры(Стр)
    Цифры = "0123456789";
    СтрКоличество = СтрДлина(Стр);
    Для Счетчик = 1 По СтрКоличество Цикл
        Если Найти(Цифры,Сред(Стр,Счетчик,1)) = 0 Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла;
    Возврат Истина;
КонецФункции

70 DJ Anthon
 
10.08.13
09:35
(59) а 8?
71 DJ Anthon
 
10.08.13
09:37
(58) не нравится - используй Число("0" + СокрЛП()). просто там вообще все, что угодно может оказаться. защиту от дурака еще никто не отменял.
72 arsik
 
гуру
10.08.13
09:41
+(69) ну и надо тестировать на реальных данных. Допустим в (69) если нечисло будет в начале строки, то будет быстрее
73 Zero on a dice
 
10.08.13
10:16
если в (6) добавить сравнение с округленным результатом, имхо, будет самый быстрый код из стандартных 1С-овых
74 DS
 
10.08.13
10:21
(62) По сути - не прав.
"Присутствие только цифр" <> "Отсутствие не-цифр" как раз из-за пустой строки.
75 Torquader
 
10.08.13
23:47
(69) А есть уверенность, что Найти("0123456789",Символ) будет работать быстрее, чем (Код>=48)И(Код<=57) ?
76 Torquader
 
10.08.13
23:48
+ В восьмёрке же КодСимв(Строка,Позиция) позволяет не получать символ из строки, а сразу получить его код.
77 arsik
 
гуру
11.08.13
16:50
(76) Проверил. результат примерно одинаковый. на 1000000 расхождения +- 10 %
78 Torquader
 
11.08.13
19:49
(77) Видимо, в 1С сравнение чисел выполняется в несколько этапов - сначала сравнение типов, а потом только сравнение данных.
79 singlych
 
14.08.13
18:10
Попытка
Ответ = НЕ (Найти(СтрокаДляПроверки, ".")
         ИЛИ Найти(СтрокаДляПроверки, ",")
         ИЛИ "1" + СтрокаДляПроверки <> Формат(Число("1" + СтрокаДляПроверки), "ЧГ="));
Исключение
Ответ = Ложь;
КонецПопытки;
80 giallo
 
14.08.13
18:22
(0)
ВЫБРАТЬ
    ВЫБОР
        КОГДА &СН ПОДОБНО "%[^0-9]%"
            ТОГДА ЛОЖЬ
        ИНАЧЕ ИСТИНА
    КОНЕЦ КАК ВСтрокеТолькоЦифры
81 Fragster
 
модератор
14.08.13
18:36
(80) различное поведение в части пустой строки, но в принципе неплохо
82 НаборДанных
 
14.08.13
18:42
Подпишусь, позже почитаю.
83 giallo
 
14.08.13
18:43
(81) да вроде такое же, если СН = "" будет Истина
84 Fragster
 
модератор
14.08.13
18:47
(83) согласен, протупил
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.