|
Убедиться, что в строке - число | ☑ | ||
---|---|---|---|---|
0
ildary
15.05.15
✎
23:06
|
Уважаемые специалисты, скажите пожалуйста, существует ли простой способ программно понять, что в строке - валидное число? В 7.7 оператор Число( "12Хрен" ) возвращал 0, а теперь он возвращает ошибку, может есть другие способы правильно обработать эту ситуацию? Я понимаю, что можно и попыткой это дело окружить, но это же костыльно.
|
|||
1
KUBIK
15.05.15
✎
23:09
|
(0) Есть Функция в ОМ в типовой конфе БП 2.0 на такую проверку
|
|||
2
ВРедная
15.05.15
✎
23:10
|
Если это типовая, то ищи функцию ТолькоЦифрыВСтроке
Если не типовая, то пиши такую функцию Для Сч = 1 по СтрДлина(Строка) Цикл Если не Сред(Строка, Сч, 1) = 0 и не Сред(Строка, Сч, 1) = 1 ... |
|||
3
ildary
15.05.15
✎
23:12
|
Спасибо за ответы, я надеялся, что сделали встроенную функцию с новым названием... Ок, буду страдать дальше.
|
|||
4
Zhuravlik
15.05.15
✎
23:45
|
(0)
Функция ТолькоЦифрыВСтроке(стр) ДлинаСтроки = СтрДлина(стр); Для сч=1 По ДлинаСтроки Цикл Если Найти("0987654321", сч) = 0 Тогда Возврат Ложь; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции (2) зачем так жестко?) |
|||
5
Фокусник
15.05.15
✎
23:49
|
(2)
Попытка А = Число(вхСтрока); Возврат Истина; Исключение Возврат Ложь; КонецПопытки; |
|||
6
Torquader
15.05.15
✎
23:51
|
(4) Вы что-то недописали !
Функция ЧислоЛиЭто(стр) ДлСтр=СтрДлина(стр); Для сч=1 По ДлСтр Цикл Код=КодСимвола(стр,сч); Если(Код<48)ИЛИ(Код>57)Тогда Возврат Ложь; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции |
|||
7
Zhuravlik
15.05.15
✎
23:58
|
(6) видел и в типовых такую функцию, в чем отличие от (4) , не понимаю. Расскажите?
Кстати, это все речь о только цифровом числе. А если дробь? Тогда самый лучший способ определить - это (5), только стр = СтрЗаменить(стр, ",", "."); Попытка А = Число(стр); Возврат Истина; Исключение Возврат Ложь; КонецПопытки; |
|||
8
Zhuravlik
16.05.15
✎
00:04
|
(6) ох, точно))
Функция ТолькоЦифрыВСтроке(стр) ДлинаСтроки = СтрДлина(стр); Для сч=1 По ДлинаСтроки Цикл сим = Сред(стр, сч, 1); Если Найти("0987654321", сим) = 0 Тогда Возврат Ложь; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции "КодСимвола" - наверное просто быстрее работает чем сред. |
|||
9
Zhuravlik
16.05.15
✎
00:24
|
От нефиг делать потестил, от быстрого к медленному получается: (5)(7)(6)(8). Мой вариант в (8) самый медленный) А (5) оказался быстрее в два с лишним раза.
- Странно, что в типовых используется (6). Или это они специально, чтобы попытку не писать, типа методологически неверно?.. |
|||
10
Torquader
16.05.15
✎
00:44
|
(9) Во-первых, попытку писать не хорошо.
Во-вторых, Число("2.16") успешно выполнится, тогда как 2.16 не есть числовая строка (если мы ожидаем натуральное число). Хотя, если строка пустая "", то (6) скажет, что она числовая. Что касается быстроты, то Сред - возвращает строку, а КодСимвола - число, то есть априори, память под строку не выделяется. Кроме того, два сравнения числа будут быстрее, чем поиск про строке. |
|||
11
Torquader
16.05.15
✎
00:45
|
И ещё - в стиле 1С будет Число("1 000") будет обработано без исключения.
|
|||
12
Zhuravlik
16.05.15
✎
00:49
|
(11) если имеете в виду пробелы, то будет исключение
|
|||
13
Злопчинский
16.05.15
✎
01:04
|
1сину за НП как разделитель - поубивать надо. по умолчанию - никаких разделителей не должно быть вообще. разделители - только приприменении форматирования
|
|||
14
Злопчинский
16.05.15
✎
01:04
|
-0.1123456d-003 - вполне себе валидное число
|
|||
15
Zhuravlik
16.05.15
✎
01:12
|
(14) Только не с точки зрения функции "Число" 1С)
|
|||
16
Zhuravlik
16.05.15
✎
01:15
|
(14) Я ток не понял что имеется в виду: способ записи или разрядность?) Если про разрядность, то имхо можно ограничится рамками 10-ной)))
|
|||
17
ice777
16.05.15
✎
01:23
|
пользуясь случаем, хочу заметить, что в 1С существует лядский разделитель разрядов при выводе в тот же эксель.
Конечно, обходимо. Но задрало объяснять людям, которые пытаются самостоятельно и без вопросов работать. |
|||
18
Chameleon1980
16.05.15
✎
09:09
|
не пробовал, но идея появилась. А что будет, если:
Попытка НашеЧисло*1; Возврат Истина; Исключение Возврат Ложь; КонецПопытки; |
|||
19
Chameleon1980
16.05.15
✎
09:11
|
+(18)
пардон - не учел "...что в строке - валидное число?..." |
|||
20
Chameleon1980
16.05.15
✎
09:57
|
или если так?:
Попытка 1*НашеЧисло; // тут по-идее должно быть явное преобразование "НашеЧисло" к числу. Хотя тот же фиг, только сбоку Возврат Истина; Исключение Возврат Ложь; КонецПопытки; |
|||
21
Злопчинский
16.05.15
✎
21:48
|
Коллеги, все - херня!
Число, должно быть числом и это главное. А когда главным становится визуальное представление числа - начинается жпс |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |