Страница 1 из 1
Функция преобразования строки в число
Добавлено: 24 Декабрь 2017, 13:31
Игорь Столяров
Привет всем !
Подскажите пожалуйста, есть ли в Clarion возможность ЯВНО преобразовать строку в число ?
Поясню, на примере.
- В строке может содержаться некое дробное число;
- Нужно найти в потоке данных строки с нулевыми значениями;
- Но возможны варианты: "", "0","0000", "0.0", ".00", "0.00", "0.000000000" и т.д.
Сейчас приходится делать идиотическое действие для неявного преобразования строки в число:
Код: Выделить всё
If (Clip(Loc:MyString) + 1 - 1) = 0
! Строка содержит нулевое число
end
А хотелось бы, что-то вроде
Код: Выделить всё
If StringToNumber(Loc:MyString) = 0
! Строка содержит нулевое число
end
Такая шалость вообще возможна ?
Заранее спасибо !

Функция преобразования строки в число
Добавлено: 24 Декабрь 2017, 13:43
Alex_G
А вариант
IF Deformat(Loc:MyString)=0
...
end
не подходит?
Функция преобразования строки в число
Добавлено: 24 Декабрь 2017, 13:53
Игорь Столяров
Alex_G писал(а): 24 Декабрь 2017, 13:43IF Deformat(Loc:MyString)=0
Неа ...

Тут можно даже не парится со чтением описания (DEFORMAT() возвращает строку), а просто попробовать:
Код: Выделить всё
Message(Deformat('00000')) ! Вернёт '00000'
Message(Deformat('000.00')) ! Вернёт '000.00'
и т.д.
Функция преобразования строки в число
Добавлено: 24 Декабрь 2017, 14:35
Ал
Игорь Столяров писал(а): 24 Декабрь 2017, 13:31
Привет всем !
Подскажите пожалуйста, есть ли в Clarion возможность ЯВНО преобразовать строку в число ?
Поясню, на примере.
- В строке может содержаться некое дробное число;
- Нужно найти в потоке данных строки с нулевыми значениями;
- Но возможны варианты: "", "0","0000", "0.0", ".00", "0.00", "0.000000000" и т.д.
Сейчас приходится делать идиотическое действие для неявного преобразования строки в число:
Код: Выделить всё
If (Clip(Loc:MyString) + 1 - 1) = 0
! Строка содержит нулевое число
end
А хотелось бы, что-то вроде
Код: Выделить всё
If StringToNumber(Loc:MyString) = 0
! Строка содержит нулевое число
end
Такая шалость вообще возможна ?
Заранее спасибо !

=CHOOSE(NUMERIC(Loc:MyString)=1 AND Loc:MyString*1=0,TRUE,FALSE)
Код: Выделить всё
...
Loc:MyString string(255)
CODE
Loc:MyString = '00.00000'
stop(clip(Loc:MyString)& ' '&CHOOSE(NUMERIC(Loc:MyString)=1 AND Loc:MyString*1=0,TRUE,FALSE))
Loc:MyString = '010.00000'
stop(clip(Loc:MyString)& ' '&CHOOSE(NUMERIC(Loc:MyString)=1 AND Loc:MyString*1=0,TRUE,FALSE))
Loc:MyString = '01wd.00000'
stop(clip(Loc:MyString)& ' '&CHOOSE(NUMERIC(Loc:MyString)=1 AND Loc:MyString*1=0,TRUE,FALSE))
...
Функция преобразования строки в число
Добавлено: 24 Декабрь 2017, 15:14
Игорь Столяров
Ал писал(а): 24 Декабрь 2017, 14:35CHOOSE(NUMERIC(Loc:MyString)=1 AND Loc:MyString*1=0,TRUE,FALSE)
Спасибо ! Всё очень здорово, но ...
1. Хотелось бы всё-таки упростить решение задачи, а не усложнить (см. пример в первом посте) ...

2. Замена сложения на умножение приводит к погрешностям для дробей с высокой разрядностью.
(перед сравнением надо применять Round() - мы это многократно обсуждали в форуме, и тогда вообще теряется смысл)

Функция преобразования строки в число
Добавлено: 24 Декабрь 2017, 15:37
Ал
Игорь Столяров писал(а): 24 Декабрь 2017, 15:14
Ал писал(а): 24 Декабрь 2017, 14:35CHOOSE(NUMERIC(Loc:MyString)=1 AND Loc:MyString*1=0,TRUE,FALSE)
Спасибо ! Всё очень здорово, но ...
1. Хотелось бы всё-таки упростить решение задачи, а не усложнить (см. пример в первом посте) ...

2. Замена сложения на умножение приводит к погрешностям для дробей с высокой разрядностью.
(перед сравнением надо применять Round() - мы это многократно обсуждали в форуме, и тогда вообще теряется смысл)
Такая шалость вообще возможна ?

ну а про
Замена сложения на умножение приводит к погрешностям для дробей с высокой разрядностью
- слишком "научно" для меня, старого - я ж только круглый "0" ищу...

давно-давно -седой профессор учил - "...проверяйте экспериментально, по возможности..." - пример в контексте определения умножения "0 * 1 <> 0" могу увидеть с этой вашей
...Замена сложения на умножение приводит к погрешностям для дробей с высокой разрядностью

"простота хуже..." - ждали совсем готовое решение? - клавиатуру у вас никто не отобрал - опишите свою функцию StringToNumber() с нужными проверками/преобразованиями внутри и в путь...
речь ведь шла только про
Нужно найти в потоке данных строки с нулевыми значениями;
или я что-то не так прочитал в первом посте

Функция преобразования строки в число
Добавлено: 24 Декабрь 2017, 16:12
kreator
А ещё раз. Почему не нравится вот это:
Alex_G писал(а): 24 Декабрь 2017, 13:43
IF Deformat(Loc:MyString)=0
...
end
Вроде работает. Deformat возвращает строку, но сравнение с нулём отрабатывает правильно.
Даже вот так работает:
Код: Выделить всё
s" = '00.00000'
if s"=0
stop('Нулевое значение = ' & deformat(s"))
else
stop('Ненулевое значение = ' & deformat(s"))
end
Функция преобразования строки в число
Добавлено: 24 Декабрь 2017, 16:16
Ал
да не парся, кто ищет - тот найдет свой правильный вариант...
Функция преобразования строки в число
Добавлено: 25 Декабрь 2017, 9:36
Yufil
Evaluate(String)

С последующей проверкой ErrorCode()
Функция преобразования строки в число
Добавлено: 25 Декабрь 2017, 10:06
Игорь Столяров
Yufil писал(а): 25 Декабрь 2017, 9:36Evaluate(String)
O ! А вот это традиционно в десятку ... Спасибо !

Немного стыдно, конечно, что сам не додумался ....
