Задача преобразовать выражение из текста в число и посчитать

Автор Alex_new1, 25 мая 2021, 09:50

0 Пользователи и 1 гость просматривают эту тему.

Alex_new1

Уважаемые знатоки. Помогите и мне своим опытом и советом.
Есть текстовая ячейка в которой пишется значение типа 1+0 или 0+2 или 4+4 . Естественно все текстом. Без знака =
Проблема в том , что дальше нужно это значение посчитать. И нужно что бы было записано оператором именно так.
Либре  Version 7.0.1.2,
Вот не получается каменный цветок.
При этом стандартная функция преобразования текста в число у меня не работает, так как это не число, а выражение.
С легкостью получаю следующую ячейку с текстовым значением  =1+0 или =0+2 или =4+4 .....
При этом запутался , что делать дальше или вместо. Не хватает знаний.
При этом это постоянная задача. текст вводиться оператором в удобном ему формате. так же в этом формате он воспринимается другим человеком и ему так удобно.
То есть нет варианта менять тип ячеек. в месте ввода они удобны.
Как бы глупо заставлять еще вводить оператором посчитанное значение как в наших примерах 1 , 2 , 8 .... Вроде как задача для компьютера.... и не хватает знаний.

bigor

Добрый день.
А операция над числами только сложение?
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

economist

#2
Воспользуйтесь мощью языка Python, умеющего вычислять выражения (и даже символьные выражения).
Арифметичесие операнды + - * / в Calc и Python совпадают. А вот для степеней, корней, логарифмов и интегралов, тригонометрии - потребуется легкая доработка (например, для возведения в степень - замена ^ на **).

Инструкции на скрине (вложения), суть её - распакуйте 7z архив в папку внутри LibreOffice в подпапку ..\share\Scripts\python и откройте ODS-файл (макросы должны быть разрешены).

Работает в LibreOffiсе 5 (Windows XP/Vista), и в 6, 7 (Windows 7/8/10).
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Alex_new1

Цитата: Bigor от 25 мая 2021, 10:37
Добрый день.
А операция над числами только сложение?
Именно так
Только формула 1+1 где вместо 1 простые целые числа

Alex_new1

Цитата: economist от 25 мая 2021, 11:50
Воспользуйтесь мощью языка Python, умеющего вычислять выражения (и даже символьные выражения).
Арифметичесие операнды + - * / в Calc и Python совпадают. А вот для степеней, корней, логарифмов и интегралов, тригонометрии - потребуется легкая доработка (например, для возведения в степень - замена ^ на **).

Инструкции на скрине (вложения), суть её - распакуйте 7z архив в папку внутри LibreOffice в подпапку ..\share\Scripts\python и откройте ODS-файл (макросы должны быть разрешены).

Работает в LibreOffiсе 5 (Windows XP/Vista), и в 6, 7 (Windows 7/8/10).
Большое спасибо . К сожалению таблица будет использоваться на разных компьютерах. У разных пользователей операторов. И в этом случае прийдеться на каждом из них делать среду. Что не совсем желательно. Может есть варианты попроще мощностью стандартного языка. Типа выделить первый символ и понять его и преобразовать в число. выделить 3 символ и преобразовать. а уже потом сложить

economist

#5
Цитата: Alex_new1 от 25 мая 2021, 12:21прийдеться на каждом из них делать среду.

Не придется, можно внедрить Python-макрос прямо внутрь ODS-документа: https://extensions.libreoffice.org/en/extensions/show/apso-alternative-script-organizer-for-python

Расширение нужно поставить на одном компьютере, внедрить макрос в ODS. Этот ODS можно открывать в любом LO 5-7 с включенными макросами.

Чтобы не настраивать, скажем, 250 шт. разных компьютеров с LibreOffice 5/6/7- я настраиваю один (свой) и копирую всем остальным. Для этого нужен LibreOffice Portable https://www.libreoffice.org/download/portable-versions/
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Alex_new1

#6
Спасибо большое.
Нашел вроде решение попроще.
Применил такую формулу
=ЗАМЕНИТЬБ(B8;2;2;"") и =ЗАМЕНИТЬБ(B8;1;2;"") и тем самым в 2 ячейках вытащил по обоему слагаемому. а потом уже сделал что хочу.
Большое Спасибо за ПОМОЩЬ. Она заставляет думать и шевелить мозгами.
Приложил свой вариант- вдруг потребуется кому то или найдется еще проще решение.

bigor

Если складываются только 2 цифры, то можно так =LEFT(B8;1)+RIGHT(B8;1), если числа, то нужно чуть усложнить
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

sokol92

Если в ячейке из арифметических знаков может присутствовать только знак сложения, то можно так:

Option Explicit
' Вычисляет выражение число [+число]...
' Можно использовать в формулах, например: =SumText(A1)
Function SumText(arg) As Variant
  Dim v
  SumText=Cdbl(0)
  For Each v In Split(arg, "+")
    If IsNumeric(Trim(v)) Then
      SumText=SumText + Cdbl(Trim(v))
    Else
      SumText=Array()   ' ошибочное значение
      Exit Function  
    End If
  Next    
End Function


Число слагаемых - произвольно.
Владимир.

Alex_new1

#9
Цитата: Bigor от 25 мая 2021, 12:47=LEFT(B8;1)+RIGHT(B8;1)
Попробовал. не получил результата. Возможно нужен аналог именно для русского языка.
Именно так Просто исправил на русский и ВСЕ получилось. Отличное решение! Хотя странно, что локализованная версия не понимает ввод англоязычных команд.

Большое СПАСИБО всем за помощь!
Но в предложенном варианте НЕТ контроля ввода! Если в том варианте , который я делал кроме получения результата давалось сообщение об ошибке при не соблюдением оператором формата ввода, то в данном случае просто ввод числа умножает его на 2....
Сделал так и сделал проверку на ошибки. Решение красивое.


bigor

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

#11
Для контроля ввода проще всего использовать формулу типа

AND(LEN(B8)=3;ISNUMBER(VALUE(LEFT(B8;1)));ISNUMBER(VALUE(RIGHT(B8;1)));MID(B8;2;1)="+")

или начиная с 6.2

ISTEXT(REGEX(B8;"^\d\+\d$"))

в Данные->Проверка.
С уважением,
Михаил Каганский

Alex_new1

#12
Цитата: Bigor от 25 мая 2021, 15:15а какой у Вас контроль? попробуйте 1+25.
У нас контроль основанный на физике процесса. То есть максимум цифры от 0 до 8.  
По этому сделал простой контроль это длина строки. если она 3 символа беру первый и последний. то когда шел вариант с фактически аннулированием 2 символов
и следовательно типичная ошибка -задание одного числа приводила к ошибке, оператор сразу это  видел и исправлял. Не гадал.
В варианте суммирования последнего и первого символа просто число умножалось на 2. и главное оператор не видел, что ошибся в формате. И брал последующие расчеты как точные данные.
По этому и сделал контроль количества символов, если не 3 символа- то ошибка, если не цифры- тоже даст ошибку. То есть подавляющее количество ошибок ловиться. Ну и формула простая.
=ЕСЛИ(ДЛИНБ(C6)=3;ЛЕВ(C6;1)+ПРАВ(C6;1);" Ошибка формата ввода Проверьте") .

eeigor

Замените формулу.

Функция ДЛИНБ отсчитывает по два байта на каждый символ, только если языком по умолчанию является язык с поддержкой двухбайтовой кодировки. В противном случае функция ДЛИНБ работает так же, как функция ДЛСТР, и отсчитывает по одному байту на каждый символ.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community