calc.go 90 KB

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