Modified calculate to allow for string concatenation
This commit is contained in:
parent
9520f75399
commit
9188922f43
58
cell.go
58
cell.go
|
@ -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)
|
||||
|
|
2
main.go
2
main.go
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue