|   |   | 
| 
 | Убедиться, что в строке - число | ☑ | ||
|---|---|---|---|---|
| 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 | 
        Коллеги, все - херня!
 Число, должно быть числом и это главное. А когда главным становится визуальное представление числа - начинается жпс | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |