calc.go 100 KB

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