calc.go 101 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471
  1. // Copyright 2016 - 2020 The excelize Authors. All rights reserved. Use of
  2. // this source code is governed by a BSD-style license that can be found in
  3. // the LICENSE file.
  4. //
  5. // Package excelize providing a set of functions that allow you to write to
  6. // and read from XLSX / XLSM / XLTM files. Supports reading and writing
  7. // spreadsheet documents generated by Microsoft Exce™ 2007 and later. Supports
  8. // complex components by high compatibility, and provided streaming API for
  9. // generating or reading data from a worksheet with huge amounts of data. This
  10. // library needs Go version 1.10 or later.
  11. package excelize
  12. import (
  13. "bytes"
  14. "container/list"
  15. "errors"
  16. "fmt"
  17. "math"
  18. "math/rand"
  19. "reflect"
  20. "regexp"
  21. "sort"
  22. "strconv"
  23. "strings"
  24. "time"
  25. "unicode"
  26. "github.com/xuri/efp"
  27. )
  28. // Excel formula errors
  29. const (
  30. formulaErrorDIV = "#DIV/0!"
  31. formulaErrorNAME = "#NAME?"
  32. formulaErrorNA = "#N/A"
  33. formulaErrorNUM = "#NUM!"
  34. formulaErrorVALUE = "#VALUE!"
  35. formulaErrorREF = "#REF!"
  36. formulaErrorNULL = "#NULL"
  37. formulaErrorSPILL = "#SPILL!"
  38. formulaErrorCALC = "#CALC!"
  39. formulaErrorGETTINGDATA = "#GETTING_DATA"
  40. )
  41. // Numeric precision correct numeric values as legacy Excel application
  42. // https://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel In the
  43. // top figure the fraction 1/9000 in Excel is displayed. Although this number
  44. // has a decimal representation that is an infinite string of ones, Excel
  45. // displays only the leading 15 figures. In the second line, the number one
  46. // is added to the fraction, and again Excel displays only 15 figures.
  47. const numericPrecision = 1000000000000000
  48. // cellRef defines the structure of a cell reference.
  49. type cellRef struct {
  50. Col int
  51. Row int
  52. Sheet string
  53. }
  54. // cellRef defines the structure of a cell range.
  55. type cellRange struct {
  56. From cellRef
  57. To cellRef
  58. }
  59. // formula criteria condition enumeration.
  60. const (
  61. _ byte = iota
  62. criteriaEq
  63. criteriaLe
  64. criteriaGe
  65. criteriaL
  66. criteriaG
  67. criteriaBeg
  68. criteriaEnd
  69. )
  70. // formulaCriteria defined formula criteria parser result.
  71. type formulaCriteria struct {
  72. Type byte
  73. Condition string
  74. }
  75. // ArgType is the type if formula argument type.
  76. type ArgType byte
  77. // Formula argument types enumeration.
  78. const (
  79. ArgUnknown ArgType = iota
  80. ArgNumber
  81. ArgString
  82. ArgList
  83. ArgMatrix
  84. ArgError
  85. ArgEmpty
  86. )
  87. // formulaArg is the argument of a formula or function.
  88. type formulaArg struct {
  89. Number float64
  90. String string
  91. List []formulaArg
  92. Matrix [][]formulaArg
  93. Boolean bool
  94. Error string
  95. Type ArgType
  96. }
  97. // Value returns a string data type of the formula argument.
  98. func (fa formulaArg) Value() (value string) {
  99. switch fa.Type {
  100. case ArgNumber:
  101. if fa.Boolean {
  102. if fa.Number == 0 {
  103. return "FALSE"
  104. }
  105. return "TRUE"
  106. }
  107. return fmt.Sprintf("%g", fa.Number)
  108. case ArgString:
  109. return fa.String
  110. case ArgError:
  111. return fa.Error
  112. }
  113. return
  114. }
  115. // ToNumber returns a formula argument with number data type.
  116. func (fa formulaArg) ToNumber() formulaArg {
  117. var n float64
  118. var err error
  119. switch fa.Type {
  120. case ArgString:
  121. n, err = strconv.ParseFloat(fa.String, 64)
  122. if err != nil {
  123. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  124. }
  125. case ArgNumber:
  126. n = fa.Number
  127. }
  128. return newNumberFormulaArg(n)
  129. }
  130. // formulaFuncs is the type of the formula functions.
  131. type formulaFuncs struct{}
  132. // tokenPriority defined basic arithmetic operator priority.
  133. var tokenPriority = map[string]int{
  134. "^": 5,
  135. "*": 4,
  136. "/": 4,
  137. "+": 3,
  138. "-": 3,
  139. "=": 2,
  140. "<>": 2,
  141. "<": 2,
  142. "<=": 2,
  143. ">": 2,
  144. ">=": 2,
  145. "&": 1,
  146. }
  147. // CalcCellValue provides a function to get calculated cell value. This
  148. // feature is currently in working processing. Array formula, table formula
  149. // and some other formulas are not supported currently.
  150. //
  151. // Supported formulas:
  152. //
  153. // ABS
  154. // ACOS
  155. // ACOSH
  156. // ACOT
  157. // ACOTH
  158. // AND
  159. // ARABIC
  160. // ASIN
  161. // ASINH
  162. // ATAN2
  163. // ATANH
  164. // BASE
  165. // CEILING
  166. // CEILING.MATH
  167. // CEILING.PRECISE
  168. // CHOOSE
  169. // CLEAN
  170. // COMBIN
  171. // COMBINA
  172. // COS
  173. // COSH
  174. // COT
  175. // COTH
  176. // COUNTA
  177. // CSC
  178. // CSCH
  179. // DATE
  180. // DECIMAL
  181. // DEGREES
  182. // EVEN
  183. // EXP
  184. // FACT
  185. // FACTDOUBLE
  186. // FLOOR
  187. // FLOOR.MATH
  188. // FLOOR.PRECISE
  189. // GCD
  190. // IF
  191. // INT
  192. // ISBLANK
  193. // ISERR
  194. // ISERROR
  195. // ISEVEN
  196. // ISNA
  197. // ISNONTEXT
  198. // ISNUMBER
  199. // ISODD
  200. // ISO.CEILING
  201. // LCM
  202. // LEN
  203. // LN
  204. // LOG
  205. // LOG10
  206. // LOWER
  207. // MDETERM
  208. // MEDIAN
  209. // MOD
  210. // MROUND
  211. // MULTINOMIAL
  212. // MUNIT
  213. // NA
  214. // ODD
  215. // OR
  216. // PI
  217. // POWER
  218. // PRODUCT
  219. // PROPER
  220. // QUOTIENT
  221. // RADIANS
  222. // RAND
  223. // RANDBETWEEN
  224. // ROUND
  225. // ROUNDDOWN
  226. // ROUNDUP
  227. // SEC
  228. // SECH
  229. // SIGN
  230. // SIN
  231. // SINH
  232. // SQRT
  233. // SQRTPI
  234. // SUM
  235. // SUMIF
  236. // SUMSQ
  237. // TAN
  238. // TANH
  239. // TRIM
  240. // TRUNC
  241. // UPPER
  242. //
  243. func (f *File) CalcCellValue(sheet, cell string) (result string, err error) {
  244. var (
  245. formula string
  246. token efp.Token
  247. )
  248. if formula, err = f.GetCellFormula(sheet, cell); err != nil {
  249. return
  250. }
  251. ps := efp.ExcelParser()
  252. tokens := ps.Parse(formula)
  253. if tokens == nil {
  254. return
  255. }
  256. if token, err = f.evalInfixExp(sheet, tokens); err != nil {
  257. return
  258. }
  259. result = token.TValue
  260. isNum, precision := isNumeric(result)
  261. if isNum && precision > 15 {
  262. num, _ := roundPrecision(result)
  263. result = strings.ToUpper(num)
  264. }
  265. return
  266. }
  267. // getPriority calculate arithmetic operator priority.
  268. func getPriority(token efp.Token) (pri int) {
  269. pri, _ = tokenPriority[token.TValue]
  270. if token.TValue == "-" && token.TType == efp.TokenTypeOperatorPrefix {
  271. pri = 6
  272. }
  273. if token.TSubType == efp.TokenSubTypeStart && token.TType == efp.TokenTypeSubexpression { // (
  274. pri = 0
  275. }
  276. return
  277. }
  278. // newNumberFormulaArg constructs a number formula argument.
  279. func newNumberFormulaArg(n float64) formulaArg {
  280. if math.IsNaN(n) {
  281. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  282. }
  283. return formulaArg{Type: ArgNumber, Number: n}
  284. }
  285. // newStringFormulaArg constructs a string formula argument.
  286. func newStringFormulaArg(s string) formulaArg {
  287. return formulaArg{Type: ArgString, String: s}
  288. }
  289. // newMatrixFormulaArg constructs a matrix formula argument.
  290. func newMatrixFormulaArg(m [][]formulaArg) formulaArg {
  291. return formulaArg{Type: ArgMatrix, Matrix: m}
  292. }
  293. // newBoolFormulaArg constructs a boolean formula argument.
  294. func newBoolFormulaArg(b bool) formulaArg {
  295. var n float64
  296. if b {
  297. n = 1
  298. }
  299. return formulaArg{Type: ArgNumber, Number: n, Boolean: true}
  300. }
  301. // newErrorFormulaArg create an error formula argument of a given type with a specified error message.
  302. func newErrorFormulaArg(formulaError, msg string) formulaArg {
  303. return formulaArg{Type: ArgError, String: formulaError, Error: msg}
  304. }
  305. // evalInfixExp evaluate syntax analysis by given infix expression after
  306. // lexical analysis. Evaluate an infix expression containing formulas by
  307. // stacks:
  308. //
  309. // opd - Operand
  310. // opt - Operator
  311. // opf - Operation formula
  312. // opfd - Operand of the operation formula
  313. // opft - Operator of the operation formula
  314. //
  315. // Evaluate arguments of the operation formula by list:
  316. //
  317. // args - Arguments of the operation formula
  318. //
  319. // TODO: handle subtypes: Nothing, Text, Logical, Error, Concatenation, Intersection, Union
  320. //
  321. func (f *File) evalInfixExp(sheet string, tokens []efp.Token) (efp.Token, error) {
  322. var err error
  323. opdStack, optStack, opfStack, opfdStack, opftStack := NewStack(), NewStack(), NewStack(), NewStack(), NewStack()
  324. argsList := list.New()
  325. for i := 0; i < len(tokens); i++ {
  326. token := tokens[i]
  327. // out of function stack
  328. if opfStack.Len() == 0 {
  329. if err = f.parseToken(sheet, token, opdStack, optStack); err != nil {
  330. return efp.Token{}, err
  331. }
  332. }
  333. // function start
  334. if token.TType == efp.TokenTypeFunction && token.TSubType == efp.TokenSubTypeStart {
  335. opfStack.Push(token)
  336. continue
  337. }
  338. // in function stack, walk 2 token at once
  339. if opfStack.Len() > 0 {
  340. var nextToken efp.Token
  341. if i+1 < len(tokens) {
  342. nextToken = tokens[i+1]
  343. }
  344. // current token is args or range, skip next token, order required: parse reference first
  345. if token.TSubType == efp.TokenSubTypeRange {
  346. if !opftStack.Empty() {
  347. // parse reference: must reference at here
  348. result, err := f.parseReference(sheet, token.TValue)
  349. if err != nil {
  350. return efp.Token{TValue: formulaErrorNAME}, err
  351. }
  352. if result.Type != ArgString {
  353. return efp.Token{}, errors.New(formulaErrorVALUE)
  354. }
  355. opfdStack.Push(efp.Token{
  356. TType: efp.TokenTypeOperand,
  357. TSubType: efp.TokenSubTypeNumber,
  358. TValue: result.String,
  359. })
  360. continue
  361. }
  362. if nextToken.TType == efp.TokenTypeArgument || nextToken.TType == efp.TokenTypeFunction {
  363. // parse reference: reference or range at here
  364. result, err := f.parseReference(sheet, token.TValue)
  365. if err != nil {
  366. return efp.Token{TValue: formulaErrorNAME}, err
  367. }
  368. if result.Type == ArgUnknown {
  369. return efp.Token{}, errors.New(formulaErrorVALUE)
  370. }
  371. argsList.PushBack(result)
  372. continue
  373. }
  374. }
  375. // check current token is opft
  376. if err = f.parseToken(sheet, token, opfdStack, opftStack); err != nil {
  377. return efp.Token{}, err
  378. }
  379. // current token is arg
  380. if token.TType == efp.TokenTypeArgument {
  381. for !opftStack.Empty() {
  382. // calculate trigger
  383. topOpt := opftStack.Peek().(efp.Token)
  384. if err := calculate(opfdStack, topOpt); err != nil {
  385. return efp.Token{}, err
  386. }
  387. opftStack.Pop()
  388. }
  389. if !opfdStack.Empty() {
  390. argsList.PushBack(formulaArg{
  391. String: opfdStack.Pop().(efp.Token).TValue,
  392. Type: ArgString,
  393. })
  394. }
  395. continue
  396. }
  397. // current token is logical
  398. if token.TType == efp.OperatorsInfix && token.TSubType == efp.TokenSubTypeLogical {
  399. }
  400. // current token is text
  401. if token.TType == efp.TokenTypeOperand && token.TSubType == efp.TokenSubTypeText {
  402. argsList.PushBack(formulaArg{
  403. String: token.TValue,
  404. Type: ArgString,
  405. })
  406. }
  407. // current token is function stop
  408. if token.TType == efp.TokenTypeFunction && token.TSubType == efp.TokenSubTypeStop {
  409. for !opftStack.Empty() {
  410. // calculate trigger
  411. topOpt := opftStack.Peek().(efp.Token)
  412. if err := calculate(opfdStack, topOpt); err != nil {
  413. return efp.Token{}, err
  414. }
  415. opftStack.Pop()
  416. }
  417. // push opfd to args
  418. if opfdStack.Len() > 0 {
  419. argsList.PushBack(formulaArg{
  420. String: opfdStack.Pop().(efp.Token).TValue,
  421. Type: ArgString,
  422. })
  423. }
  424. // call formula function to evaluate
  425. arg := callFuncByName(&formulaFuncs{}, strings.NewReplacer(
  426. "_xlfn", "", ".", "").Replace(opfStack.Peek().(efp.Token).TValue),
  427. []reflect.Value{reflect.ValueOf(argsList)})
  428. if arg.Type == ArgError {
  429. return efp.Token{}, errors.New(arg.Value())
  430. }
  431. argsList.Init()
  432. opfStack.Pop()
  433. if opfStack.Len() > 0 { // still in function stack
  434. if nextToken.TType == efp.TokenTypeOperatorInfix {
  435. // mathematics calculate in formula function
  436. opfdStack.Push(efp.Token{TValue: arg.Value(), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  437. } else {
  438. argsList.PushBack(arg)
  439. }
  440. } else {
  441. opdStack.Push(efp.Token{TValue: arg.Value(), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  442. }
  443. }
  444. }
  445. }
  446. for optStack.Len() != 0 {
  447. topOpt := optStack.Peek().(efp.Token)
  448. if err = calculate(opdStack, topOpt); err != nil {
  449. return efp.Token{}, err
  450. }
  451. optStack.Pop()
  452. }
  453. if opdStack.Len() == 0 {
  454. return efp.Token{}, errors.New("formula not valid")
  455. }
  456. return opdStack.Peek().(efp.Token), err
  457. }
  458. // calcPow evaluate exponentiation arithmetic operations.
  459. func calcPow(rOpd, lOpd string, opdStack *Stack) error {
  460. lOpdVal, err := strconv.ParseFloat(lOpd, 64)
  461. if err != nil {
  462. return err
  463. }
  464. rOpdVal, err := strconv.ParseFloat(rOpd, 64)
  465. if err != nil {
  466. return err
  467. }
  468. result := math.Pow(lOpdVal, rOpdVal)
  469. opdStack.Push(efp.Token{TValue: fmt.Sprintf("%g", result), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  470. return nil
  471. }
  472. // calcEq evaluate equal arithmetic operations.
  473. func calcEq(rOpd, lOpd string, opdStack *Stack) error {
  474. opdStack.Push(efp.Token{TValue: strings.ToUpper(strconv.FormatBool(rOpd == lOpd)), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  475. return nil
  476. }
  477. // calcNEq evaluate not equal arithmetic operations.
  478. func calcNEq(rOpd, lOpd string, opdStack *Stack) error {
  479. opdStack.Push(efp.Token{TValue: strings.ToUpper(strconv.FormatBool(rOpd != lOpd)), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  480. return nil
  481. }
  482. // calcL evaluate less than arithmetic operations.
  483. func calcL(rOpd, lOpd string, opdStack *Stack) error {
  484. lOpdVal, err := strconv.ParseFloat(lOpd, 64)
  485. if err != nil {
  486. return err
  487. }
  488. rOpdVal, err := strconv.ParseFloat(rOpd, 64)
  489. if err != nil {
  490. return err
  491. }
  492. opdStack.Push(efp.Token{TValue: strings.ToUpper(strconv.FormatBool(rOpdVal > lOpdVal)), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  493. return nil
  494. }
  495. // calcLe evaluate less than or equal arithmetic operations.
  496. func calcLe(rOpd, lOpd string, opdStack *Stack) error {
  497. lOpdVal, err := strconv.ParseFloat(lOpd, 64)
  498. if err != nil {
  499. return err
  500. }
  501. rOpdVal, err := strconv.ParseFloat(rOpd, 64)
  502. if err != nil {
  503. return err
  504. }
  505. opdStack.Push(efp.Token{TValue: strings.ToUpper(strconv.FormatBool(rOpdVal >= lOpdVal)), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  506. return nil
  507. }
  508. // calcG evaluate greater than or equal arithmetic operations.
  509. func calcG(rOpd, lOpd string, opdStack *Stack) error {
  510. lOpdVal, err := strconv.ParseFloat(lOpd, 64)
  511. if err != nil {
  512. return err
  513. }
  514. rOpdVal, err := strconv.ParseFloat(rOpd, 64)
  515. if err != nil {
  516. return err
  517. }
  518. opdStack.Push(efp.Token{TValue: strings.ToUpper(strconv.FormatBool(rOpdVal < lOpdVal)), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  519. return nil
  520. }
  521. // calcGe evaluate greater than or equal arithmetic operations.
  522. func calcGe(rOpd, lOpd string, opdStack *Stack) error {
  523. lOpdVal, err := strconv.ParseFloat(lOpd, 64)
  524. if err != nil {
  525. return err
  526. }
  527. rOpdVal, err := strconv.ParseFloat(rOpd, 64)
  528. if err != nil {
  529. return err
  530. }
  531. opdStack.Push(efp.Token{TValue: strings.ToUpper(strconv.FormatBool(rOpdVal <= lOpdVal)), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  532. return nil
  533. }
  534. // calcSplice evaluate splice '&' operations.
  535. func calcSplice(rOpd, lOpd string, opdStack *Stack) error {
  536. opdStack.Push(efp.Token{TValue: lOpd + rOpd, TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  537. return nil
  538. }
  539. // calcAdd evaluate addition arithmetic operations.
  540. func calcAdd(rOpd, lOpd string, opdStack *Stack) error {
  541. lOpdVal, err := strconv.ParseFloat(lOpd, 64)
  542. if err != nil {
  543. return err
  544. }
  545. rOpdVal, err := strconv.ParseFloat(rOpd, 64)
  546. if err != nil {
  547. return err
  548. }
  549. result := lOpdVal + rOpdVal
  550. opdStack.Push(efp.Token{TValue: fmt.Sprintf("%g", result), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  551. return nil
  552. }
  553. // calcSubtract evaluate subtraction arithmetic operations.
  554. func calcSubtract(rOpd, lOpd string, opdStack *Stack) error {
  555. lOpdVal, err := strconv.ParseFloat(lOpd, 64)
  556. if err != nil {
  557. return err
  558. }
  559. rOpdVal, err := strconv.ParseFloat(rOpd, 64)
  560. if err != nil {
  561. return err
  562. }
  563. result := lOpdVal - rOpdVal
  564. opdStack.Push(efp.Token{TValue: fmt.Sprintf("%g", result), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  565. return nil
  566. }
  567. // calcMultiply evaluate multiplication arithmetic operations.
  568. func calcMultiply(rOpd, lOpd string, opdStack *Stack) error {
  569. lOpdVal, err := strconv.ParseFloat(lOpd, 64)
  570. if err != nil {
  571. return err
  572. }
  573. rOpdVal, err := strconv.ParseFloat(rOpd, 64)
  574. if err != nil {
  575. return err
  576. }
  577. result := lOpdVal * rOpdVal
  578. opdStack.Push(efp.Token{TValue: fmt.Sprintf("%g", result), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  579. return nil
  580. }
  581. // calcDiv evaluate division arithmetic operations.
  582. func calcDiv(rOpd, lOpd string, opdStack *Stack) error {
  583. lOpdVal, err := strconv.ParseFloat(lOpd, 64)
  584. if err != nil {
  585. return err
  586. }
  587. rOpdVal, err := strconv.ParseFloat(rOpd, 64)
  588. if err != nil {
  589. return err
  590. }
  591. result := lOpdVal / rOpdVal
  592. if rOpdVal == 0 {
  593. return errors.New(formulaErrorDIV)
  594. }
  595. opdStack.Push(efp.Token{TValue: fmt.Sprintf("%g", result), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  596. return nil
  597. }
  598. // calculate evaluate basic arithmetic operations.
  599. func calculate(opdStack *Stack, opt efp.Token) error {
  600. if opt.TValue == "-" && opt.TType == efp.TokenTypeOperatorPrefix {
  601. if opdStack.Len() < 1 {
  602. return errors.New("formula not valid")
  603. }
  604. opd := opdStack.Pop().(efp.Token)
  605. opdVal, err := strconv.ParseFloat(opd.TValue, 64)
  606. if err != nil {
  607. return err
  608. }
  609. result := 0 - opdVal
  610. opdStack.Push(efp.Token{TValue: fmt.Sprintf("%g", result), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber})
  611. }
  612. tokenCalcFunc := map[string]func(rOpd, lOpd string, opdStack *Stack) error{
  613. "^": calcPow,
  614. "*": calcMultiply,
  615. "/": calcDiv,
  616. "+": calcAdd,
  617. "=": calcEq,
  618. "<>": calcNEq,
  619. "<": calcL,
  620. "<=": calcLe,
  621. ">": calcG,
  622. ">=": calcGe,
  623. "&": calcSplice,
  624. }
  625. if opt.TValue == "-" && opt.TType == efp.TokenTypeOperatorInfix {
  626. if opdStack.Len() < 2 {
  627. return errors.New("formula not valid")
  628. }
  629. rOpd := opdStack.Pop().(efp.Token)
  630. lOpd := opdStack.Pop().(efp.Token)
  631. if err := calcSubtract(rOpd.TValue, lOpd.TValue, opdStack); err != nil {
  632. return err
  633. }
  634. }
  635. fn, ok := tokenCalcFunc[opt.TValue]
  636. if ok {
  637. if opdStack.Len() < 2 {
  638. return errors.New("formula not valid")
  639. }
  640. rOpd := opdStack.Pop().(efp.Token)
  641. lOpd := opdStack.Pop().(efp.Token)
  642. if err := fn(rOpd.TValue, lOpd.TValue, opdStack); err != nil {
  643. return err
  644. }
  645. }
  646. return nil
  647. }
  648. // parseOperatorPrefixToken parse operator prefix token.
  649. func (f *File) parseOperatorPrefixToken(optStack, opdStack *Stack, token efp.Token) (err error) {
  650. if optStack.Len() == 0 {
  651. optStack.Push(token)
  652. } else {
  653. tokenPriority := getPriority(token)
  654. topOpt := optStack.Peek().(efp.Token)
  655. topOptPriority := getPriority(topOpt)
  656. if tokenPriority > topOptPriority {
  657. optStack.Push(token)
  658. } else {
  659. for tokenPriority <= topOptPriority {
  660. optStack.Pop()
  661. if err = calculate(opdStack, topOpt); err != nil {
  662. return
  663. }
  664. if optStack.Len() > 0 {
  665. topOpt = optStack.Peek().(efp.Token)
  666. topOptPriority = getPriority(topOpt)
  667. continue
  668. }
  669. break
  670. }
  671. optStack.Push(token)
  672. }
  673. }
  674. return
  675. }
  676. // isOperatorPrefixToken determine if the token is parse operator prefix
  677. // token.
  678. func isOperatorPrefixToken(token efp.Token) bool {
  679. _, ok := tokenPriority[token.TValue]
  680. if (token.TValue == "-" && token.TType == efp.TokenTypeOperatorPrefix) || ok {
  681. return true
  682. }
  683. return false
  684. }
  685. // getDefinedNameRefTo convert defined name to reference range.
  686. func (f *File) getDefinedNameRefTo(definedNameName string, currentSheet string) (refTo string) {
  687. for _, definedName := range f.GetDefinedName() {
  688. if definedName.Name == definedNameName {
  689. refTo = definedName.RefersTo
  690. // worksheet scope takes precedence over scope workbook when both definedNames exist
  691. if definedName.Scope == currentSheet {
  692. break
  693. }
  694. }
  695. }
  696. return refTo
  697. }
  698. // parseToken parse basic arithmetic operator priority and evaluate based on
  699. // operators and operands.
  700. func (f *File) parseToken(sheet string, token efp.Token, opdStack, optStack *Stack) error {
  701. // parse reference: must reference at here
  702. if token.TSubType == efp.TokenSubTypeRange {
  703. refTo := f.getDefinedNameRefTo(token.TValue, sheet)
  704. if refTo != "" {
  705. token.TValue = refTo
  706. }
  707. result, err := f.parseReference(sheet, token.TValue)
  708. if err != nil {
  709. return errors.New(formulaErrorNAME)
  710. }
  711. if result.Type != ArgString {
  712. return errors.New(formulaErrorVALUE)
  713. }
  714. token.TValue = result.String
  715. token.TType = efp.TokenTypeOperand
  716. token.TSubType = efp.TokenSubTypeNumber
  717. }
  718. if isOperatorPrefixToken(token) {
  719. if err := f.parseOperatorPrefixToken(optStack, opdStack, token); err != nil {
  720. return err
  721. }
  722. }
  723. if token.TType == efp.TokenTypeSubexpression && token.TSubType == efp.TokenSubTypeStart { // (
  724. optStack.Push(token)
  725. }
  726. if token.TType == efp.TokenTypeSubexpression && token.TSubType == efp.TokenSubTypeStop { // )
  727. for optStack.Peek().(efp.Token).TSubType != efp.TokenSubTypeStart && optStack.Peek().(efp.Token).TType != efp.TokenTypeSubexpression { // != (
  728. topOpt := optStack.Peek().(efp.Token)
  729. if err := calculate(opdStack, topOpt); err != nil {
  730. return err
  731. }
  732. optStack.Pop()
  733. }
  734. optStack.Pop()
  735. }
  736. // opd
  737. if token.TType == efp.TokenTypeOperand && token.TSubType == efp.TokenSubTypeNumber {
  738. opdStack.Push(token)
  739. }
  740. return nil
  741. }
  742. // parseReference parse reference and extract values by given reference
  743. // characters and default sheet name.
  744. func (f *File) parseReference(sheet, reference string) (arg formulaArg, err error) {
  745. reference = strings.Replace(reference, "$", "", -1)
  746. refs, cellRanges, cellRefs := list.New(), list.New(), list.New()
  747. for _, ref := range strings.Split(reference, ":") {
  748. tokens := strings.Split(ref, "!")
  749. cr := cellRef{}
  750. if len(tokens) == 2 { // have a worksheet name
  751. cr.Sheet = tokens[0]
  752. if cr.Col, cr.Row, err = CellNameToCoordinates(tokens[1]); err != nil {
  753. return
  754. }
  755. if refs.Len() > 0 {
  756. e := refs.Back()
  757. cellRefs.PushBack(e.Value.(cellRef))
  758. refs.Remove(e)
  759. }
  760. refs.PushBack(cr)
  761. continue
  762. }
  763. if cr.Col, cr.Row, err = CellNameToCoordinates(tokens[0]); err != nil {
  764. return
  765. }
  766. e := refs.Back()
  767. if e == nil {
  768. cr.Sheet = sheet
  769. refs.PushBack(cr)
  770. continue
  771. }
  772. cellRanges.PushBack(cellRange{
  773. From: e.Value.(cellRef),
  774. To: cr,
  775. })
  776. refs.Remove(e)
  777. }
  778. if refs.Len() > 0 {
  779. e := refs.Back()
  780. cellRefs.PushBack(e.Value.(cellRef))
  781. refs.Remove(e)
  782. }
  783. arg, err = f.rangeResolver(cellRefs, cellRanges)
  784. return
  785. }
  786. // prepareValueRange prepare value range.
  787. func prepareValueRange(cr cellRange, valueRange []int) {
  788. if cr.From.Row < valueRange[0] || valueRange[0] == 0 {
  789. valueRange[0] = cr.From.Row
  790. }
  791. if cr.From.Col < valueRange[2] || valueRange[2] == 0 {
  792. valueRange[2] = cr.From.Col
  793. }
  794. if cr.To.Row > valueRange[1] || valueRange[1] == 0 {
  795. valueRange[1] = cr.To.Row
  796. }
  797. if cr.To.Col > valueRange[3] || valueRange[3] == 0 {
  798. valueRange[3] = cr.To.Col
  799. }
  800. }
  801. // prepareValueRef prepare value reference.
  802. func prepareValueRef(cr cellRef, valueRange []int) {
  803. if cr.Row < valueRange[0] || valueRange[0] == 0 {
  804. valueRange[0] = cr.Row
  805. }
  806. if cr.Col < valueRange[2] || valueRange[2] == 0 {
  807. valueRange[2] = cr.Col
  808. }
  809. if cr.Row > valueRange[1] || valueRange[1] == 0 {
  810. valueRange[1] = cr.Row
  811. }
  812. if cr.Col > valueRange[3] || valueRange[3] == 0 {
  813. valueRange[3] = cr.Col
  814. }
  815. }
  816. // rangeResolver extract value as string from given reference and range list.
  817. // This function will not ignore the empty cell. For example, A1:A2:A2:B3 will
  818. // be reference A1:B3.
  819. func (f *File) rangeResolver(cellRefs, cellRanges *list.List) (arg formulaArg, err error) {
  820. // value range order: from row, to row, from column, to column
  821. valueRange := []int{0, 0, 0, 0}
  822. var sheet string
  823. // prepare value range
  824. for temp := cellRanges.Front(); temp != nil; temp = temp.Next() {
  825. cr := temp.Value.(cellRange)
  826. if cr.From.Sheet != cr.To.Sheet {
  827. err = errors.New(formulaErrorVALUE)
  828. }
  829. rng := []int{cr.From.Col, cr.From.Row, cr.To.Col, cr.To.Row}
  830. sortCoordinates(rng)
  831. cr.From.Col, cr.From.Row, cr.To.Col, cr.To.Row = rng[0], rng[1], rng[2], rng[3]
  832. prepareValueRange(cr, valueRange)
  833. if cr.From.Sheet != "" {
  834. sheet = cr.From.Sheet
  835. }
  836. }
  837. for temp := cellRefs.Front(); temp != nil; temp = temp.Next() {
  838. cr := temp.Value.(cellRef)
  839. if cr.Sheet != "" {
  840. sheet = cr.Sheet
  841. }
  842. prepareValueRef(cr, valueRange)
  843. }
  844. // extract value from ranges
  845. if cellRanges.Len() > 0 {
  846. arg.Type = ArgMatrix
  847. for row := valueRange[0]; row <= valueRange[1]; row++ {
  848. var matrixRow = []formulaArg{}
  849. for col := valueRange[2]; col <= valueRange[3]; col++ {
  850. var cell, value string
  851. if cell, err = CoordinatesToCellName(col, row); err != nil {
  852. return
  853. }
  854. if value, err = f.GetCellValue(sheet, cell); err != nil {
  855. return
  856. }
  857. matrixRow = append(matrixRow, formulaArg{
  858. String: value,
  859. Type: ArgString,
  860. })
  861. }
  862. arg.Matrix = append(arg.Matrix, matrixRow)
  863. }
  864. return
  865. }
  866. // extract value from references
  867. for temp := cellRefs.Front(); temp != nil; temp = temp.Next() {
  868. cr := temp.Value.(cellRef)
  869. var cell string
  870. if cell, err = CoordinatesToCellName(cr.Col, cr.Row); err != nil {
  871. return
  872. }
  873. if arg.String, err = f.GetCellValue(cr.Sheet, cell); err != nil {
  874. return
  875. }
  876. arg.Type = ArgString
  877. }
  878. return
  879. }
  880. // callFuncByName calls the no error or only error return function with
  881. // reflect by given receiver, name and parameters.
  882. func callFuncByName(receiver interface{}, name string, params []reflect.Value) (arg formulaArg) {
  883. function := reflect.ValueOf(receiver).MethodByName(name)
  884. if function.IsValid() {
  885. rt := function.Call(params)
  886. if len(rt) == 0 {
  887. return
  888. }
  889. arg = rt[0].Interface().(formulaArg)
  890. return
  891. }
  892. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("not support %s function", name))
  893. }
  894. // formulaCriteriaParser parse formula criteria.
  895. func formulaCriteriaParser(exp string) (fc *formulaCriteria) {
  896. fc = &formulaCriteria{}
  897. if exp == "" {
  898. return
  899. }
  900. if match := regexp.MustCompile(`^([0-9]+)$`).FindStringSubmatch(exp); len(match) > 1 {
  901. fc.Type, fc.Condition = criteriaEq, match[1]
  902. return
  903. }
  904. if match := regexp.MustCompile(`^=(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
  905. fc.Type, fc.Condition = criteriaEq, match[1]
  906. return
  907. }
  908. if match := regexp.MustCompile(`^<=(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
  909. fc.Type, fc.Condition = criteriaLe, match[1]
  910. return
  911. }
  912. if match := regexp.MustCompile(`^>=(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
  913. fc.Type, fc.Condition = criteriaGe, match[1]
  914. return
  915. }
  916. if match := regexp.MustCompile(`^<(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
  917. fc.Type, fc.Condition = criteriaL, match[1]
  918. return
  919. }
  920. if match := regexp.MustCompile(`^>(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
  921. fc.Type, fc.Condition = criteriaG, match[1]
  922. return
  923. }
  924. if strings.Contains(exp, "*") {
  925. if strings.HasPrefix(exp, "*") {
  926. fc.Type, fc.Condition = criteriaEnd, strings.TrimPrefix(exp, "*")
  927. }
  928. if strings.HasSuffix(exp, "*") {
  929. fc.Type, fc.Condition = criteriaBeg, strings.TrimSuffix(exp, "*")
  930. }
  931. return
  932. }
  933. fc.Type, fc.Condition = criteriaEq, exp
  934. return
  935. }
  936. // formulaCriteriaEval evaluate formula criteria expression.
  937. func formulaCriteriaEval(val string, criteria *formulaCriteria) (result bool, err error) {
  938. var value, expected float64
  939. var e error
  940. var prepareValue = func(val, cond string) (value float64, expected float64, err error) {
  941. if value, err = strconv.ParseFloat(val, 64); err != nil {
  942. return
  943. }
  944. if expected, err = strconv.ParseFloat(criteria.Condition, 64); err != nil {
  945. return
  946. }
  947. return
  948. }
  949. switch criteria.Type {
  950. case criteriaEq:
  951. return val == criteria.Condition, err
  952. case criteriaLe:
  953. value, expected, e = prepareValue(val, criteria.Condition)
  954. return value <= expected && e == nil, err
  955. case criteriaGe:
  956. value, expected, e = prepareValue(val, criteria.Condition)
  957. return value >= expected && e == nil, err
  958. case criteriaL:
  959. value, expected, e = prepareValue(val, criteria.Condition)
  960. return value < expected && e == nil, err
  961. case criteriaG:
  962. value, expected, e = prepareValue(val, criteria.Condition)
  963. return value > expected && e == nil, err
  964. case criteriaBeg:
  965. return strings.HasPrefix(val, criteria.Condition), err
  966. case criteriaEnd:
  967. return strings.HasSuffix(val, criteria.Condition), err
  968. }
  969. return
  970. }
  971. // Math and Trigonometric functions
  972. // ABS function returns the absolute value of any supplied number. The syntax
  973. // of the function is:
  974. //
  975. // ABS(number)
  976. //
  977. func (fn *formulaFuncs) ABS(argsList *list.List) formulaArg {
  978. if argsList.Len() != 1 {
  979. return newErrorFormulaArg(formulaErrorVALUE, "ABS requires 1 numeric argument")
  980. }
  981. arg := argsList.Front().Value.(formulaArg).ToNumber()
  982. if arg.Type == ArgError {
  983. return arg
  984. }
  985. return newNumberFormulaArg(math.Abs(arg.Number))
  986. }
  987. // ACOS function calculates the arccosine (i.e. the inverse cosine) of a given
  988. // number, and returns an angle, in radians, between 0 and π. The syntax of
  989. // the function is:
  990. //
  991. // ACOS(number)
  992. //
  993. func (fn *formulaFuncs) ACOS(argsList *list.List) formulaArg {
  994. if argsList.Len() != 1 {
  995. return newErrorFormulaArg(formulaErrorVALUE, "ACOS requires 1 numeric argument")
  996. }
  997. arg := argsList.Front().Value.(formulaArg).ToNumber()
  998. if arg.Type == ArgError {
  999. return arg
  1000. }
  1001. return newNumberFormulaArg(math.Acos(arg.Number))
  1002. }
  1003. // ACOSH function calculates the inverse hyperbolic cosine of a supplied number.
  1004. // of the function is:
  1005. //
  1006. // ACOSH(number)
  1007. //
  1008. func (fn *formulaFuncs) ACOSH(argsList *list.List) formulaArg {
  1009. if argsList.Len() != 1 {
  1010. return newErrorFormulaArg(formulaErrorVALUE, "ACOSH requires 1 numeric argument")
  1011. }
  1012. arg := argsList.Front().Value.(formulaArg).ToNumber()
  1013. if arg.Type == ArgError {
  1014. return arg
  1015. }
  1016. return newNumberFormulaArg(math.Acosh(arg.Number))
  1017. }
  1018. // ACOT function calculates the arccotangent (i.e. the inverse cotangent) of a
  1019. // given number, and returns an angle, in radians, between 0 and π. The syntax
  1020. // of the function is:
  1021. //
  1022. // ACOT(number)
  1023. //
  1024. func (fn *formulaFuncs) ACOT(argsList *list.List) formulaArg {
  1025. if argsList.Len() != 1 {
  1026. return newErrorFormulaArg(formulaErrorVALUE, "ACOT requires 1 numeric argument")
  1027. }
  1028. arg := argsList.Front().Value.(formulaArg).ToNumber()
  1029. if arg.Type == ArgError {
  1030. return arg
  1031. }
  1032. return newNumberFormulaArg(math.Pi/2 - math.Atan(arg.Number))
  1033. }
  1034. // ACOTH function calculates the hyperbolic arccotangent (coth) of a supplied
  1035. // value. The syntax of the function is:
  1036. //
  1037. // ACOTH(number)
  1038. //
  1039. func (fn *formulaFuncs) ACOTH(argsList *list.List) formulaArg {
  1040. if argsList.Len() != 1 {
  1041. return newErrorFormulaArg(formulaErrorVALUE, "ACOTH requires 1 numeric argument")
  1042. }
  1043. arg := argsList.Front().Value.(formulaArg).ToNumber()
  1044. if arg.Type == ArgError {
  1045. return arg
  1046. }
  1047. return newNumberFormulaArg(math.Atanh(1 / arg.Number))
  1048. }
  1049. // ARABIC function converts a Roman numeral into an Arabic numeral. The syntax
  1050. // of the function is:
  1051. //
  1052. // ARABIC(text)
  1053. //
  1054. func (fn *formulaFuncs) ARABIC(argsList *list.List) formulaArg {
  1055. if argsList.Len() != 1 {
  1056. return newErrorFormulaArg(formulaErrorVALUE, "ARABIC requires 1 numeric argument")
  1057. }
  1058. charMap := map[rune]float64{'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
  1059. val, last, prefix := 0.0, 0.0, 1.0
  1060. for _, char := range argsList.Front().Value.(formulaArg).String {
  1061. digit := 0.0
  1062. if char == '-' {
  1063. prefix = -1
  1064. continue
  1065. }
  1066. digit, _ = charMap[char]
  1067. val += digit
  1068. switch {
  1069. case last == digit && (last == 5 || last == 50 || last == 500):
  1070. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  1071. case 2*last == digit:
  1072. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  1073. }
  1074. if last < digit {
  1075. val -= 2 * last
  1076. }
  1077. last = digit
  1078. }
  1079. return newNumberFormulaArg(prefix * val)
  1080. }
  1081. // ASIN function calculates the arcsine (i.e. the inverse sine) of a given
  1082. // number, and returns an angle, in radians, between -π/2 and π/2. The syntax
  1083. // of the function is:
  1084. //
  1085. // ASIN(number)
  1086. //
  1087. func (fn *formulaFuncs) ASIN(argsList *list.List) formulaArg {
  1088. if argsList.Len() != 1 {
  1089. return newErrorFormulaArg(formulaErrorVALUE, "ASIN requires 1 numeric argument")
  1090. }
  1091. arg := argsList.Front().Value.(formulaArg).ToNumber()
  1092. if arg.Type == ArgError {
  1093. return arg
  1094. }
  1095. return newNumberFormulaArg(math.Asin(arg.Number))
  1096. }
  1097. // ASINH function calculates the inverse hyperbolic sine of a supplied number.
  1098. // The syntax of the function is:
  1099. //
  1100. // ASINH(number)
  1101. //
  1102. func (fn *formulaFuncs) ASINH(argsList *list.List) formulaArg {
  1103. if argsList.Len() != 1 {
  1104. return newErrorFormulaArg(formulaErrorVALUE, "ASINH requires 1 numeric argument")
  1105. }
  1106. arg := argsList.Front().Value.(formulaArg).ToNumber()
  1107. if arg.Type == ArgError {
  1108. return arg
  1109. }
  1110. return newNumberFormulaArg(math.Asinh(arg.Number))
  1111. }
  1112. // ATAN function calculates the arctangent (i.e. the inverse tangent) of a
  1113. // given number, and returns an angle, in radians, between -π/2 and +π/2. The
  1114. // syntax of the function is:
  1115. //
  1116. // ATAN(number)
  1117. //
  1118. func (fn *formulaFuncs) ATAN(argsList *list.List) formulaArg {
  1119. if argsList.Len() != 1 {
  1120. return newErrorFormulaArg(formulaErrorVALUE, "ATAN requires 1 numeric argument")
  1121. }
  1122. arg := argsList.Front().Value.(formulaArg).ToNumber()
  1123. if arg.Type == ArgError {
  1124. return arg
  1125. }
  1126. return newNumberFormulaArg(math.Atan(arg.Number))
  1127. }
  1128. // ATANH function calculates the inverse hyperbolic tangent of a supplied
  1129. // number. The syntax of the function is:
  1130. //
  1131. // ATANH(number)
  1132. //
  1133. func (fn *formulaFuncs) ATANH(argsList *list.List) formulaArg {
  1134. if argsList.Len() != 1 {
  1135. return newErrorFormulaArg(formulaErrorVALUE, "ATANH requires 1 numeric argument")
  1136. }
  1137. arg := argsList.Front().Value.(formulaArg).ToNumber()
  1138. if arg.Type == ArgError {
  1139. return arg
  1140. }
  1141. return newNumberFormulaArg(math.Atanh(arg.Number))
  1142. }
  1143. // ATAN2 function calculates the arctangent (i.e. the inverse tangent) of a
  1144. // given set of x and y coordinates, and returns an angle, in radians, between
  1145. // -π/2 and +π/2. The syntax of the function is:
  1146. //
  1147. // ATAN2(x_num,y_num)
  1148. //
  1149. func (fn *formulaFuncs) ATAN2(argsList *list.List) formulaArg {
  1150. if argsList.Len() != 2 {
  1151. return newErrorFormulaArg(formulaErrorVALUE, "ATAN2 requires 2 numeric arguments")
  1152. }
  1153. x, err := strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64)
  1154. if err != nil {
  1155. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1156. }
  1157. y, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1158. if err != nil {
  1159. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1160. }
  1161. return newNumberFormulaArg(math.Atan2(x, y))
  1162. }
  1163. // BASE function converts a number into a supplied base (radix), and returns a
  1164. // text representation of the calculated value. The syntax of the function is:
  1165. //
  1166. // BASE(number,radix,[min_length])
  1167. //
  1168. func (fn *formulaFuncs) BASE(argsList *list.List) formulaArg {
  1169. if argsList.Len() < 2 {
  1170. return newErrorFormulaArg(formulaErrorVALUE, "BASE requires at least 2 arguments")
  1171. }
  1172. if argsList.Len() > 3 {
  1173. return newErrorFormulaArg(formulaErrorVALUE, "BASE allows at most 3 arguments")
  1174. }
  1175. var number float64
  1176. var radix, minLength int
  1177. var err error
  1178. if number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64); err != nil {
  1179. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1180. }
  1181. if radix, err = strconv.Atoi(argsList.Front().Next().Value.(formulaArg).String); err != nil {
  1182. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1183. }
  1184. if radix < 2 || radix > 36 {
  1185. return newErrorFormulaArg(formulaErrorVALUE, "radix must be an integer >= 2 and <= 36")
  1186. }
  1187. if argsList.Len() > 2 {
  1188. if minLength, err = strconv.Atoi(argsList.Back().Value.(formulaArg).String); err != nil {
  1189. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1190. }
  1191. }
  1192. result := strconv.FormatInt(int64(number), radix)
  1193. if len(result) < minLength {
  1194. result = strings.Repeat("0", minLength-len(result)) + result
  1195. }
  1196. return newStringFormulaArg(strings.ToUpper(result))
  1197. }
  1198. // CEILING function rounds a supplied number away from zero, to the nearest
  1199. // multiple of a given number. The syntax of the function is:
  1200. //
  1201. // CEILING(number,significance)
  1202. //
  1203. func (fn *formulaFuncs) CEILING(argsList *list.List) formulaArg {
  1204. if argsList.Len() == 0 {
  1205. return newErrorFormulaArg(formulaErrorVALUE, "CEILING requires at least 1 argument")
  1206. }
  1207. if argsList.Len() > 2 {
  1208. return newErrorFormulaArg(formulaErrorVALUE, "CEILING allows at most 2 arguments")
  1209. }
  1210. number, significance, res := 0.0, 1.0, 0.0
  1211. var err error
  1212. number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1213. if err != nil {
  1214. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1215. }
  1216. if number < 0 {
  1217. significance = -1
  1218. }
  1219. if argsList.Len() > 1 {
  1220. if significance, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64); err != nil {
  1221. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1222. }
  1223. }
  1224. if significance < 0 && number > 0 {
  1225. return newErrorFormulaArg(formulaErrorVALUE, "negative sig to CEILING invalid")
  1226. }
  1227. if argsList.Len() == 1 {
  1228. return newNumberFormulaArg(math.Ceil(number))
  1229. }
  1230. number, res = math.Modf(number / significance)
  1231. if res > 0 {
  1232. number++
  1233. }
  1234. return newNumberFormulaArg(number * significance)
  1235. }
  1236. // CEILINGMATH function rounds a supplied number up to a supplied multiple of
  1237. // significance. The syntax of the function is:
  1238. //
  1239. // CEILING.MATH(number,[significance],[mode])
  1240. //
  1241. func (fn *formulaFuncs) CEILINGMATH(argsList *list.List) formulaArg {
  1242. if argsList.Len() == 0 {
  1243. return newErrorFormulaArg(formulaErrorVALUE, "CEILING.MATH requires at least 1 argument")
  1244. }
  1245. if argsList.Len() > 3 {
  1246. return newErrorFormulaArg(formulaErrorVALUE, "CEILING.MATH allows at most 3 arguments")
  1247. }
  1248. number, significance, mode := 0.0, 1.0, 1.0
  1249. var err error
  1250. if number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64); err != nil {
  1251. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1252. }
  1253. if number < 0 {
  1254. significance = -1
  1255. }
  1256. if argsList.Len() > 1 {
  1257. if significance, err = strconv.ParseFloat(argsList.Front().Next().Value.(formulaArg).String, 64); err != nil {
  1258. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1259. }
  1260. }
  1261. if argsList.Len() == 1 {
  1262. return newNumberFormulaArg(math.Ceil(number))
  1263. }
  1264. if argsList.Len() > 2 {
  1265. if mode, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64); err != nil {
  1266. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1267. }
  1268. }
  1269. val, res := math.Modf(number / significance)
  1270. if res != 0 {
  1271. if number > 0 {
  1272. val++
  1273. } else if mode < 0 {
  1274. val--
  1275. }
  1276. }
  1277. return newNumberFormulaArg(val * significance)
  1278. }
  1279. // CEILINGPRECISE function rounds a supplied number up (regardless of the
  1280. // number's sign), to the nearest multiple of a given number. The syntax of
  1281. // the function is:
  1282. //
  1283. // CEILING.PRECISE(number,[significance])
  1284. //
  1285. func (fn *formulaFuncs) CEILINGPRECISE(argsList *list.List) formulaArg {
  1286. if argsList.Len() == 0 {
  1287. return newErrorFormulaArg(formulaErrorVALUE, "CEILING.PRECISE requires at least 1 argument")
  1288. }
  1289. if argsList.Len() > 2 {
  1290. return newErrorFormulaArg(formulaErrorVALUE, "CEILING.PRECISE allows at most 2 arguments")
  1291. }
  1292. number, significance := 0.0, 1.0
  1293. var err error
  1294. number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1295. if err != nil {
  1296. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1297. }
  1298. if number < 0 {
  1299. significance = -1
  1300. }
  1301. if argsList.Len() == 1 {
  1302. return newNumberFormulaArg(math.Ceil(number))
  1303. }
  1304. if argsList.Len() > 1 {
  1305. if significance, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64); err != nil {
  1306. err = errors.New(formulaErrorVALUE)
  1307. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1308. }
  1309. significance = math.Abs(significance)
  1310. if significance == 0 {
  1311. return newStringFormulaArg("0")
  1312. }
  1313. }
  1314. val, res := math.Modf(number / significance)
  1315. if res != 0 {
  1316. if number > 0 {
  1317. val++
  1318. }
  1319. }
  1320. return newNumberFormulaArg(val * significance)
  1321. }
  1322. // COMBIN function calculates the number of combinations (in any order) of a
  1323. // given number objects from a set. The syntax of the function is:
  1324. //
  1325. // COMBIN(number,number_chosen)
  1326. //
  1327. func (fn *formulaFuncs) COMBIN(argsList *list.List) formulaArg {
  1328. if argsList.Len() != 2 {
  1329. return newErrorFormulaArg(formulaErrorVALUE, "COMBIN requires 2 argument")
  1330. }
  1331. number, chosen, val := 0.0, 0.0, 1.0
  1332. var err error
  1333. if number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64); err != nil {
  1334. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1335. }
  1336. if chosen, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64); err != nil {
  1337. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1338. }
  1339. number, chosen = math.Trunc(number), math.Trunc(chosen)
  1340. if chosen > number {
  1341. return newErrorFormulaArg(formulaErrorVALUE, "COMBIN requires number >= number_chosen")
  1342. }
  1343. if chosen == number || chosen == 0 {
  1344. return newStringFormulaArg("1")
  1345. }
  1346. for c := float64(1); c <= chosen; c++ {
  1347. val *= (number + 1 - c) / c
  1348. }
  1349. return newNumberFormulaArg(math.Ceil(val))
  1350. }
  1351. // COMBINA function calculates the number of combinations, with repetitions,
  1352. // of a given number objects from a set. The syntax of the function is:
  1353. //
  1354. // COMBINA(number,number_chosen)
  1355. //
  1356. func (fn *formulaFuncs) COMBINA(argsList *list.List) formulaArg {
  1357. if argsList.Len() != 2 {
  1358. return newErrorFormulaArg(formulaErrorVALUE, "COMBINA requires 2 argument")
  1359. }
  1360. var number, chosen float64
  1361. var err error
  1362. number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1363. if err != nil {
  1364. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1365. }
  1366. chosen, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64)
  1367. if err != nil {
  1368. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1369. }
  1370. number, chosen = math.Trunc(number), math.Trunc(chosen)
  1371. if number < chosen {
  1372. return newErrorFormulaArg(formulaErrorVALUE, "COMBINA requires number > number_chosen")
  1373. }
  1374. if number == 0 {
  1375. return newStringFormulaArg("0")
  1376. }
  1377. args := list.New()
  1378. args.PushBack(formulaArg{
  1379. String: fmt.Sprintf("%g", number+chosen-1),
  1380. Type: ArgString,
  1381. })
  1382. args.PushBack(formulaArg{
  1383. String: fmt.Sprintf("%g", number-1),
  1384. Type: ArgString,
  1385. })
  1386. return fn.COMBIN(args)
  1387. }
  1388. // COS function calculates the cosine of a given angle. The syntax of the
  1389. // function is:
  1390. //
  1391. // COS(number)
  1392. //
  1393. func (fn *formulaFuncs) COS(argsList *list.List) formulaArg {
  1394. if argsList.Len() != 1 {
  1395. return newErrorFormulaArg(formulaErrorVALUE, "COS requires 1 numeric argument")
  1396. }
  1397. val, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1398. if err != nil {
  1399. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1400. }
  1401. return newNumberFormulaArg(math.Cos(val))
  1402. }
  1403. // COSH function calculates the hyperbolic cosine (cosh) of a supplied number.
  1404. // The syntax of the function is:
  1405. //
  1406. // COSH(number)
  1407. //
  1408. func (fn *formulaFuncs) COSH(argsList *list.List) formulaArg {
  1409. if argsList.Len() != 1 {
  1410. return newErrorFormulaArg(formulaErrorVALUE, "COSH requires 1 numeric argument")
  1411. }
  1412. val, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1413. if err != nil {
  1414. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1415. }
  1416. return newNumberFormulaArg(math.Cosh(val))
  1417. }
  1418. // COT function calculates the cotangent of a given angle. The syntax of the
  1419. // function is:
  1420. //
  1421. // COT(number)
  1422. //
  1423. func (fn *formulaFuncs) COT(argsList *list.List) formulaArg {
  1424. if argsList.Len() != 1 {
  1425. return newErrorFormulaArg(formulaErrorVALUE, "COT requires 1 numeric argument")
  1426. }
  1427. val, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1428. if err != nil {
  1429. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1430. }
  1431. if val == 0 {
  1432. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  1433. }
  1434. return newNumberFormulaArg(math.Tan(val))
  1435. }
  1436. // COTH function calculates the hyperbolic cotangent (coth) of a supplied
  1437. // angle. The syntax of the function is:
  1438. //
  1439. // COTH(number)
  1440. //
  1441. func (fn *formulaFuncs) COTH(argsList *list.List) formulaArg {
  1442. if argsList.Len() != 1 {
  1443. return newErrorFormulaArg(formulaErrorVALUE, "COTH requires 1 numeric argument")
  1444. }
  1445. val, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1446. if err != nil {
  1447. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1448. }
  1449. if val == 0 {
  1450. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  1451. }
  1452. return newNumberFormulaArg(math.Tanh(val))
  1453. }
  1454. // CSC function calculates the cosecant of a given angle. The syntax of the
  1455. // function is:
  1456. //
  1457. // CSC(number)
  1458. //
  1459. func (fn *formulaFuncs) CSC(argsList *list.List) formulaArg {
  1460. if argsList.Len() != 1 {
  1461. return newErrorFormulaArg(formulaErrorVALUE, "CSC requires 1 numeric argument")
  1462. }
  1463. val, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1464. if err != nil {
  1465. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1466. }
  1467. if val == 0 {
  1468. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  1469. }
  1470. return newNumberFormulaArg(1 / math.Sin(val))
  1471. }
  1472. // CSCH function calculates the hyperbolic cosecant (csch) of a supplied
  1473. // angle. The syntax of the function is:
  1474. //
  1475. // CSCH(number)
  1476. //
  1477. func (fn *formulaFuncs) CSCH(argsList *list.List) formulaArg {
  1478. if argsList.Len() != 1 {
  1479. return newErrorFormulaArg(formulaErrorVALUE, "CSCH requires 1 numeric argument")
  1480. }
  1481. val, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1482. if err != nil {
  1483. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1484. }
  1485. if val == 0 {
  1486. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  1487. }
  1488. return newNumberFormulaArg(1 / math.Sinh(val))
  1489. }
  1490. // DECIMAL function converts a text representation of a number in a specified
  1491. // base, into a decimal value. The syntax of the function is:
  1492. //
  1493. // DECIMAL(text,radix)
  1494. //
  1495. func (fn *formulaFuncs) DECIMAL(argsList *list.List) formulaArg {
  1496. if argsList.Len() != 2 {
  1497. return newErrorFormulaArg(formulaErrorVALUE, "DECIMAL requires 2 numeric arguments")
  1498. }
  1499. var text = argsList.Front().Value.(formulaArg).String
  1500. var radix int
  1501. var err error
  1502. radix, err = strconv.Atoi(argsList.Back().Value.(formulaArg).String)
  1503. if err != nil {
  1504. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1505. }
  1506. if len(text) > 2 && (strings.HasPrefix(text, "0x") || strings.HasPrefix(text, "0X")) {
  1507. text = text[2:]
  1508. }
  1509. val, err := strconv.ParseInt(text, radix, 64)
  1510. if err != nil {
  1511. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1512. }
  1513. return newNumberFormulaArg(float64(val))
  1514. }
  1515. // DEGREES function converts radians into degrees. The syntax of the function
  1516. // is:
  1517. //
  1518. // DEGREES(angle)
  1519. //
  1520. func (fn *formulaFuncs) DEGREES(argsList *list.List) formulaArg {
  1521. if argsList.Len() != 1 {
  1522. return newErrorFormulaArg(formulaErrorVALUE, "DEGREES requires 1 numeric argument")
  1523. }
  1524. val, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1525. if err != nil {
  1526. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1527. }
  1528. if val == 0 {
  1529. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  1530. }
  1531. return newNumberFormulaArg(180.0 / math.Pi * val)
  1532. }
  1533. // EVEN function rounds a supplied number away from zero (i.e. rounds a
  1534. // positive number up and a negative number down), to the next even number.
  1535. // The syntax of the function is:
  1536. //
  1537. // EVEN(number)
  1538. //
  1539. func (fn *formulaFuncs) EVEN(argsList *list.List) formulaArg {
  1540. if argsList.Len() != 1 {
  1541. return newErrorFormulaArg(formulaErrorVALUE, "EVEN requires 1 numeric argument")
  1542. }
  1543. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1544. if err != nil {
  1545. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1546. }
  1547. sign := math.Signbit(number)
  1548. m, frac := math.Modf(number / 2)
  1549. val := m * 2
  1550. if frac != 0 {
  1551. if !sign {
  1552. val += 2
  1553. } else {
  1554. val -= 2
  1555. }
  1556. }
  1557. return newNumberFormulaArg(val)
  1558. }
  1559. // EXP function calculates the value of the mathematical constant e, raised to
  1560. // the power of a given number. The syntax of the function is:
  1561. //
  1562. // EXP(number)
  1563. //
  1564. func (fn *formulaFuncs) EXP(argsList *list.List) formulaArg {
  1565. if argsList.Len() != 1 {
  1566. return newErrorFormulaArg(formulaErrorVALUE, "EXP requires 1 numeric argument")
  1567. }
  1568. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1569. if err != nil {
  1570. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1571. }
  1572. return newStringFormulaArg(strings.ToUpper(fmt.Sprintf("%g", math.Exp(number))))
  1573. }
  1574. // fact returns the factorial of a supplied number.
  1575. func fact(number float64) float64 {
  1576. val := float64(1)
  1577. for i := float64(2); i <= number; i++ {
  1578. val *= i
  1579. }
  1580. return val
  1581. }
  1582. // FACT function returns the factorial of a supplied number. The syntax of the
  1583. // function is:
  1584. //
  1585. // FACT(number)
  1586. //
  1587. func (fn *formulaFuncs) FACT(argsList *list.List) formulaArg {
  1588. if argsList.Len() != 1 {
  1589. return newErrorFormulaArg(formulaErrorVALUE, "FACT requires 1 numeric argument")
  1590. }
  1591. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1592. if err != nil {
  1593. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1594. }
  1595. if number < 0 {
  1596. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  1597. }
  1598. return newStringFormulaArg(strings.ToUpper(fmt.Sprintf("%g", fact(number))))
  1599. }
  1600. // FACTDOUBLE function returns the double factorial of a supplied number. The
  1601. // syntax of the function is:
  1602. //
  1603. // FACTDOUBLE(number)
  1604. //
  1605. func (fn *formulaFuncs) FACTDOUBLE(argsList *list.List) formulaArg {
  1606. if argsList.Len() != 1 {
  1607. return newErrorFormulaArg(formulaErrorVALUE, "FACTDOUBLE requires 1 numeric argument")
  1608. }
  1609. val := 1.0
  1610. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1611. if err != nil {
  1612. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1613. }
  1614. if number < 0 {
  1615. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  1616. }
  1617. for i := math.Trunc(number); i > 1; i -= 2 {
  1618. val *= i
  1619. }
  1620. return newStringFormulaArg(strings.ToUpper(fmt.Sprintf("%g", val)))
  1621. }
  1622. // FLOOR function rounds a supplied number towards zero to the nearest
  1623. // multiple of a specified significance. The syntax of the function is:
  1624. //
  1625. // FLOOR(number,significance)
  1626. //
  1627. func (fn *formulaFuncs) FLOOR(argsList *list.List) formulaArg {
  1628. if argsList.Len() != 2 {
  1629. return newErrorFormulaArg(formulaErrorVALUE, "FLOOR requires 2 numeric arguments")
  1630. }
  1631. var number, significance float64
  1632. var err error
  1633. number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1634. if err != nil {
  1635. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1636. }
  1637. significance, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64)
  1638. if err != nil {
  1639. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1640. }
  1641. if significance < 0 && number >= 0 {
  1642. return newErrorFormulaArg(formulaErrorNUM, "invalid arguments to FLOOR")
  1643. }
  1644. val := number
  1645. val, res := math.Modf(val / significance)
  1646. if res != 0 {
  1647. if number < 0 && res < 0 {
  1648. val--
  1649. }
  1650. }
  1651. return newStringFormulaArg(strings.ToUpper(fmt.Sprintf("%g", val*significance)))
  1652. }
  1653. // FLOORMATH function rounds a supplied number down to a supplied multiple of
  1654. // significance. The syntax of the function is:
  1655. //
  1656. // FLOOR.MATH(number,[significance],[mode])
  1657. //
  1658. func (fn *formulaFuncs) FLOORMATH(argsList *list.List) formulaArg {
  1659. if argsList.Len() == 0 {
  1660. return newErrorFormulaArg(formulaErrorVALUE, "FLOOR.MATH requires at least 1 argument")
  1661. }
  1662. if argsList.Len() > 3 {
  1663. return newErrorFormulaArg(formulaErrorVALUE, "FLOOR.MATH allows at most 3 arguments")
  1664. }
  1665. number, significance, mode := 0.0, 1.0, 1.0
  1666. var err error
  1667. number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1668. if err != nil {
  1669. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1670. }
  1671. if number < 0 {
  1672. significance = -1
  1673. }
  1674. if argsList.Len() > 1 {
  1675. if significance, err = strconv.ParseFloat(argsList.Front().Next().Value.(formulaArg).String, 64); err != nil {
  1676. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1677. }
  1678. }
  1679. if argsList.Len() == 1 {
  1680. return newNumberFormulaArg(math.Floor(number))
  1681. }
  1682. if argsList.Len() > 2 {
  1683. if mode, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64); err != nil {
  1684. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1685. }
  1686. }
  1687. val, res := math.Modf(number / significance)
  1688. if res != 0 && number < 0 && mode > 0 {
  1689. val--
  1690. }
  1691. return newNumberFormulaArg(val * significance)
  1692. }
  1693. // FLOORPRECISE function rounds a supplied number down to a supplied multiple
  1694. // of significance. The syntax of the function is:
  1695. //
  1696. // FLOOR.PRECISE(number,[significance])
  1697. //
  1698. func (fn *formulaFuncs) FLOORPRECISE(argsList *list.List) formulaArg {
  1699. if argsList.Len() == 0 {
  1700. return newErrorFormulaArg(formulaErrorVALUE, "FLOOR.PRECISE requires at least 1 argument")
  1701. }
  1702. if argsList.Len() > 2 {
  1703. return newErrorFormulaArg(formulaErrorVALUE, "FLOOR.PRECISE allows at most 2 arguments")
  1704. }
  1705. var number, significance float64
  1706. var err error
  1707. number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1708. if err != nil {
  1709. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1710. }
  1711. if number < 0 {
  1712. significance = -1
  1713. }
  1714. if argsList.Len() == 1 {
  1715. return newNumberFormulaArg(math.Floor(number))
  1716. }
  1717. if argsList.Len() > 1 {
  1718. if significance, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64); err != nil {
  1719. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1720. }
  1721. significance = math.Abs(significance)
  1722. if significance == 0 {
  1723. return newStringFormulaArg("0")
  1724. }
  1725. }
  1726. val, res := math.Modf(number / significance)
  1727. if res != 0 {
  1728. if number < 0 {
  1729. val--
  1730. }
  1731. }
  1732. return newNumberFormulaArg(val * significance)
  1733. }
  1734. // gcd returns the greatest common divisor of two supplied integers.
  1735. func gcd(x, y float64) float64 {
  1736. x, y = math.Trunc(x), math.Trunc(y)
  1737. if x == 0 {
  1738. return y
  1739. }
  1740. if y == 0 {
  1741. return x
  1742. }
  1743. for x != y {
  1744. if x > y {
  1745. x = x - y
  1746. } else {
  1747. y = y - x
  1748. }
  1749. }
  1750. return x
  1751. }
  1752. // GCD function returns the greatest common divisor of two or more supplied
  1753. // integers. The syntax of the function is:
  1754. //
  1755. // GCD(number1,[number2],...)
  1756. //
  1757. func (fn *formulaFuncs) GCD(argsList *list.List) formulaArg {
  1758. if argsList.Len() == 0 {
  1759. return newErrorFormulaArg(formulaErrorVALUE, "GCD requires at least 1 argument")
  1760. }
  1761. var (
  1762. val float64
  1763. nums = []float64{}
  1764. err error
  1765. )
  1766. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  1767. token := arg.Value.(formulaArg).String
  1768. if token == "" {
  1769. continue
  1770. }
  1771. if val, err = strconv.ParseFloat(token, 64); err != nil {
  1772. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1773. }
  1774. nums = append(nums, val)
  1775. }
  1776. if nums[0] < 0 {
  1777. return newErrorFormulaArg(formulaErrorVALUE, "GCD only accepts positive arguments")
  1778. }
  1779. if len(nums) == 1 {
  1780. return newNumberFormulaArg(nums[0])
  1781. }
  1782. cd := nums[0]
  1783. for i := 1; i < len(nums); i++ {
  1784. if nums[i] < 0 {
  1785. return newErrorFormulaArg(formulaErrorVALUE, "GCD only accepts positive arguments")
  1786. }
  1787. cd = gcd(cd, nums[i])
  1788. }
  1789. return newNumberFormulaArg(cd)
  1790. }
  1791. // INT function truncates a supplied number down to the closest integer. The
  1792. // syntax of the function is:
  1793. //
  1794. // INT(number)
  1795. //
  1796. func (fn *formulaFuncs) INT(argsList *list.List) formulaArg {
  1797. if argsList.Len() != 1 {
  1798. return newErrorFormulaArg(formulaErrorVALUE, "INT requires 1 numeric argument")
  1799. }
  1800. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1801. if err != nil {
  1802. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1803. }
  1804. val, frac := math.Modf(number)
  1805. if frac < 0 {
  1806. val--
  1807. }
  1808. return newNumberFormulaArg(val)
  1809. }
  1810. // ISOCEILING function rounds a supplied number up (regardless of the number's
  1811. // sign), to the nearest multiple of a supplied significance. The syntax of
  1812. // the function is:
  1813. //
  1814. // ISO.CEILING(number,[significance])
  1815. //
  1816. func (fn *formulaFuncs) ISOCEILING(argsList *list.List) formulaArg {
  1817. if argsList.Len() == 0 {
  1818. return newErrorFormulaArg(formulaErrorVALUE, "ISO.CEILING requires at least 1 argument")
  1819. }
  1820. if argsList.Len() > 2 {
  1821. return newErrorFormulaArg(formulaErrorVALUE, "ISO.CEILING allows at most 2 arguments")
  1822. }
  1823. var number, significance float64
  1824. var err error
  1825. if number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64); err != nil {
  1826. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1827. }
  1828. if number < 0 {
  1829. significance = -1
  1830. }
  1831. if argsList.Len() == 1 {
  1832. return newNumberFormulaArg(math.Ceil(number))
  1833. }
  1834. if argsList.Len() > 1 {
  1835. if significance, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64); err != nil {
  1836. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1837. }
  1838. significance = math.Abs(significance)
  1839. if significance == 0 {
  1840. return newStringFormulaArg("0")
  1841. }
  1842. }
  1843. val, res := math.Modf(number / significance)
  1844. if res != 0 {
  1845. if number > 0 {
  1846. val++
  1847. }
  1848. }
  1849. return newNumberFormulaArg(val * significance)
  1850. }
  1851. // lcm returns the least common multiple of two supplied integers.
  1852. func lcm(a, b float64) float64 {
  1853. a = math.Trunc(a)
  1854. b = math.Trunc(b)
  1855. if a == 0 && b == 0 {
  1856. return 0
  1857. }
  1858. return a * b / gcd(a, b)
  1859. }
  1860. // LCM function returns the least common multiple of two or more supplied
  1861. // integers. The syntax of the function is:
  1862. //
  1863. // LCM(number1,[number2],...)
  1864. //
  1865. func (fn *formulaFuncs) LCM(argsList *list.List) formulaArg {
  1866. if argsList.Len() == 0 {
  1867. return newErrorFormulaArg(formulaErrorVALUE, "LCM requires at least 1 argument")
  1868. }
  1869. var (
  1870. val float64
  1871. nums = []float64{}
  1872. err error
  1873. )
  1874. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  1875. token := arg.Value.(formulaArg).String
  1876. if token == "" {
  1877. continue
  1878. }
  1879. if val, err = strconv.ParseFloat(token, 64); err != nil {
  1880. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1881. }
  1882. nums = append(nums, val)
  1883. }
  1884. if nums[0] < 0 {
  1885. return newErrorFormulaArg(formulaErrorVALUE, "LCM only accepts positive arguments")
  1886. }
  1887. if len(nums) == 1 {
  1888. return newNumberFormulaArg(nums[0])
  1889. }
  1890. cm := nums[0]
  1891. for i := 1; i < len(nums); i++ {
  1892. if nums[i] < 0 {
  1893. return newErrorFormulaArg(formulaErrorVALUE, "LCM only accepts positive arguments")
  1894. }
  1895. cm = lcm(cm, nums[i])
  1896. }
  1897. return newNumberFormulaArg(cm)
  1898. }
  1899. // LN function calculates the natural logarithm of a given number. The syntax
  1900. // of the function is:
  1901. //
  1902. // LN(number)
  1903. //
  1904. func (fn *formulaFuncs) LN(argsList *list.List) formulaArg {
  1905. if argsList.Len() != 1 {
  1906. return newErrorFormulaArg(formulaErrorVALUE, "LN requires 1 numeric argument")
  1907. }
  1908. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1909. if err != nil {
  1910. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1911. }
  1912. return newNumberFormulaArg(math.Log(number))
  1913. }
  1914. // LOG function calculates the logarithm of a given number, to a supplied
  1915. // base. The syntax of the function is:
  1916. //
  1917. // LOG(number,[base])
  1918. //
  1919. func (fn *formulaFuncs) LOG(argsList *list.List) formulaArg {
  1920. if argsList.Len() == 0 {
  1921. return newErrorFormulaArg(formulaErrorVALUE, "LOG requires at least 1 argument")
  1922. }
  1923. if argsList.Len() > 2 {
  1924. return newErrorFormulaArg(formulaErrorVALUE, "LOG allows at most 2 arguments")
  1925. }
  1926. number, base := 0.0, 10.0
  1927. var err error
  1928. number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1929. if err != nil {
  1930. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1931. }
  1932. if argsList.Len() > 1 {
  1933. if base, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64); err != nil {
  1934. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1935. }
  1936. }
  1937. if number == 0 {
  1938. return newErrorFormulaArg(formulaErrorNUM, formulaErrorDIV)
  1939. }
  1940. if base == 0 {
  1941. return newErrorFormulaArg(formulaErrorNUM, formulaErrorDIV)
  1942. }
  1943. if base == 1 {
  1944. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  1945. }
  1946. return newNumberFormulaArg(math.Log(number) / math.Log(base))
  1947. }
  1948. // LOG10 function calculates the base 10 logarithm of a given number. The
  1949. // syntax of the function is:
  1950. //
  1951. // LOG10(number)
  1952. //
  1953. func (fn *formulaFuncs) LOG10(argsList *list.List) formulaArg {
  1954. if argsList.Len() != 1 {
  1955. return newErrorFormulaArg(formulaErrorVALUE, "LOG10 requires 1 numeric argument")
  1956. }
  1957. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  1958. if err != nil {
  1959. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  1960. }
  1961. return newNumberFormulaArg(math.Log10(number))
  1962. }
  1963. // minor function implement a minor of a matrix A is the determinant of some
  1964. // smaller square matrix.
  1965. func minor(sqMtx [][]float64, idx int) [][]float64 {
  1966. ret := [][]float64{}
  1967. for i := range sqMtx {
  1968. if i == 0 {
  1969. continue
  1970. }
  1971. row := []float64{}
  1972. for j := range sqMtx {
  1973. if j == idx {
  1974. continue
  1975. }
  1976. row = append(row, sqMtx[i][j])
  1977. }
  1978. ret = append(ret, row)
  1979. }
  1980. return ret
  1981. }
  1982. // det determinant of the 2x2 matrix.
  1983. func det(sqMtx [][]float64) float64 {
  1984. if len(sqMtx) == 2 {
  1985. m00 := sqMtx[0][0]
  1986. m01 := sqMtx[0][1]
  1987. m10 := sqMtx[1][0]
  1988. m11 := sqMtx[1][1]
  1989. return m00*m11 - m10*m01
  1990. }
  1991. var res, sgn float64 = 0, 1
  1992. for j := range sqMtx {
  1993. res += sgn * sqMtx[0][j] * det(minor(sqMtx, j))
  1994. sgn *= -1
  1995. }
  1996. return res
  1997. }
  1998. // MDETERM calculates the determinant of a square matrix. The
  1999. // syntax of the function is:
  2000. //
  2001. // MDETERM(array)
  2002. //
  2003. func (fn *formulaFuncs) MDETERM(argsList *list.List) (result formulaArg) {
  2004. var (
  2005. num float64
  2006. numMtx = [][]float64{}
  2007. err error
  2008. strMtx = argsList.Front().Value.(formulaArg).Matrix
  2009. )
  2010. if argsList.Len() < 1 {
  2011. return
  2012. }
  2013. var rows = len(strMtx)
  2014. for _, row := range argsList.Front().Value.(formulaArg).Matrix {
  2015. if len(row) != rows {
  2016. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  2017. }
  2018. numRow := []float64{}
  2019. for _, ele := range row {
  2020. if num, err = strconv.ParseFloat(ele.String, 64); err != nil {
  2021. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2022. }
  2023. numRow = append(numRow, num)
  2024. }
  2025. numMtx = append(numMtx, numRow)
  2026. }
  2027. return newNumberFormulaArg(det(numMtx))
  2028. }
  2029. // MOD function returns the remainder of a division between two supplied
  2030. // numbers. The syntax of the function is:
  2031. //
  2032. // MOD(number,divisor)
  2033. //
  2034. func (fn *formulaFuncs) MOD(argsList *list.List) formulaArg {
  2035. if argsList.Len() != 2 {
  2036. return newErrorFormulaArg(formulaErrorVALUE, "MOD requires 2 numeric arguments")
  2037. }
  2038. var number, divisor float64
  2039. var err error
  2040. number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2041. if err != nil {
  2042. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2043. }
  2044. divisor, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64)
  2045. if err != nil {
  2046. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2047. }
  2048. if divisor == 0 {
  2049. return newErrorFormulaArg(formulaErrorDIV, "MOD divide by zero")
  2050. }
  2051. trunc, rem := math.Modf(number / divisor)
  2052. if rem < 0 {
  2053. trunc--
  2054. }
  2055. return newNumberFormulaArg(number - divisor*trunc)
  2056. }
  2057. // MROUND function rounds a supplied number up or down to the nearest multiple
  2058. // of a given number. The syntax of the function is:
  2059. //
  2060. // MROUND(number,multiple)
  2061. //
  2062. func (fn *formulaFuncs) MROUND(argsList *list.List) formulaArg {
  2063. if argsList.Len() != 2 {
  2064. return newErrorFormulaArg(formulaErrorVALUE, "MROUND requires 2 numeric arguments")
  2065. }
  2066. var number, multiple float64
  2067. var err error
  2068. number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2069. if err != nil {
  2070. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2071. }
  2072. multiple, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64)
  2073. if err != nil {
  2074. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2075. }
  2076. if multiple == 0 {
  2077. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  2078. }
  2079. if multiple < 0 && number > 0 ||
  2080. multiple > 0 && number < 0 {
  2081. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  2082. }
  2083. number, res := math.Modf(number / multiple)
  2084. if math.Trunc(res+0.5) > 0 {
  2085. number++
  2086. }
  2087. return newNumberFormulaArg(number * multiple)
  2088. }
  2089. // MULTINOMIAL function calculates the ratio of the factorial of a sum of
  2090. // supplied values to the product of factorials of those values. The syntax of
  2091. // the function is:
  2092. //
  2093. // MULTINOMIAL(number1,[number2],...)
  2094. //
  2095. func (fn *formulaFuncs) MULTINOMIAL(argsList *list.List) formulaArg {
  2096. val, num, denom := 0.0, 0.0, 1.0
  2097. var err error
  2098. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  2099. token := arg.Value.(formulaArg)
  2100. if token.String == "" {
  2101. continue
  2102. }
  2103. if val, err = strconv.ParseFloat(token.String, 64); err != nil {
  2104. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2105. }
  2106. num += val
  2107. denom *= fact(val)
  2108. }
  2109. return newNumberFormulaArg(fact(num) / denom)
  2110. }
  2111. // MUNIT function returns the unit matrix for a specified dimension. The
  2112. // syntax of the function is:
  2113. //
  2114. // MUNIT(dimension)
  2115. //
  2116. func (fn *formulaFuncs) MUNIT(argsList *list.List) (result formulaArg) {
  2117. if argsList.Len() != 1 {
  2118. return newErrorFormulaArg(formulaErrorVALUE, "MUNIT requires 1 numeric argument")
  2119. }
  2120. dimension, err := strconv.Atoi(argsList.Front().Value.(formulaArg).String)
  2121. if err != nil {
  2122. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2123. }
  2124. matrix := make([][]formulaArg, 0, dimension)
  2125. for i := 0; i < dimension; i++ {
  2126. row := make([]formulaArg, dimension)
  2127. for j := 0; j < dimension; j++ {
  2128. if i == j {
  2129. row[j] = newNumberFormulaArg(float64(1.0))
  2130. } else {
  2131. row[j] = newNumberFormulaArg(float64(0.0))
  2132. }
  2133. }
  2134. matrix = append(matrix, row)
  2135. }
  2136. return newMatrixFormulaArg(matrix)
  2137. }
  2138. // ODD function ounds a supplied number away from zero (i.e. rounds a positive
  2139. // number up and a negative number down), to the next odd number. The syntax
  2140. // of the function is:
  2141. //
  2142. // ODD(number)
  2143. //
  2144. func (fn *formulaFuncs) ODD(argsList *list.List) formulaArg {
  2145. if argsList.Len() != 1 {
  2146. return newErrorFormulaArg(formulaErrorVALUE, "ODD requires 1 numeric argument")
  2147. }
  2148. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2149. if err != nil {
  2150. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2151. }
  2152. if number == 0 {
  2153. return newStringFormulaArg("1")
  2154. }
  2155. sign := math.Signbit(number)
  2156. m, frac := math.Modf((number - 1) / 2)
  2157. val := m*2 + 1
  2158. if frac != 0 {
  2159. if !sign {
  2160. val += 2
  2161. } else {
  2162. val -= 2
  2163. }
  2164. }
  2165. return newNumberFormulaArg(val)
  2166. }
  2167. // PI function returns the value of the mathematical constant π (pi), accurate
  2168. // to 15 digits (14 decimal places). The syntax of the function is:
  2169. //
  2170. // PI()
  2171. //
  2172. func (fn *formulaFuncs) PI(argsList *list.List) formulaArg {
  2173. if argsList.Len() != 0 {
  2174. return newErrorFormulaArg(formulaErrorVALUE, "PI accepts no arguments")
  2175. }
  2176. return newNumberFormulaArg(math.Pi)
  2177. }
  2178. // POWER function calculates a given number, raised to a supplied power.
  2179. // The syntax of the function is:
  2180. //
  2181. // POWER(number,power)
  2182. //
  2183. func (fn *formulaFuncs) POWER(argsList *list.List) formulaArg {
  2184. if argsList.Len() != 2 {
  2185. return newErrorFormulaArg(formulaErrorVALUE, "POWER requires 2 numeric arguments")
  2186. }
  2187. var x, y float64
  2188. var err error
  2189. x, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2190. if err != nil {
  2191. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2192. }
  2193. y, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64)
  2194. if err != nil {
  2195. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2196. }
  2197. if x == 0 && y == 0 {
  2198. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  2199. }
  2200. if x == 0 && y < 0 {
  2201. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  2202. }
  2203. return newNumberFormulaArg(math.Pow(x, y))
  2204. }
  2205. // PRODUCT function returns the product (multiplication) of a supplied set of
  2206. // numerical values. The syntax of the function is:
  2207. //
  2208. // PRODUCT(number1,[number2],...)
  2209. //
  2210. func (fn *formulaFuncs) PRODUCT(argsList *list.List) formulaArg {
  2211. val, product := 0.0, 1.0
  2212. var err error
  2213. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  2214. token := arg.Value.(formulaArg)
  2215. switch token.Type {
  2216. case ArgUnknown:
  2217. continue
  2218. case ArgString:
  2219. if token.String == "" {
  2220. continue
  2221. }
  2222. if val, err = strconv.ParseFloat(token.String, 64); err != nil {
  2223. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2224. }
  2225. product = product * val
  2226. case ArgMatrix:
  2227. for _, row := range token.Matrix {
  2228. for _, value := range row {
  2229. if value.String == "" {
  2230. continue
  2231. }
  2232. if val, err = strconv.ParseFloat(value.String, 64); err != nil {
  2233. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2234. }
  2235. product = product * val
  2236. }
  2237. }
  2238. }
  2239. }
  2240. return newNumberFormulaArg(product)
  2241. }
  2242. // QUOTIENT function returns the integer portion of a division between two
  2243. // supplied numbers. The syntax of the function is:
  2244. //
  2245. // QUOTIENT(numerator,denominator)
  2246. //
  2247. func (fn *formulaFuncs) QUOTIENT(argsList *list.List) formulaArg {
  2248. if argsList.Len() != 2 {
  2249. return newErrorFormulaArg(formulaErrorVALUE, "QUOTIENT requires 2 numeric arguments")
  2250. }
  2251. var x, y float64
  2252. var err error
  2253. x, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2254. if err != nil {
  2255. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2256. }
  2257. y, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64)
  2258. if err != nil {
  2259. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2260. }
  2261. if y == 0 {
  2262. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  2263. }
  2264. return newNumberFormulaArg(math.Trunc(x / y))
  2265. }
  2266. // RADIANS function converts radians into degrees. The syntax of the function is:
  2267. //
  2268. // RADIANS(angle)
  2269. //
  2270. func (fn *formulaFuncs) RADIANS(argsList *list.List) formulaArg {
  2271. if argsList.Len() != 1 {
  2272. return newErrorFormulaArg(formulaErrorVALUE, "RADIANS requires 1 numeric argument")
  2273. }
  2274. angle, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2275. if err != nil {
  2276. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2277. }
  2278. return newNumberFormulaArg(math.Pi / 180.0 * angle)
  2279. }
  2280. // RAND function generates a random real number between 0 and 1. The syntax of
  2281. // the function is:
  2282. //
  2283. // RAND()
  2284. //
  2285. func (fn *formulaFuncs) RAND(argsList *list.List) formulaArg {
  2286. if argsList.Len() != 0 {
  2287. return newErrorFormulaArg(formulaErrorVALUE, "RAND accepts no arguments")
  2288. }
  2289. return newNumberFormulaArg(rand.New(rand.NewSource(time.Now().UnixNano())).Float64())
  2290. }
  2291. // RANDBETWEEN function generates a random integer between two supplied
  2292. // integers. The syntax of the function is:
  2293. //
  2294. // RANDBETWEEN(bottom,top)
  2295. //
  2296. func (fn *formulaFuncs) RANDBETWEEN(argsList *list.List) formulaArg {
  2297. if argsList.Len() != 2 {
  2298. return newErrorFormulaArg(formulaErrorVALUE, "RANDBETWEEN requires 2 numeric arguments")
  2299. }
  2300. var bottom, top int64
  2301. var err error
  2302. bottom, err = strconv.ParseInt(argsList.Front().Value.(formulaArg).String, 10, 64)
  2303. if err != nil {
  2304. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2305. }
  2306. top, err = strconv.ParseInt(argsList.Back().Value.(formulaArg).String, 10, 64)
  2307. if err != nil {
  2308. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2309. }
  2310. if top < bottom {
  2311. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  2312. }
  2313. return newNumberFormulaArg(float64(rand.New(rand.NewSource(time.Now().UnixNano())).Int63n(top-bottom+1) + bottom))
  2314. }
  2315. // romanNumerals defined a numeral system that originated in ancient Rome and
  2316. // remained the usual way of writing numbers throughout Europe well into the
  2317. // Late Middle Ages.
  2318. type romanNumerals struct {
  2319. n float64
  2320. s string
  2321. }
  2322. var romanTable = [][]romanNumerals{{{1000, "M"}, {900, "CM"}, {500, "D"}, {400, "CD"}, {100, "C"}, {90, "XC"}, {50, "L"}, {40, "XL"}, {10, "X"}, {9, "IX"}, {5, "V"}, {4, "IV"}, {1, "I"}},
  2323. {{1000, "M"}, {950, "LM"}, {900, "CM"}, {500, "D"}, {450, "LD"}, {400, "CD"}, {100, "C"}, {95, "VC"}, {90, "XC"}, {50, "L"}, {45, "VL"}, {40, "XL"}, {10, "X"}, {9, "IX"}, {5, "V"}, {4, "IV"}, {1, "I"}},
  2324. {{1000, "M"}, {990, "XM"}, {950, "LM"}, {900, "CM"}, {500, "D"}, {490, "XD"}, {450, "LD"}, {400, "CD"}, {100, "C"}, {99, "IC"}, {90, "XC"}, {50, "L"}, {45, "VL"}, {40, "XL"}, {10, "X"}, {9, "IX"}, {5, "V"}, {4, "IV"}, {1, "I"}},
  2325. {{1000, "M"}, {995, "VM"}, {990, "XM"}, {950, "LM"}, {900, "CM"}, {500, "D"}, {495, "VD"}, {490, "XD"}, {450, "LD"}, {400, "CD"}, {100, "C"}, {99, "IC"}, {90, "XC"}, {50, "L"}, {45, "VL"}, {40, "XL"}, {10, "X"}, {9, "IX"}, {5, "V"}, {4, "IV"}, {1, "I"}},
  2326. {{1000, "M"}, {999, "IM"}, {995, "VM"}, {990, "XM"}, {950, "LM"}, {900, "CM"}, {500, "D"}, {499, "ID"}, {495, "VD"}, {490, "XD"}, {450, "LD"}, {400, "CD"}, {100, "C"}, {99, "IC"}, {90, "XC"}, {50, "L"}, {45, "VL"}, {40, "XL"}, {10, "X"}, {9, "IX"}, {5, "V"}, {4, "IV"}, {1, "I"}}}
  2327. // ROMAN function converts an arabic number to Roman. I.e. for a supplied
  2328. // integer, the function returns a text string depicting the roman numeral
  2329. // form of the number. The syntax of the function is:
  2330. //
  2331. // ROMAN(number,[form])
  2332. //
  2333. func (fn *formulaFuncs) ROMAN(argsList *list.List) formulaArg {
  2334. if argsList.Len() == 0 {
  2335. return newErrorFormulaArg(formulaErrorVALUE, "ROMAN requires at least 1 argument")
  2336. }
  2337. if argsList.Len() > 2 {
  2338. return newErrorFormulaArg(formulaErrorVALUE, "ROMAN allows at most 2 arguments")
  2339. }
  2340. var number float64
  2341. var form int
  2342. var err error
  2343. number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2344. if err != nil {
  2345. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2346. }
  2347. if argsList.Len() > 1 {
  2348. if form, err = strconv.Atoi(argsList.Back().Value.(formulaArg).String); err != nil {
  2349. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2350. }
  2351. if form < 0 {
  2352. form = 0
  2353. } else if form > 4 {
  2354. form = 4
  2355. }
  2356. }
  2357. decimalTable := romanTable[0]
  2358. switch form {
  2359. case 1:
  2360. decimalTable = romanTable[1]
  2361. case 2:
  2362. decimalTable = romanTable[2]
  2363. case 3:
  2364. decimalTable = romanTable[3]
  2365. case 4:
  2366. decimalTable = romanTable[4]
  2367. }
  2368. val := math.Trunc(number)
  2369. buf := bytes.Buffer{}
  2370. for _, r := range decimalTable {
  2371. for val >= r.n {
  2372. buf.WriteString(r.s)
  2373. val -= r.n
  2374. }
  2375. }
  2376. return newStringFormulaArg(buf.String())
  2377. }
  2378. type roundMode byte
  2379. const (
  2380. closest roundMode = iota
  2381. down
  2382. up
  2383. )
  2384. // round rounds a supplied number up or down.
  2385. func (fn *formulaFuncs) round(number, digits float64, mode roundMode) float64 {
  2386. var significance float64
  2387. if digits > 0 {
  2388. significance = math.Pow(1/10.0, digits)
  2389. } else {
  2390. significance = math.Pow(10.0, -digits)
  2391. }
  2392. val, res := math.Modf(number / significance)
  2393. switch mode {
  2394. case closest:
  2395. const eps = 0.499999999
  2396. if res >= eps {
  2397. val++
  2398. } else if res <= -eps {
  2399. val--
  2400. }
  2401. case down:
  2402. case up:
  2403. if res > 0 {
  2404. val++
  2405. } else if res < 0 {
  2406. val--
  2407. }
  2408. }
  2409. return val * significance
  2410. }
  2411. // ROUND function rounds a supplied number up or down, to a specified number
  2412. // of decimal places. The syntax of the function is:
  2413. //
  2414. // ROUND(number,num_digits)
  2415. //
  2416. func (fn *formulaFuncs) ROUND(argsList *list.List) formulaArg {
  2417. if argsList.Len() != 2 {
  2418. return newErrorFormulaArg(formulaErrorVALUE, "ROUND requires 2 numeric arguments")
  2419. }
  2420. var number, digits float64
  2421. var err error
  2422. number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2423. if err != nil {
  2424. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2425. }
  2426. digits, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64)
  2427. if err != nil {
  2428. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2429. }
  2430. return newNumberFormulaArg(fn.round(number, digits, closest))
  2431. }
  2432. // ROUNDDOWN function rounds a supplied number down towards zero, to a
  2433. // specified number of decimal places. The syntax of the function is:
  2434. //
  2435. // ROUNDDOWN(number,num_digits)
  2436. //
  2437. func (fn *formulaFuncs) ROUNDDOWN(argsList *list.List) formulaArg {
  2438. if argsList.Len() != 2 {
  2439. return newErrorFormulaArg(formulaErrorVALUE, "ROUNDDOWN requires 2 numeric arguments")
  2440. }
  2441. var number, digits float64
  2442. var err error
  2443. number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2444. if err != nil {
  2445. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2446. }
  2447. digits, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64)
  2448. if err != nil {
  2449. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2450. }
  2451. return newNumberFormulaArg(fn.round(number, digits, down))
  2452. }
  2453. // ROUNDUP function rounds a supplied number up, away from zero, to a
  2454. // specified number of decimal places. The syntax of the function is:
  2455. //
  2456. // ROUNDUP(number,num_digits)
  2457. //
  2458. func (fn *formulaFuncs) ROUNDUP(argsList *list.List) formulaArg {
  2459. if argsList.Len() != 2 {
  2460. return newErrorFormulaArg(formulaErrorVALUE, "ROUNDUP requires 2 numeric arguments")
  2461. }
  2462. var number, digits float64
  2463. var err error
  2464. number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2465. if err != nil {
  2466. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2467. }
  2468. digits, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64)
  2469. if err != nil {
  2470. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2471. }
  2472. return newNumberFormulaArg(fn.round(number, digits, up))
  2473. }
  2474. // SEC function calculates the secant of a given angle. The syntax of the
  2475. // function is:
  2476. //
  2477. // SEC(number)
  2478. //
  2479. func (fn *formulaFuncs) SEC(argsList *list.List) formulaArg {
  2480. if argsList.Len() != 1 {
  2481. return newErrorFormulaArg(formulaErrorVALUE, "SEC requires 1 numeric argument")
  2482. }
  2483. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2484. if err != nil {
  2485. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2486. }
  2487. return newNumberFormulaArg(math.Cos(number))
  2488. }
  2489. // SECH function calculates the hyperbolic secant (sech) of a supplied angle.
  2490. // The syntax of the function is:
  2491. //
  2492. // SECH(number)
  2493. //
  2494. func (fn *formulaFuncs) SECH(argsList *list.List) formulaArg {
  2495. if argsList.Len() != 1 {
  2496. return newErrorFormulaArg(formulaErrorVALUE, "SECH requires 1 numeric argument")
  2497. }
  2498. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2499. if err != nil {
  2500. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2501. }
  2502. return newNumberFormulaArg(1 / math.Cosh(number))
  2503. }
  2504. // SIGN function returns the arithmetic sign (+1, -1 or 0) of a supplied
  2505. // number. I.e. if the number is positive, the Sign function returns +1, if
  2506. // the number is negative, the function returns -1 and if the number is 0
  2507. // (zero), the function returns 0. The syntax of the function is:
  2508. //
  2509. // SIGN(number)
  2510. //
  2511. func (fn *formulaFuncs) SIGN(argsList *list.List) formulaArg {
  2512. if argsList.Len() != 1 {
  2513. return newErrorFormulaArg(formulaErrorVALUE, "SIGN requires 1 numeric argument")
  2514. }
  2515. val, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2516. if err != nil {
  2517. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2518. }
  2519. if val < 0 {
  2520. return newStringFormulaArg("-1")
  2521. }
  2522. if val > 0 {
  2523. return newStringFormulaArg("1")
  2524. }
  2525. return newStringFormulaArg("0")
  2526. }
  2527. // SIN function calculates the sine of a given angle. The syntax of the
  2528. // function is:
  2529. //
  2530. // SIN(number)
  2531. //
  2532. func (fn *formulaFuncs) SIN(argsList *list.List) formulaArg {
  2533. if argsList.Len() != 1 {
  2534. return newErrorFormulaArg(formulaErrorVALUE, "SIN requires 1 numeric argument")
  2535. }
  2536. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2537. if err != nil {
  2538. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2539. }
  2540. return newNumberFormulaArg(math.Sin(number))
  2541. }
  2542. // SINH function calculates the hyperbolic sine (sinh) of a supplied number.
  2543. // The syntax of the function is:
  2544. //
  2545. // SINH(number)
  2546. //
  2547. func (fn *formulaFuncs) SINH(argsList *list.List) formulaArg {
  2548. if argsList.Len() != 1 {
  2549. return newErrorFormulaArg(formulaErrorVALUE, "SINH requires 1 numeric argument")
  2550. }
  2551. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2552. if err != nil {
  2553. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2554. }
  2555. return newNumberFormulaArg(math.Sinh(number))
  2556. }
  2557. // SQRT function calculates the positive square root of a supplied number. The
  2558. // syntax of the function is:
  2559. //
  2560. // SQRT(number)
  2561. //
  2562. func (fn *formulaFuncs) SQRT(argsList *list.List) formulaArg {
  2563. if argsList.Len() != 1 {
  2564. return newErrorFormulaArg(formulaErrorVALUE, "SQRT requires 1 numeric argument")
  2565. }
  2566. var res float64
  2567. var value = argsList.Front().Value.(formulaArg).String
  2568. if value == "" {
  2569. return newStringFormulaArg("0")
  2570. }
  2571. res, err := strconv.ParseFloat(value, 64)
  2572. if err != nil {
  2573. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2574. }
  2575. if res < 0 {
  2576. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  2577. }
  2578. return newNumberFormulaArg(math.Sqrt(res))
  2579. }
  2580. // SQRTPI function returns the square root of a supplied number multiplied by
  2581. // the mathematical constant, π. The syntax of the function is:
  2582. //
  2583. // SQRTPI(number)
  2584. //
  2585. func (fn *formulaFuncs) SQRTPI(argsList *list.List) formulaArg {
  2586. if argsList.Len() != 1 {
  2587. return newErrorFormulaArg(formulaErrorVALUE, "SQRTPI requires 1 numeric argument")
  2588. }
  2589. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2590. if err != nil {
  2591. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2592. }
  2593. return newNumberFormulaArg(math.Sqrt(number * math.Pi))
  2594. }
  2595. // SUM function adds together a supplied set of numbers and returns the sum of
  2596. // these values. The syntax of the function is:
  2597. //
  2598. // SUM(number1,[number2],...)
  2599. //
  2600. func (fn *formulaFuncs) SUM(argsList *list.List) formulaArg {
  2601. var (
  2602. val, sum float64
  2603. err error
  2604. )
  2605. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  2606. token := arg.Value.(formulaArg)
  2607. switch token.Type {
  2608. case ArgUnknown:
  2609. continue
  2610. case ArgString:
  2611. if token.String == "" {
  2612. continue
  2613. }
  2614. if val, err = strconv.ParseFloat(token.String, 64); err != nil {
  2615. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2616. }
  2617. sum += val
  2618. case ArgNumber:
  2619. sum += token.Number
  2620. case ArgMatrix:
  2621. for _, row := range token.Matrix {
  2622. for _, value := range row {
  2623. if value.String == "" {
  2624. continue
  2625. }
  2626. if val, err = strconv.ParseFloat(value.String, 64); err != nil {
  2627. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2628. }
  2629. sum += val
  2630. }
  2631. }
  2632. }
  2633. }
  2634. return newNumberFormulaArg(sum)
  2635. }
  2636. // SUMIF function finds the values in a supplied array, that satisfy a given
  2637. // criteria, and returns the sum of the corresponding values in a second
  2638. // supplied array. The syntax of the function is:
  2639. //
  2640. // SUMIF(range,criteria,[sum_range])
  2641. //
  2642. func (fn *formulaFuncs) SUMIF(argsList *list.List) formulaArg {
  2643. if argsList.Len() < 2 {
  2644. return newErrorFormulaArg(formulaErrorVALUE, "SUMIF requires at least 2 argument")
  2645. }
  2646. var criteria = formulaCriteriaParser(argsList.Front().Next().Value.(formulaArg).String)
  2647. var rangeMtx = argsList.Front().Value.(formulaArg).Matrix
  2648. var sumRange [][]formulaArg
  2649. if argsList.Len() == 3 {
  2650. sumRange = argsList.Back().Value.(formulaArg).Matrix
  2651. }
  2652. var sum, val float64
  2653. var err error
  2654. for rowIdx, row := range rangeMtx {
  2655. for colIdx, col := range row {
  2656. var ok bool
  2657. fromVal := col.String
  2658. if col.String == "" {
  2659. continue
  2660. }
  2661. if ok, err = formulaCriteriaEval(fromVal, criteria); err != nil {
  2662. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2663. }
  2664. if ok {
  2665. if argsList.Len() == 3 {
  2666. if len(sumRange) <= rowIdx || len(sumRange[rowIdx]) <= colIdx {
  2667. continue
  2668. }
  2669. fromVal = sumRange[rowIdx][colIdx].String
  2670. }
  2671. if val, err = strconv.ParseFloat(fromVal, 64); err != nil {
  2672. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2673. }
  2674. sum += val
  2675. }
  2676. }
  2677. }
  2678. return newNumberFormulaArg(sum)
  2679. }
  2680. // SUMSQ function returns the sum of squares of a supplied set of values. The
  2681. // syntax of the function is:
  2682. //
  2683. // SUMSQ(number1,[number2],...)
  2684. //
  2685. func (fn *formulaFuncs) SUMSQ(argsList *list.List) formulaArg {
  2686. var val, sq float64
  2687. var err error
  2688. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  2689. token := arg.Value.(formulaArg)
  2690. switch token.Type {
  2691. case ArgString:
  2692. if token.String == "" {
  2693. continue
  2694. }
  2695. if val, err = strconv.ParseFloat(token.String, 64); err != nil {
  2696. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2697. }
  2698. sq += val * val
  2699. case ArgMatrix:
  2700. for _, row := range token.Matrix {
  2701. for _, value := range row {
  2702. if value.String == "" {
  2703. continue
  2704. }
  2705. if val, err = strconv.ParseFloat(value.String, 64); err != nil {
  2706. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2707. }
  2708. sq += val * val
  2709. }
  2710. }
  2711. }
  2712. }
  2713. return newNumberFormulaArg(sq)
  2714. }
  2715. // TAN function calculates the tangent of a given angle. The syntax of the
  2716. // function is:
  2717. //
  2718. // TAN(number)
  2719. //
  2720. func (fn *formulaFuncs) TAN(argsList *list.List) formulaArg {
  2721. if argsList.Len() != 1 {
  2722. return newErrorFormulaArg(formulaErrorVALUE, "TAN requires 1 numeric argument")
  2723. }
  2724. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2725. if err != nil {
  2726. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2727. }
  2728. return newNumberFormulaArg(math.Tan(number))
  2729. }
  2730. // TANH function calculates the hyperbolic tangent (tanh) of a supplied
  2731. // number. The syntax of the function is:
  2732. //
  2733. // TANH(number)
  2734. //
  2735. func (fn *formulaFuncs) TANH(argsList *list.List) formulaArg {
  2736. if argsList.Len() != 1 {
  2737. return newErrorFormulaArg(formulaErrorVALUE, "TANH requires 1 numeric argument")
  2738. }
  2739. number, err := strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2740. if err != nil {
  2741. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2742. }
  2743. return newNumberFormulaArg(math.Tanh(number))
  2744. }
  2745. // TRUNC function truncates a supplied number to a specified number of decimal
  2746. // places. The syntax of the function is:
  2747. //
  2748. // TRUNC(number,[number_digits])
  2749. //
  2750. func (fn *formulaFuncs) TRUNC(argsList *list.List) formulaArg {
  2751. if argsList.Len() == 0 {
  2752. return newErrorFormulaArg(formulaErrorVALUE, "TRUNC requires at least 1 argument")
  2753. }
  2754. var number, digits, adjust, rtrim float64
  2755. var err error
  2756. number, err = strconv.ParseFloat(argsList.Front().Value.(formulaArg).String, 64)
  2757. if err != nil {
  2758. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2759. }
  2760. if argsList.Len() > 1 {
  2761. if digits, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64); err != nil {
  2762. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2763. }
  2764. digits = math.Floor(digits)
  2765. }
  2766. adjust = math.Pow(10, digits)
  2767. x := int((math.Abs(number) - math.Abs(float64(int(number)))) * adjust)
  2768. if x != 0 {
  2769. if rtrim, err = strconv.ParseFloat(strings.TrimRight(strconv.Itoa(x), "0"), 64); err != nil {
  2770. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2771. }
  2772. }
  2773. if (digits > 0) && (rtrim < adjust/10) {
  2774. return newNumberFormulaArg(number)
  2775. }
  2776. return newNumberFormulaArg(float64(int(number*adjust)) / adjust)
  2777. }
  2778. // Statistical functions
  2779. // COUNTA function returns the number of non-blanks within a supplied set of
  2780. // cells or values. The syntax of the function is:
  2781. //
  2782. // COUNTA(value1,[value2],...)
  2783. //
  2784. func (fn *formulaFuncs) COUNTA(argsList *list.List) formulaArg {
  2785. var count int
  2786. for token := argsList.Front(); token != nil; token = token.Next() {
  2787. arg := token.Value.(formulaArg)
  2788. switch arg.Type {
  2789. case ArgString:
  2790. if arg.String != "" {
  2791. count++
  2792. }
  2793. case ArgMatrix:
  2794. for _, row := range arg.Matrix {
  2795. for _, value := range row {
  2796. if value.String != "" {
  2797. count++
  2798. }
  2799. }
  2800. }
  2801. }
  2802. }
  2803. return newStringFormulaArg(fmt.Sprintf("%d", count))
  2804. }
  2805. // MEDIAN function returns the statistical median (the middle value) of a list
  2806. // of supplied numbers. The syntax of the function is:
  2807. //
  2808. // MEDIAN(number1,[number2],...)
  2809. //
  2810. func (fn *formulaFuncs) MEDIAN(argsList *list.List) formulaArg {
  2811. if argsList.Len() == 0 {
  2812. return newErrorFormulaArg(formulaErrorVALUE, "MEDIAN requires at least 1 argument")
  2813. }
  2814. var values = []float64{}
  2815. var median, digits float64
  2816. var err error
  2817. for token := argsList.Front(); token != nil; token = token.Next() {
  2818. arg := token.Value.(formulaArg)
  2819. switch arg.Type {
  2820. case ArgString:
  2821. if digits, err = strconv.ParseFloat(argsList.Back().Value.(formulaArg).String, 64); err != nil {
  2822. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2823. }
  2824. values = append(values, digits)
  2825. case ArgMatrix:
  2826. for _, row := range arg.Matrix {
  2827. for _, value := range row {
  2828. if value.String == "" {
  2829. continue
  2830. }
  2831. if digits, err = strconv.ParseFloat(value.String, 64); err != nil {
  2832. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2833. }
  2834. values = append(values, digits)
  2835. }
  2836. }
  2837. }
  2838. }
  2839. sort.Float64s(values)
  2840. if len(values)%2 == 0 {
  2841. median = (values[len(values)/2-1] + values[len(values)/2]) / 2
  2842. } else {
  2843. median = values[len(values)/2]
  2844. }
  2845. return newNumberFormulaArg(median)
  2846. }
  2847. // Information functions
  2848. // ISBLANK function tests if a specified cell is blank (empty) and if so,
  2849. // returns TRUE; Otherwise the function returns FALSE. The syntax of the
  2850. // function is:
  2851. //
  2852. // ISBLANK(value)
  2853. //
  2854. func (fn *formulaFuncs) ISBLANK(argsList *list.List) formulaArg {
  2855. if argsList.Len() != 1 {
  2856. return newErrorFormulaArg(formulaErrorVALUE, "ISBLANK requires 1 argument")
  2857. }
  2858. token := argsList.Front().Value.(formulaArg)
  2859. result := "FALSE"
  2860. switch token.Type {
  2861. case ArgUnknown:
  2862. result = "TRUE"
  2863. case ArgString:
  2864. if token.String == "" {
  2865. result = "TRUE"
  2866. }
  2867. }
  2868. return newStringFormulaArg(result)
  2869. }
  2870. // ISERR function tests if an initial supplied expression (or value) returns
  2871. // any Excel Error, except the #N/A error. If so, the function returns the
  2872. // logical value TRUE; If the supplied value is not an error or is the #N/A
  2873. // error, the ISERR function returns FALSE. The syntax of the function is:
  2874. //
  2875. // ISERR(value)
  2876. //
  2877. func (fn *formulaFuncs) ISERR(argsList *list.List) formulaArg {
  2878. if argsList.Len() != 1 {
  2879. return newErrorFormulaArg(formulaErrorVALUE, "ISERR requires 1 argument")
  2880. }
  2881. token := argsList.Front().Value.(formulaArg)
  2882. result := "FALSE"
  2883. if token.Type == ArgString {
  2884. for _, errType := range []string{formulaErrorDIV, formulaErrorNAME, formulaErrorNUM, formulaErrorVALUE, formulaErrorREF, formulaErrorNULL, formulaErrorSPILL, formulaErrorCALC, formulaErrorGETTINGDATA} {
  2885. if errType == token.String {
  2886. result = "TRUE"
  2887. }
  2888. }
  2889. }
  2890. return newStringFormulaArg(result)
  2891. }
  2892. // ISERROR function tests if an initial supplied expression (or value) returns
  2893. // an Excel Error, and if so, returns the logical value TRUE; Otherwise the
  2894. // function returns FALSE. The syntax of the function is:
  2895. //
  2896. // ISERROR(value)
  2897. //
  2898. func (fn *formulaFuncs) ISERROR(argsList *list.List) formulaArg {
  2899. if argsList.Len() != 1 {
  2900. return newErrorFormulaArg(formulaErrorVALUE, "ISERROR requires 1 argument")
  2901. }
  2902. token := argsList.Front().Value.(formulaArg)
  2903. result := "FALSE"
  2904. if token.Type == ArgString {
  2905. for _, errType := range []string{formulaErrorDIV, formulaErrorNAME, formulaErrorNA, formulaErrorNUM, formulaErrorVALUE, formulaErrorREF, formulaErrorNULL, formulaErrorSPILL, formulaErrorCALC, formulaErrorGETTINGDATA} {
  2906. if errType == token.String {
  2907. result = "TRUE"
  2908. }
  2909. }
  2910. }
  2911. return newStringFormulaArg(result)
  2912. }
  2913. // ISEVEN function tests if a supplied number (or numeric expression)
  2914. // evaluates to an even number, and if so, returns TRUE; Otherwise, the
  2915. // function returns FALSE. The syntax of the function is:
  2916. //
  2917. // ISEVEN(value)
  2918. //
  2919. func (fn *formulaFuncs) ISEVEN(argsList *list.List) formulaArg {
  2920. if argsList.Len() != 1 {
  2921. return newErrorFormulaArg(formulaErrorVALUE, "ISEVEN requires 1 argument")
  2922. }
  2923. var (
  2924. token = argsList.Front().Value.(formulaArg)
  2925. result = "FALSE"
  2926. numeric int
  2927. err error
  2928. )
  2929. if token.Type == ArgString {
  2930. if numeric, err = strconv.Atoi(token.String); err != nil {
  2931. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  2932. }
  2933. if numeric == numeric/2*2 {
  2934. return newStringFormulaArg("TRUE")
  2935. }
  2936. }
  2937. return newStringFormulaArg(result)
  2938. }
  2939. // ISNA function tests if an initial supplied expression (or value) returns
  2940. // the Excel #N/A Error, and if so, returns TRUE; Otherwise the function
  2941. // returns FALSE. The syntax of the function is:
  2942. //
  2943. // ISNA(value)
  2944. //
  2945. func (fn *formulaFuncs) ISNA(argsList *list.List) formulaArg {
  2946. if argsList.Len() != 1 {
  2947. return newErrorFormulaArg(formulaErrorVALUE, "ISNA requires 1 argument")
  2948. }
  2949. token := argsList.Front().Value.(formulaArg)
  2950. result := "FALSE"
  2951. if token.Type == ArgString && token.String == formulaErrorNA {
  2952. result = "TRUE"
  2953. }
  2954. return newStringFormulaArg(result)
  2955. }
  2956. // ISNONTEXT function function tests if a supplied value is text. If not, the
  2957. // function returns TRUE; If the supplied value is text, the function returns
  2958. // FALSE. The syntax of the function is:
  2959. //
  2960. // ISNONTEXT(value)
  2961. //
  2962. func (fn *formulaFuncs) ISNONTEXT(argsList *list.List) formulaArg {
  2963. if argsList.Len() != 1 {
  2964. return newErrorFormulaArg(formulaErrorVALUE, "ISNONTEXT requires 1 argument")
  2965. }
  2966. token := argsList.Front().Value.(formulaArg)
  2967. result := "TRUE"
  2968. if token.Type == ArgString && token.String != "" {
  2969. result = "FALSE"
  2970. }
  2971. return newStringFormulaArg(result)
  2972. }
  2973. // ISNUMBER function function tests if a supplied value is a number. If so,
  2974. // the function returns TRUE; Otherwise it returns FALSE. The syntax of the
  2975. // function is:
  2976. //
  2977. // ISNUMBER(value)
  2978. //
  2979. func (fn *formulaFuncs) ISNUMBER(argsList *list.List) formulaArg {
  2980. if argsList.Len() != 1 {
  2981. return newErrorFormulaArg(formulaErrorVALUE, "ISNUMBER requires 1 argument")
  2982. }
  2983. token := argsList.Front().Value.(formulaArg)
  2984. result := "FALSE"
  2985. if token.Type == ArgString && token.String != "" {
  2986. if _, err := strconv.Atoi(token.String); err == nil {
  2987. result = "TRUE"
  2988. }
  2989. }
  2990. return newStringFormulaArg(result)
  2991. }
  2992. // ISODD function tests if a supplied number (or numeric expression) evaluates
  2993. // to an odd number, and if so, returns TRUE; Otherwise, the function returns
  2994. // FALSE. The syntax of the function is:
  2995. //
  2996. // ISODD(value)
  2997. //
  2998. func (fn *formulaFuncs) ISODD(argsList *list.List) formulaArg {
  2999. if argsList.Len() != 1 {
  3000. return newErrorFormulaArg(formulaErrorVALUE, "ISODD requires 1 argument")
  3001. }
  3002. var (
  3003. token = argsList.Front().Value.(formulaArg)
  3004. result = "FALSE"
  3005. numeric int
  3006. err error
  3007. )
  3008. if token.Type == ArgString {
  3009. if numeric, err = strconv.Atoi(token.String); err != nil {
  3010. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  3011. }
  3012. if numeric != numeric/2*2 {
  3013. return newStringFormulaArg("TRUE")
  3014. }
  3015. }
  3016. return newStringFormulaArg(result)
  3017. }
  3018. // NA function returns the Excel #N/A error. This error message has the
  3019. // meaning 'value not available' and is produced when an Excel Formula is
  3020. // unable to find a value that it needs. The syntax of the function is:
  3021. //
  3022. // NA()
  3023. //
  3024. func (fn *formulaFuncs) NA(argsList *list.List) formulaArg {
  3025. if argsList.Len() != 0 {
  3026. return newErrorFormulaArg(formulaErrorVALUE, "NA accepts no arguments")
  3027. }
  3028. return newStringFormulaArg(formulaErrorNA)
  3029. }
  3030. // Logical Functions
  3031. // AND function tests a number of supplied conditions and returns TRUE or
  3032. // FALSE. The syntax of the function is:
  3033. //
  3034. // AND(logical_test1,[logical_test2],...)
  3035. //
  3036. func (fn *formulaFuncs) AND(argsList *list.List) formulaArg {
  3037. if argsList.Len() == 0 {
  3038. return newErrorFormulaArg(formulaErrorVALUE, "AND requires at least 1 argument")
  3039. }
  3040. if argsList.Len() > 30 {
  3041. return newErrorFormulaArg(formulaErrorVALUE, "AND accepts at most 30 arguments")
  3042. }
  3043. var (
  3044. and = true
  3045. val float64
  3046. err error
  3047. )
  3048. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  3049. token := arg.Value.(formulaArg)
  3050. switch token.Type {
  3051. case ArgUnknown:
  3052. continue
  3053. case ArgString:
  3054. if token.String == "TRUE" {
  3055. continue
  3056. }
  3057. if token.String == "FALSE" {
  3058. return newStringFormulaArg(token.String)
  3059. }
  3060. if val, err = strconv.ParseFloat(token.String, 64); err != nil {
  3061. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  3062. }
  3063. and = and && (val != 0)
  3064. case ArgMatrix:
  3065. // TODO
  3066. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  3067. }
  3068. }
  3069. return newBoolFormulaArg(and)
  3070. }
  3071. // OR function tests a number of supplied conditions and returns either TRUE
  3072. // or FALSE. The syntax of the function is:
  3073. //
  3074. // OR(logical_test1,[logical_test2],...)
  3075. //
  3076. func (fn *formulaFuncs) OR(argsList *list.List) formulaArg {
  3077. if argsList.Len() == 0 {
  3078. return newErrorFormulaArg(formulaErrorVALUE, "OR requires at least 1 argument")
  3079. }
  3080. if argsList.Len() > 30 {
  3081. return newErrorFormulaArg(formulaErrorVALUE, "OR accepts at most 30 arguments")
  3082. }
  3083. var (
  3084. or bool
  3085. val float64
  3086. err error
  3087. )
  3088. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  3089. token := arg.Value.(formulaArg)
  3090. switch token.Type {
  3091. case ArgUnknown:
  3092. continue
  3093. case ArgString:
  3094. if token.String == "FALSE" {
  3095. continue
  3096. }
  3097. if token.String == "TRUE" {
  3098. or = true
  3099. continue
  3100. }
  3101. if val, err = strconv.ParseFloat(token.String, 64); err != nil {
  3102. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  3103. }
  3104. or = val != 0
  3105. case ArgMatrix:
  3106. // TODO
  3107. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  3108. }
  3109. }
  3110. return newStringFormulaArg(strings.ToUpper(strconv.FormatBool(or)))
  3111. }
  3112. // Date and Time Functions
  3113. // DATE returns a date, from a user-supplied year, month and day. The syntax
  3114. // of the function is:
  3115. //
  3116. // DATE(year,month,day)
  3117. //
  3118. func (fn *formulaFuncs) DATE(argsList *list.List) formulaArg {
  3119. if argsList.Len() != 3 {
  3120. return newErrorFormulaArg(formulaErrorVALUE, "DATE requires 3 number arguments")
  3121. }
  3122. var year, month, day int
  3123. var err error
  3124. if year, err = strconv.Atoi(argsList.Front().Value.(formulaArg).String); err != nil {
  3125. return newErrorFormulaArg(formulaErrorVALUE, "DATE requires 3 number arguments")
  3126. }
  3127. if month, err = strconv.Atoi(argsList.Front().Next().Value.(formulaArg).String); err != nil {
  3128. return newErrorFormulaArg(formulaErrorVALUE, "DATE requires 3 number arguments")
  3129. }
  3130. if day, err = strconv.Atoi(argsList.Back().Value.(formulaArg).String); err != nil {
  3131. return newErrorFormulaArg(formulaErrorVALUE, "DATE requires 3 number arguments")
  3132. }
  3133. d := makeDate(year, time.Month(month), day)
  3134. return newStringFormulaArg(timeFromExcelTime(daysBetween(excelMinTime1900.Unix(), d)+1, false).String())
  3135. }
  3136. // makeDate return date as a Unix time, the number of seconds elapsed since
  3137. // January 1, 1970 UTC.
  3138. func makeDate(y int, m time.Month, d int) int64 {
  3139. if y == 1900 && int(m) <= 2 {
  3140. d--
  3141. }
  3142. date := time.Date(y, m, d, 0, 0, 0, 0, time.UTC)
  3143. return date.Unix()
  3144. }
  3145. // daysBetween return time interval of the given start timestamp and end
  3146. // timestamp.
  3147. func daysBetween(startDate, endDate int64) float64 {
  3148. return float64(int(0.5 + float64((endDate-startDate)/86400)))
  3149. }
  3150. // Text Functions
  3151. // CLEAN removes all non-printable characters from a supplied text string. The
  3152. // syntax of the function is:
  3153. //
  3154. // CLEAN(text)
  3155. //
  3156. func (fn *formulaFuncs) CLEAN(argsList *list.List) formulaArg {
  3157. if argsList.Len() != 1 {
  3158. return newErrorFormulaArg(formulaErrorVALUE, "CLEAN requires 1 argument")
  3159. }
  3160. b := bytes.Buffer{}
  3161. for _, c := range argsList.Front().Value.(formulaArg).String {
  3162. if c > 31 {
  3163. b.WriteRune(c)
  3164. }
  3165. }
  3166. return newStringFormulaArg(b.String())
  3167. }
  3168. // LEN returns the length of a supplied text string. The syntax of the
  3169. // function is:
  3170. //
  3171. // LEN(text)
  3172. //
  3173. func (fn *formulaFuncs) LEN(argsList *list.List) formulaArg {
  3174. if argsList.Len() != 1 {
  3175. return newErrorFormulaArg(formulaErrorVALUE, "LEN requires 1 string argument")
  3176. }
  3177. return newStringFormulaArg(strconv.Itoa(len(argsList.Front().Value.(formulaArg).String)))
  3178. }
  3179. // TRIM removes extra spaces (i.e. all spaces except for single spaces between
  3180. // words or characters) from a supplied text string. The syntax of the
  3181. // function is:
  3182. //
  3183. // TRIM(text)
  3184. //
  3185. func (fn *formulaFuncs) TRIM(argsList *list.List) formulaArg {
  3186. if argsList.Len() != 1 {
  3187. return newErrorFormulaArg(formulaErrorVALUE, "TRIM requires 1 argument")
  3188. }
  3189. return newStringFormulaArg(strings.TrimSpace(argsList.Front().Value.(formulaArg).String))
  3190. }
  3191. // LOWER converts all characters in a supplied text string to lower case. The
  3192. // syntax of the function is:
  3193. //
  3194. // LOWER(text)
  3195. //
  3196. func (fn *formulaFuncs) LOWER(argsList *list.List) formulaArg {
  3197. if argsList.Len() != 1 {
  3198. return newErrorFormulaArg(formulaErrorVALUE, "LOWER requires 1 argument")
  3199. }
  3200. return newStringFormulaArg(strings.ToLower(argsList.Front().Value.(formulaArg).String))
  3201. }
  3202. // PROPER converts all characters in a supplied text string to proper case
  3203. // (i.e. all letters that do not immediately follow another letter are set to
  3204. // upper case and all other characters are lower case). The syntax of the
  3205. // function is:
  3206. //
  3207. // PROPER(text)
  3208. //
  3209. func (fn *formulaFuncs) PROPER(argsList *list.List) formulaArg {
  3210. if argsList.Len() != 1 {
  3211. return newErrorFormulaArg(formulaErrorVALUE, "PROPER requires 1 argument")
  3212. }
  3213. buf := bytes.Buffer{}
  3214. isLetter := false
  3215. for _, char := range argsList.Front().Value.(formulaArg).String {
  3216. if !isLetter && unicode.IsLetter(char) {
  3217. buf.WriteRune(unicode.ToUpper(char))
  3218. } else {
  3219. buf.WriteRune(unicode.ToLower(char))
  3220. }
  3221. isLetter = unicode.IsLetter(char)
  3222. }
  3223. return newStringFormulaArg(buf.String())
  3224. }
  3225. // UPPER converts all characters in a supplied text string to upper case. The
  3226. // syntax of the function is:
  3227. //
  3228. // UPPER(text)
  3229. //
  3230. func (fn *formulaFuncs) UPPER(argsList *list.List) formulaArg {
  3231. if argsList.Len() != 1 {
  3232. return newErrorFormulaArg(formulaErrorVALUE, "UPPER requires 1 argument")
  3233. }
  3234. return newStringFormulaArg(strings.ToUpper(argsList.Front().Value.(formulaArg).String))
  3235. }
  3236. // Conditional Functions
  3237. // IF function tests a supplied condition and returns one result if the
  3238. // condition evaluates to TRUE, and another result if the condition evaluates
  3239. // to FALSE. The syntax of the function is:
  3240. //
  3241. // IF(logical_test,value_if_true,value_if_false)
  3242. //
  3243. func (fn *formulaFuncs) IF(argsList *list.List) formulaArg {
  3244. if argsList.Len() == 0 {
  3245. return newErrorFormulaArg(formulaErrorVALUE, "IF requires at least 1 argument")
  3246. }
  3247. if argsList.Len() > 3 {
  3248. return newErrorFormulaArg(formulaErrorVALUE, "IF accepts at most 3 arguments")
  3249. }
  3250. token := argsList.Front().Value.(formulaArg)
  3251. var (
  3252. cond bool
  3253. err error
  3254. result string
  3255. )
  3256. switch token.Type {
  3257. case ArgString:
  3258. if cond, err = strconv.ParseBool(token.String); err != nil {
  3259. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  3260. }
  3261. if argsList.Len() == 1 {
  3262. return newBoolFormulaArg(cond)
  3263. }
  3264. if cond {
  3265. return newStringFormulaArg(argsList.Front().Next().Value.(formulaArg).String)
  3266. }
  3267. if argsList.Len() == 3 {
  3268. result = argsList.Back().Value.(formulaArg).String
  3269. }
  3270. }
  3271. return newStringFormulaArg(result)
  3272. }
  3273. // Excel Lookup and Reference Functions
  3274. // CHOOSE function returns a value from an array, that corresponds to a
  3275. // supplied index number (position). The syntax of the function is:
  3276. //
  3277. // CHOOSE(index_num,value1,[value2],...)
  3278. //
  3279. func (fn *formulaFuncs) CHOOSE(argsList *list.List) formulaArg {
  3280. if argsList.Len() < 2 {
  3281. return newErrorFormulaArg(formulaErrorVALUE, "CHOOSE requires 2 arguments")
  3282. }
  3283. idx, err := strconv.Atoi(argsList.Front().Value.(formulaArg).String)
  3284. if err != nil {
  3285. return newErrorFormulaArg(formulaErrorVALUE, "CHOOSE requires first argument of type number")
  3286. }
  3287. if argsList.Len() <= idx {
  3288. return newErrorFormulaArg(formulaErrorVALUE, "index_num should be <= to the number of values")
  3289. }
  3290. arg := argsList.Front()
  3291. for i := 0; i < idx; i++ {
  3292. arg = arg.Next()
  3293. }
  3294. var result formulaArg
  3295. switch arg.Value.(formulaArg).Type {
  3296. case ArgString:
  3297. result = newStringFormulaArg(arg.Value.(formulaArg).String)
  3298. case ArgMatrix:
  3299. result = newMatrixFormulaArg(arg.Value.(formulaArg).Matrix)
  3300. }
  3301. return result
  3302. }