calc.go 95 KB

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