calc.go 81 KB

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