|
Проверить, что в строке только цифры | ☑ | ||
---|---|---|---|---|
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";" вынести из функции
|
|||
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) согласен, протупил
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |