-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathformula.go
More file actions
78 lines (70 loc) · 1.89 KB
/
formula.go
File metadata and controls
78 lines (70 loc) · 1.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package formula_engine
import (
"errors"
"fmt"
)
var ignoreFormulaParamCalc = map[string]bool{
"CONVERTSTR": true,
}
var formulaDict = map[string]formula{
"REPLACEB": &fREPLACEB{},
"INT": &fINT{},
"GTE": &fGTE{},
"LTE": &fLTE{},
"GT": &fGT{},
"LT": &fLT{},
"EQ": &fEQ{},
"NEQ": &fNEQ{},
"LIKE": &fLike{},
"ISBLANK": &fISBLANK{},
"HASSUBSTR": &fHasSubStr{},
"INCLUDESTR": &fINCLUDESTR{},
"NINCLUDESTR": &fNINCLUDESTR{},
"MID": &fMid{},
"LEFT": &fLeft{},
"RIGHT": &fRight{},
"IF": &fIF{},
"CONVERTSTR": &fConvert{},
"LEN": &fLen{},
"ARRAY_SPLIT": &fArraySplit{},
"MIN": &fMin{},
"CONCAT": &fConcat{},
"ADD": &fAdd{},
"AND": &fAnd{},
"OR": &fOr{},
}
// formula 公式
type formula interface {
// Invoke 计算公式值
Invoke(env *Wrapper, args ...*Token) (*Token, error)
}
type fREPLACEB struct{}
// Invoke REPLACEB(原字符串,开始位置,字节个数,新字符串)
func (r fREPLACEB) Invoke(env *Wrapper, args ...*Token) (*Token, error) {
result := newToken("")
if args[0].Value == nil {
return result, nil
}
startPos := args[1].getIntValue() - 1
if startPos < 0 {
return nil, errors.New(fmt.Sprintf("formula REPLACEB start position should be greater than 0"))
}
count := args[2].getIntValue()
str := fmt.Sprintf("%v", args[0].Value)
targetStr := fmt.Sprintf("%v", args[3].Value)
if startPos > len(str) {
return newStringToken(str), nil
}
prefix := str[0:startPos]
if startPos+count >= len(str) {
return newStringToken(prefix + targetStr), nil
}
suffix := str[startPos+count:]
return newStringToken(prefix + targetStr + suffix), nil
}
type fINT struct{}
func (i fINT) Invoke(env *Wrapper, args ...*Token) (*Token, error) {
arg := args[0]
result := arg.getFloatValue().IntPart()
return newIntToken(result), nil
}