Имя: Пароль:
1C
1С v8
Убедиться, что в строке - число
,
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
Коллеги, все - херня!
Число, должно быть числом и это главное. А когда главным становится визуальное представление числа - начинается жпс
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан