Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

1 Август 2021, 06:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Задача преобразовать выражение из текста в число и посчитать  (Прочитано 1230 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Alex_new1
Участник
**
Offline Offline

Сообщений: 7


« Стартовое сообщение: 25 Май 2021, 09:50 »

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

* Преобразование текста.ods (10.64 Кб - загружено 8 раз.)
« Последнее редактирование: 25 Май 2021, 09:57 от Alex_new1 » Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 139


« Ответ #1: 25 Май 2021, 10:37 »

Добрый день.
А операция над числами только сложение?
Записан

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

Сообщений: 1 514


« Ответ #2: 25 Май 2021, 11:50 »

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

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

Работает в LibreOffiсе 5 (Windows XP/Vista), и в 6, 7 (Windows 7/8/10).

* eval_me.py.7z (0.19 Кб - загружено 7 раз.)
* Eval.ods (16.36 Кб - загружено 9 раз.)

* Eval.jpg (84.72 Кб, 1159x729 - просмотрено 24 раз.)
« Последнее редактирование: 25 Май 2021, 12:07 от economist » Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Alex_new1
Участник
**
Offline Offline

Сообщений: 7


« Ответ #3: 25 Май 2021, 12:18 »

Добрый день.
А операция над числами только сложение?
Именно так
Только формула 1+1 где вместо 1 простые целые числа
Записан
Alex_new1
Участник
**
Offline Offline

Сообщений: 7


« Ответ #4: 25 Май 2021, 12:21 »

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

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

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

Сообщений: 1 514


« Ответ #5: 25 Май 2021, 12:29 »

прийдеться на каждом из них делать среду.

Не придется, можно внедрить 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/
« Последнее редактирование: 25 Май 2021, 12:35 от economist » Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Alex_new1
Участник
**
Offline Offline

Сообщений: 7


« Ответ #6: 25 Май 2021, 12:35 »

Спасибо большое.
Нашел вроде решение попроще.
Применил такую формулу
=ЗАМЕНИТЬБ(B8;2;2;"") и =ЗАМЕНИТЬБ(B8;1;2;"") и тем самым в 2 ячейках вытащил по обоему слагаемому. а потом уже сделал что хочу.
Большое Спасибо за ПОМОЩЬ. Она заставляет думать и шевелить мозгами.
Приложил свой вариант- вдруг потребуется кому то или найдется еще проще решение.
« Последнее редактирование: 25 Май 2021, 13:31 от Alex_new1 » Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 139


« Ответ #7: 25 Май 2021, 12:47 »

Если складываются только 2 цифры, то можно так
Код:
=LEFT(B8;1)+RIGHT(B8;1)
, если числа, то нужно чуть усложнить
Записан

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

Пол: Мужской
Сообщений: 490


WWW
« Ответ #8: 25 Май 2021, 13:00 »

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

Код:
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

Число слагаемых - произвольно.
« Последнее редактирование: 25 Май 2021, 13:04 от sokol92 » Записан

Владимир.
Alex_new1
Участник
**
Offline Offline

Сообщений: 7


« Ответ #9: 25 Май 2021, 13:36 »

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

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

« Последнее редактирование: 25 Май 2021, 14:48 от Alex_new1 » Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 139


« Ответ #10: 25 Май 2021, 15:15 »

НЕТ контроля ввода
а какой у Вас контроль? попробуйте 1+25.
Записан

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

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 185


« Ответ #11: 25 Май 2021, 17:23 »

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

Код:
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$"))

в Данные->Проверка.
« Последнее редактирование: 25 Май 2021, 17:26 от mikekaganski » Записан

С уважением,
Михаил Каганский
Alex_new1
Участник
**
Offline Offline

Сообщений: 7


« Ответ #12: 28 Май 2021, 06:40 »

а какой у Вас контроль? попробуйте 1+25.
У нас контроль основанный на физике процесса. То есть максимум цифры от 0 до 8.  
По этому сделал простой контроль это длина строки. если она 3 символа беру первый и последний. то когда шел вариант с фактически аннулированием 2 символов
 и следовательно типичная ошибка -задание одного числа приводила к ошибке, оператор сразу это  видел и исправлял. Не гадал.
В варианте суммирования последнего и первого символа просто число умножалось на 2. и главное оператор не видел, что ошибся в формате. И брал последующие расчеты как точные данные.
По этому и сделал контроль количества символов, если не 3 символа- то ошибка, если не цифры- тоже даст ошибку. То есть подавляющее количество ошибок ловиться. Ну и формула простая.
=ЕСЛИ(ДЛИНБ(C6)=3;ЛЕВ(C6;1)+ПРАВ(C6;1);" Ошибка формата ввода Проверьте") .
« Последнее редактирование: 28 Май 2021, 08:19 от Alex_new1 » Записан
eeigor
Форумчанин
***
Online Online

Пол: Мужской
Сообщений: 626



« Ответ #13: 28 Май 2021, 16:59 »

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

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

Ubuntu 18.04 LTS • LO 7.1.3.2 Community
Alex_new1
Участник
**
Offline Offline

Сообщений: 7


« Ответ #14: 11 Июнь 2021, 14:01 »

Спасибо
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!