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