Modified calculate to allow for string concatenation

This commit is contained in:
sloum 2021-03-17 13:02:47 -07:00
parent 9520f75399
commit 9188922f43
3 changed files with 33 additions and 29 deletions

58
cell.go
View File

@ -93,6 +93,7 @@ func (c *cell) Update(val string) bool {
c.num = num
c.mask = strconv.FormatFloat(num, 'f', -1, 64)
} else if strings.HasPrefix(val, "\"") && strings.HasSuffix(val, "\"") {
c.rawVal = strings.Replace(c.rawVal, " ", "\\_", -1)
c.kind = Text
c.mask = strings.Replace(val[1:len(val)-1], "\\_", " ", -1)
} else {
@ -106,10 +107,6 @@ func (c *cell) Calculate() {
if c.kind != Expr {
return
}
if len(c.expr) < 2 {
c.mask = "#Err"
return
}
insideString := false
s := makeStack()
@ -117,7 +114,7 @@ func (c *cell) Calculate() {
if IsAddr(v) {
c, err := GetCell(Addr2Point(v))
if err != nil {
c.mask = "#Err"
c.mask = "#Err: Invalid Cell"
return
}
if c.kind == Text {
@ -129,27 +126,14 @@ func (c *cell) Calculate() {
// TODO Apply range
}
if s.ptr >= 0 && s.text {
c.mask = "#Err"
return
}
switch true {
case strings.HasPrefix(v, "\""):
if s.ptr >= 0 {
c.mask = "#Err"
return
}
if !strings.HasSuffix(v, "\"") {
insideString = true
}
s.str.WriteString(strings.Replace(v, "\"", "", -1))
s.text = true
case insideString:
if s.ptr >= 0 {
c.mask = "#Err"
return
}
if strings.HasSuffix(v, "\"") {
insideString = false
v = strings.Replace(v, "\"", "", -1)
@ -157,22 +141,32 @@ func (c *cell) Calculate() {
s.str.WriteRune(' ')
s.str.WriteString(v)
case IsFunc(v):
if s.text {
c.mask = "#Err"
return
} else if v == "+" {
v = strings.ToUpper(v)
if v == "SPC" {
s.str.WriteRune(' ')
s.text = true
}
if v == "+" {
s.Add()
} else if v == "-" {
}
if v == "-" {
s.Subtract()
} else if v == "/" {
}
if v == "/" {
s.Divide()
} else if v == "*" {
}
if v == "*" {
s.Multiply()
}
if v == "." {
num := s.Pop()
s.str.WriteString(strconv.FormatFloat(num, 'f', -1, 64))
s.text = true
}
default:
v, err := strconv.ParseFloat(v, 64)
if err != nil {
c.mask = "#Err"
c.mask = "#Err: Cannot parse float"
return
}
s.Push(v)
@ -180,11 +174,17 @@ func (c *cell) Calculate() {
}
if s.text {
if s.ptr != -1 {
for s.Len() > 0 {
num := s.Pop()
s.str.WriteString(strconv.FormatFloat(num, 'f', -1, 64))
}
}
c.mask = strings.Replace(s.str.String(), "\\_", " ", -1)
} else if s.ptr == 0 {
c.mask = strconv.FormatFloat(s.data[0], 'f', -1, 64)
} else {
c.mask = "Err"
c.mask = "#Err: Invalid Formula"
}
}
@ -215,6 +215,10 @@ func (s *stack) Pop() float64 {
return s.data[s.ptr+1]
}
func (s stack) Len() int {
return s.ptr + 1
}
func (s *stack) Add() {
if s.text {
val := strconv.FormatFloat(s.Pop(), 'f', -1, 64)

View File

@ -151,7 +151,7 @@ func IsRange(addr string) bool {
func IsFunc(val string) bool {
switch strings.ToUpper(val) {
case "+", "-", "/", "*", "^", "MIN", "MAX", "SQRT",
"ROUND", "SUBSTR", "UPPER", "LOWER", "SUM":
"ROUND", "SUBSTR", "UPPER", "LOWER", "SUM", "SPC", ".":
return true
default:
return false

View File

@ -65,7 +65,7 @@ func (w *workbook) Run() {
w.sheets[w.sheet].moveSelection(input, w.termRows)
case Quit:
if modified {
fmt.Print("There are unsaved changes. Quit? [y/n]")
fmt.Print("There are unsaved changes. Quit anyway? [y/n]")
answer := Getch()
if answer == 'n' || answer == 'N' {
continue