Имя: Пароль:
1C
 
Преобразование строки в число. Ошибка явно скульная.
0 Широкий
 
10.06.16
10:28
Есть процедура, выполняется на стороне сервака.
50/50 вываливается сообщение: "Cannot convert value to Numeric". Ошибка явно скульная.

Отследил на чем сыпется. Пример:
ПеремСтр="55,632478";
ПеремЧисло=Число(ПеремСтр);

Как бы поборооть.

З.Ы. Данную процедуру дергает веб сервер.
1 mehfk
 
10.06.16
10:32
1. Не скульная.
2. Передавать валидные числа.
2 СвинТуз
 
10.06.16
10:32
там точно должна быть запятая а не точка?
ведущие пробелы есть?
3 СвинТуз
 
10.06.16
10:34
ПеремЧисло=Число(СокрЛП(ПеремСтр));
4 dmpl
 
10.06.16
10:34
(2) Тут вообще может быть весело из-за локальных настроек машины.
5 Широкий
 
10.06.16
10:36
(1) Вот не скульное сообщение: "Преобразование значения к типу Число не может быть выполнено". Можешь проверить в отладчике.
(2) Да вроде как конвертирует и с запятыми. Пробелов нет, првоерил.
6 КМ155
 
10.06.16
10:38
(0) [Как бы поборооть.]
разрежь на целое и дробное, собери обратно
7 mehfk
 
10.06.16
10:39
(5) >> Можешь проверить в отладчике.
Проверять идиотские предположения не мой профиль.
8 Широкий
 
10.06.16
10:40
Поменял разделитель дробной части на точки. Понаблюдаю
9 4St
 
10.06.16
10:40
(5) Скуль ни при чем.
Проверь региональные настройки на сервере.
http://clip2net.com/s/3z3iD9o
10 Широкий
 
10.06.16
10:40
(7) Тогда спрячься и не отсвечивай
11 Широкий
 
10.06.16
10:42
(9) Ладно бы он всегда выдавал ошибку. А тут с какой то вероятностью
12 mehfk
 
10.06.16
10:44
(10) Не учи меня жить, парниша.
13 Широкий
 
10.06.16
10:44
(12) Засекаем словарный запас
14 Nuobu
 
10.06.16
10:46
(0) Точку вместо запятой поставь.
15 mehfk
 
10.06.16
10:47
(13) И вот таким затупкам как ты дают инженера знаний? Н-да.
16 Timon1405
 
10.06.16
10:48
Функция ПреобразоватьВЧисло(Знач Буфер) Экспорт
    
    Буфер = СокрЛП(СтрЗаменить(Буфер, " ", ""));
    Если Не ПустаяСтрока(Буфер)
        И СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(СтрЗаменить(СтрЗаменить(СтрЗаменить(Буфер, ".", ""), "-", ""), ",", "")) Тогда
        Результат = Число(Буфер);
        Если Результат < 0 Тогда
            Результат = - Результат;
        КонецЕсли;
    Иначе
        Результат = Неопределено;
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции
17 Широкий
 
10.06.16
10:50
(15) Не догоняешь - удивляйся
18 xaozai
 
10.06.16
10:50
(0) Попробуйте точку вместо запятой.
19 Широкий
 
10.06.16
10:51
(14) (18)  Я уже сделал. См (8). Наблюдаю
20 Stepa86
 
10.06.16
10:53
из БСП

// Преобразует исходную строку в число без вызова исключений.
//
// Параметры:
//   ИсходнаяСтрока - Строка - Строка, которую необходимо привести к числу.
//
// Возвращаемое значение:
//   Число - Полученное число.
//   Неопределено - Если строка не является числом.
//
Функция СтрокаВЧисло(Знач ИсходнаяСтрока) Экспорт
    ИсходнаяСтрока = СокрЛП(ИсходнаяСтрока);
    Результат = 0;
    ЗнаковПослеЗапятой = -1;
    ЗнакОтрицательный = Ложь;
    Длина = СтрДлина(ИсходнаяСтрока);
    Для НомерСимвола = 1 По Длина Цикл
        КодСимвола = КодСимвола(ИсходнаяСтрока, НомерСимвола);
        Если КодСимвола = 32 Или КодСимвола = 160 Тогда // Пробел или неразрывный пробел.
            // Пропуск (действие не требуется).
        ИначеЕсли КодСимвола = 45 Или КодСимвола = 40 Тогда // Минус или открывающая скобка.
            Если Результат <> 0 Тогда
                Возврат Неопределено;
            КонецЕсли;
            ЗнакОтрицательный = Истина;
        ИначеЕсли КодСимвола = 41 Тогда // Закрывающая скобка.
            Если Не ЗнакОтрицательный Или Результат = 0 Тогда // Не было открывающей скобки или нет числа.
                Возврат Неопределено;
            КонецЕсли;
            // Пропуск (действие не требуется).
        ИначеЕсли КодСимвола = 44 Или КодСимвола = 46 Тогда // Запятая или точка.
            Если ЗнаковПослеЗапятой <> -1 Тогда
                Возврат Неопределено; // Разделитель уже был, следовательно это не число.
            КонецЕсли;
            ЗнаковПослеЗапятой = 0; // Запуск отсчета знаков после запятой.
        ИначеЕсли КодСимвола > 47 И КодСимвола < 58 Тогда // Число.
            Если ЗнаковПослеЗапятой <> -1 Тогда
                ЗнаковПослеЗапятой = ЗнаковПослеЗапятой + 1;
            КонецЕсли;
            Число = КодСимвола - 48;
            Результат = Результат * 10 + Число;
        Иначе
            Возврат Неопределено;
        КонецЕсли;
    КонецЦикла;
    
    Если ЗнаковПослеЗапятой > 0 Тогда
        Результат = Результат / Pow(10, ЗнаковПослеЗапятой);
    КонецЕсли;
    Если ЗнакОтрицательный Тогда
        Результат = -Результат;
    КонецЕсли;
    
    Возврат Результат;
КонецФункции
21 Dmitrii
 
гуру
10.06.16
10:55
(16) У меня в подобной функции в начале добавлено код, который убирает неразрывные пробелы, типа:

Буфер = СокрЛП(СтрЗаменить(Буфер, Символы.НПП, ""));
22 СвинТуз
 
10.06.16
11:17
(21)
в его примере в целой части числа 2 знака.
значит разделителей разрядов не должно быть