Cold try this as a modification, keeping your method:
Putting getNumericValue as a subroutine (I find that better for these forum LISPs, copy and paste 1 routine rather than several), getNumericValue altered. I didn't test for mtexts numbers over 256 characters - it should work if you really really want to.
Changed the order in the main routine a bit, calculates and reports the value of the 'v's just after selection - handy to have a confirmation of the selected value just after selection
Works in my quick tests
(defun c:CalcTwoTxt ( / lastOp prompt op ent1 ent2 v1 v2 result inspt validOps)
(defun getNumericValue (ent / edata val str1 str3)
(setq edata (entget ent))
(setq val 0)
(if (or (equal (cdr (assoc 0 edata)) "TEXT")(equal (cdr (assoc 0 edata)) "MTEXT"))
(progn
(setq val (cdr (assoc 1 edata)))
(if (assoc 3 edata) (setq val (strcat str1 str3)))
) ; end progn
)
(princ val)
(atof val)
)
(setq validOps '("*" "+" "-" "/"))
(setq lastOp (getenv "CALC_TXT_LAST_OP"))
(setq prompt (strcat "\nSelect an operation [*/+/-/\/] <" (if lastOp lastOp "") ">: "))
(setq op (getstring "\nSelect an operation [*/+/-/]: "))
(if (= op "") (setq op lastOp))
(if (not (member op validOps))
(progn
(alert "An invalid operation. The operation is used \"+\".")
(setq op "+")
)
)
(setenv "CALC_TXT_LAST_OP" op)
(setq ent1 (car (entsel "\nSelect the first text or MTEXT: ")))
(if (null ent1) (exit))
(setq v1 (getNumericValue ent1))
(setq ent2 (car (entsel "\nSelect the second text or MTEXT: ")))
(if (null ent2) (exit))
(setq v2 (getNumericValue ent2))
(cond
((= op "*") (setq result (* v1 v2)))
((= op "+") (setq result (+ v1 v2)))
((= op "-") (setq result (- v1 v2)))
((= op "/")
(if (zerop v2)
(setq result 0.0)
(setq result (/ v1 v2))
)
)
(T (setq result 0.0))
)
(setq inspt (getpoint "\nSpecify the insertion point of the result: "))
(if (null inspt) (exit))
(command "_.TEXT" inspt "2.5" "0" (rtos result 2 2) "")
(princ)
)