# Sharing a script: solve arbitrary blocks of text as math. browsing

• posted
1

A common task I have: I want to write down some numbers or a simple formula of some kind, and then go ahead and do something with the numbers or solve a simple equation with them. Examples: writing down how much I paid for each bill in a note or drafts, then summing them; working out a simple algebra equation for something like a mildly complicated tax/tip situation and then solving it.

There are lots of calculators in the built-in Pythonista examples, but none which quite met my needs for dealing with pre-written text. There are also special-purpose apps for things like ticker-tape calculators, but I don't think any of them do algebra, and, besides, why pay for a separate app when pythonista is right there plus has the full power of sympy available?

So I wrote my own little script. Takes share sheet or clipboard input string. If it's just a list of numbers, sums them. If there are arithmetic operators, evaluates the expression. If it's a simple one-variable expression, assumes it's an equation with the other side zero and feeds it to sympy to solve. If it's a one-variable equation, back to sympy. Should handle most basic day-to-day ticker-tape math needs, in only 75-ish lines of actual code.

• posted
1

@paultopia, to make sure I understand what is happening, and to add a few features like result precision and tokenization, I re-implemented your code as a class. It is here, intended to be used like this:

``````    >>> Kalkylation("1 2\\n3")
Input: 1 + 2 + 3
Symbolic result: 6
Numeric result: 6.00

>>> k = Kalkylation("1 = 2+x")
>>> k
Input: 1 = 2 + x
Symbolic result: -1
Numeric result: -1.00

>>> k.tokens
['1', '=', '2', '+', 'x']

>>> Kalkylation.result_decimals = '.000001'

>>> Kalkylation("1+23 =3+x**2")
Input: 1 + 23 = 3 + x ** 2
Symbolic result: -sqrt(21), sqrt(21)
Numeric result: -4.582576, 4.582576``````

• posted
0

@mikael said:

Does the user have to give permission if you use this?

Sorry if I don't understand your question but my code is available here

• posted
0

@cvp, I meant that this looks like an in-app keyboard, which is excellent, as cross-app custom keyboards need to ask for permission.

• posted
0

@mikael ok, sorry, in-app

• posted
0

@mikael error

``````NameError: name 'ROUND_HALF_EVEN' is not defined
``````
``````from decimal import Decimal, ROUND_HALF_EVEN
``````

• posted
0

@cvp, curious, works for me. Restart Pythonista?

• posted
0

@mikael As this is a "from decimal", it seems normal to import it, isn't it?

``````from decimal import Decimal, ROUND_HALF_EVEN
``````

Has solved

• posted
0

Copy my SetTextFieldPad from GitHub and place this code after @mikael 's module

``````
import ui

def my_action(sender):
sender.TextField.close()

tf = ui.TextField()
{'key':'back space','icon':'typb:Delete'},
{'key':'new row'},
{'key':'4'},{'key':'5'},{'key':'6'},
{'key':'delete','icon':'emj:Multiplication_X'},
{'key':'new row'},
{'key':'7'},{'key':'8'},{'key':'9'},
{'key':'x'},
{'key':'new row'},
{'key':'+'},{'key':'='},
{'key':'⏎', 'action':my_action},
{'key':'new row'},
{'key':'nul'},{'key':'0'}]
tf.text = ''
tf.width = 400
tf.present('sheet')
tf.begin_editing()
tf.wait_modal()
k = Kalkylation(tf.text)
print(k)
``````

And you will get

• posted
0

@cvp said:

``````from decimal import Decimal, ROUND_HALF_EVEN
``````

My turn to misunderstand, sorry. I thought you had already added this, and it still wasn’t finding it.

Internal error.

Oops! Looks like something went wrong!