Страница 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() - мы это многократно обсуждали в форуме, и тогда вообще теряется смысл) :(
Такая шалость вообще возможна ?
:mrgreen:
ну а про
Замена сложения на умножение приводит к погрешностям для дробей с высокой разрядностью
- слишком "научно" для меня, старого - я ж только круглый "0" ищу... :(
давно-давно -седой профессор учил - "...проверяйте экспериментально, по возможности..." - пример в контексте определения умножения "0 * 1 <> 0" могу увидеть с этой вашей
...Замена сложения на умножение приводит к погрешностям для дробей с высокой разрядностью
:?:
"простота хуже..." - ждали совсем готовое решение? - клавиатуру у вас никто не отобрал - опишите свою функцию StringToNumber() с нужными проверками/преобразованиями внутри и в путь...
речь ведь шла только про
Нужно найти в потоке данных строки с нулевыми значениями;
или я что-то не так прочитал в первом посте :nr:

Функция преобразования строки в число

Добавлено: 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 ! А вот это традиционно в десятку ... Спасибо ! :)
Немного стыдно, конечно, что сам не додумался .... ;)