calc.go 560 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988
  1. // Copyright 2016 - 2023 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 and
  6. // read from XLAM / XLSM / XLSX / XLTM / XLTX files. Supports reading and
  7. // writing spreadsheet documents generated by Microsoft Excel™ 2007 and later.
  8. // Supports complex components by high compatibility, and provided streaming
  9. // API for generating or reading data from a worksheet with huge amounts of
  10. // data. This library needs Go version 1.16 or later.
  11. package excelize
  12. import (
  13. "bytes"
  14. "container/list"
  15. "errors"
  16. "fmt"
  17. "math"
  18. "math/big"
  19. "math/cmplx"
  20. "math/rand"
  21. "net/url"
  22. "reflect"
  23. "regexp"
  24. "sort"
  25. "strconv"
  26. "strings"
  27. "sync"
  28. "time"
  29. "unicode"
  30. "unicode/utf8"
  31. "unsafe"
  32. "github.com/xuri/efp"
  33. "golang.org/x/text/language"
  34. "golang.org/x/text/message"
  35. )
  36. const (
  37. // Excel formula errors
  38. formulaErrorDIV = "#DIV/0!"
  39. formulaErrorNAME = "#NAME?"
  40. formulaErrorNA = "#N/A"
  41. formulaErrorNUM = "#NUM!"
  42. formulaErrorVALUE = "#VALUE!"
  43. formulaErrorREF = "#REF!"
  44. formulaErrorNULL = "#NULL!"
  45. formulaErrorSPILL = "#SPILL!"
  46. formulaErrorCALC = "#CALC!"
  47. formulaErrorGETTINGDATA = "#GETTING_DATA"
  48. // Formula criteria condition enumeration
  49. _ byte = iota
  50. criteriaEq
  51. criteriaLe
  52. criteriaGe
  53. criteriaNe
  54. criteriaL
  55. criteriaG
  56. criteriaErr
  57. criteriaRegexp
  58. categoryWeightAndMass
  59. categoryDistance
  60. categoryTime
  61. categoryPressure
  62. categoryForce
  63. categoryEnergy
  64. categoryPower
  65. categoryMagnetism
  66. categoryTemperature
  67. categoryVolumeAndLiquidMeasure
  68. categoryArea
  69. categoryInformation
  70. categorySpeed
  71. matchModeExact = 0
  72. matchModeMinGreater = 1
  73. matchModeMaxLess = -1
  74. matchModeWildcard = 2
  75. searchModeLinear = 1
  76. searchModeReverseLinear = -1
  77. searchModeAscBinary = 2
  78. searchModeDescBinary = -2
  79. maxFinancialIterations = 128
  80. financialPrecision = 1.0e-08
  81. // Date and time format regular expressions
  82. monthRe = `((jan|january)|(feb|february)|(mar|march)|(apr|april)|(may)|(jun|june)|(jul|july)|(aug|august)|(sep|september)|(oct|october)|(nov|november)|(dec|december))`
  83. df1 = `(([0-9])+)/(([0-9])+)/(([0-9])+)`
  84. df2 = monthRe + ` (([0-9])+), (([0-9])+)`
  85. df3 = `(([0-9])+)-(([0-9])+)-(([0-9])+)`
  86. df4 = `(([0-9])+)-` + monthRe + `-(([0-9])+)`
  87. datePrefix = `^((` + df1 + `|` + df2 + `|` + df3 + `|` + df4 + `) )?`
  88. tfhh = `(([0-9])+) (am|pm)`
  89. tfhhmm = `(([0-9])+):(([0-9])+)( (am|pm))?`
  90. tfmmss = `(([0-9])+):(([0-9])+\.([0-9])+)( (am|pm))?`
  91. tfhhmmss = `(([0-9])+):(([0-9])+):(([0-9])+(\.([0-9])+)?)( (am|pm))?`
  92. timeSuffix = `( (` + tfhh + `|` + tfhhmm + `|` + tfmmss + `|` + tfhhmmss + `))?$`
  93. )
  94. var (
  95. // tokenPriority defined basic arithmetic operator priority
  96. tokenPriority = map[string]int{
  97. "^": 5,
  98. "*": 4,
  99. "/": 4,
  100. "+": 3,
  101. "-": 3,
  102. "=": 2,
  103. "<>": 2,
  104. "<": 2,
  105. "<=": 2,
  106. ">": 2,
  107. ">=": 2,
  108. "&": 1,
  109. }
  110. month2num = map[string]int{
  111. "january": 1,
  112. "february": 2,
  113. "march": 3,
  114. "april": 4,
  115. "may": 5,
  116. "june": 6,
  117. "july": 7,
  118. "august": 8,
  119. "september": 9,
  120. "october": 10,
  121. "november": 11,
  122. "december": 12,
  123. "jan": 1,
  124. "feb": 2,
  125. "mar": 3,
  126. "apr": 4,
  127. "jun": 6,
  128. "jul": 7,
  129. "aug": 8,
  130. "sep": 9,
  131. "oct": 10,
  132. "nov": 11,
  133. "dec": 12,
  134. }
  135. dateFormats = map[string]*regexp.Regexp{
  136. "mm/dd/yy": regexp.MustCompile(`^` + df1 + timeSuffix),
  137. "mm dd, yy": regexp.MustCompile(`^` + df2 + timeSuffix),
  138. "yy-mm-dd": regexp.MustCompile(`^` + df3 + timeSuffix),
  139. "yy-mmStr-dd": regexp.MustCompile(`^` + df4 + timeSuffix),
  140. }
  141. timeFormats = map[string]*regexp.Regexp{
  142. "hh": regexp.MustCompile(datePrefix + tfhh + `$`),
  143. "hh:mm": regexp.MustCompile(datePrefix + tfhhmm + `$`),
  144. "mm:ss": regexp.MustCompile(datePrefix + tfmmss + `$`),
  145. "hh:mm:ss": regexp.MustCompile(datePrefix + tfhhmmss + `$`),
  146. }
  147. dateOnlyFormats = []*regexp.Regexp{
  148. regexp.MustCompile(`^` + df1 + `$`),
  149. regexp.MustCompile(`^` + df2 + `$`),
  150. regexp.MustCompile(`^` + df3 + `$`),
  151. regexp.MustCompile(`^` + df4 + `$`),
  152. }
  153. addressFmtMaps = map[string]func(col, row int) (string, error){
  154. "1_TRUE": func(col, row int) (string, error) {
  155. return CoordinatesToCellName(col, row, true)
  156. },
  157. "1_FALSE": func(col, row int) (string, error) {
  158. return fmt.Sprintf("R%dC%d", row, col), nil
  159. },
  160. "2_TRUE": func(col, row int) (string, error) {
  161. column, err := ColumnNumberToName(col)
  162. if err != nil {
  163. return "", err
  164. }
  165. return fmt.Sprintf("%s$%d", column, row), nil
  166. },
  167. "2_FALSE": func(col, row int) (string, error) {
  168. return fmt.Sprintf("R%dC[%d]", row, col), nil
  169. },
  170. "3_TRUE": func(col, row int) (string, error) {
  171. column, err := ColumnNumberToName(col)
  172. if err != nil {
  173. return "", err
  174. }
  175. return fmt.Sprintf("$%s%d", column, row), nil
  176. },
  177. "3_FALSE": func(col, row int) (string, error) {
  178. return fmt.Sprintf("R[%d]C%d", row, col), nil
  179. },
  180. "4_TRUE": func(col, row int) (string, error) {
  181. return CoordinatesToCellName(col, row, false)
  182. },
  183. "4_FALSE": func(col, row int) (string, error) {
  184. return fmt.Sprintf("R[%d]C[%d]", row, col), nil
  185. },
  186. }
  187. )
  188. // calcContext defines the formula execution context.
  189. type calcContext struct {
  190. sync.Mutex
  191. entry string
  192. maxCalcIterations uint
  193. iterations map[string]uint
  194. iterationsCache map[string]formulaArg
  195. }
  196. // cellRef defines the structure of a cell reference.
  197. type cellRef struct {
  198. Col int
  199. Row int
  200. Sheet string
  201. }
  202. // cellRef defines the structure of a cell range.
  203. type cellRange struct {
  204. From cellRef
  205. To cellRef
  206. }
  207. // formulaCriteria defined formula criteria parser result.
  208. type formulaCriteria struct {
  209. Type byte
  210. Condition string
  211. }
  212. // ArgType is the type of formula argument type.
  213. type ArgType byte
  214. // Formula argument types enumeration.
  215. const (
  216. ArgUnknown ArgType = iota
  217. ArgNumber
  218. ArgString
  219. ArgList
  220. ArgMatrix
  221. ArgError
  222. ArgEmpty
  223. )
  224. // formulaArg is the argument of a formula or function.
  225. type formulaArg struct {
  226. SheetName string
  227. Number float64
  228. String string
  229. List []formulaArg
  230. Matrix [][]formulaArg
  231. Boolean bool
  232. Error string
  233. Type ArgType
  234. cellRefs, cellRanges *list.List
  235. }
  236. // Value returns a string data type of the formula argument.
  237. func (fa formulaArg) Value() (value string) {
  238. switch fa.Type {
  239. case ArgNumber:
  240. if fa.Boolean {
  241. if fa.Number == 0 {
  242. return "FALSE"
  243. }
  244. return "TRUE"
  245. }
  246. return fmt.Sprintf("%g", fa.Number)
  247. case ArgString:
  248. return fa.String
  249. case ArgError:
  250. return fa.Error
  251. }
  252. return
  253. }
  254. // ToNumber returns a formula argument with number data type.
  255. func (fa formulaArg) ToNumber() formulaArg {
  256. var n float64
  257. var err error
  258. switch fa.Type {
  259. case ArgString:
  260. n, err = strconv.ParseFloat(fa.String, 64)
  261. if err != nil {
  262. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  263. }
  264. case ArgNumber:
  265. n = fa.Number
  266. }
  267. return newNumberFormulaArg(n)
  268. }
  269. // ToBool returns a formula argument with boolean data type.
  270. func (fa formulaArg) ToBool() formulaArg {
  271. var b bool
  272. var err error
  273. switch fa.Type {
  274. case ArgString:
  275. b, err = strconv.ParseBool(fa.String)
  276. if err != nil {
  277. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  278. }
  279. case ArgNumber:
  280. if fa.Boolean && fa.Number == 1 {
  281. b = true
  282. }
  283. }
  284. return newBoolFormulaArg(b)
  285. }
  286. // ToList returns a formula argument with array data type.
  287. func (fa formulaArg) ToList() []formulaArg {
  288. switch fa.Type {
  289. case ArgMatrix:
  290. var args []formulaArg
  291. for _, row := range fa.Matrix {
  292. args = append(args, row...)
  293. }
  294. return args
  295. case ArgList:
  296. return fa.List
  297. case ArgNumber, ArgString, ArgError, ArgUnknown:
  298. return []formulaArg{fa}
  299. }
  300. return nil
  301. }
  302. // formulaFuncs is the type of the formula functions.
  303. type formulaFuncs struct {
  304. f *File
  305. ctx *calcContext
  306. sheet, cell string
  307. }
  308. // CalcCellValue provides a function to get calculated cell value. This feature
  309. // is currently in working processing. Iterative calculation, implicit
  310. // intersection, explicit intersection, array formula, table formula and some
  311. // other formulas are not supported currently.
  312. //
  313. // Supported formula functions:
  314. //
  315. // ABS
  316. // ACCRINT
  317. // ACCRINTM
  318. // ACOS
  319. // ACOSH
  320. // ACOT
  321. // ACOTH
  322. // ADDRESS
  323. // AGGREGATE
  324. // AMORDEGRC
  325. // AMORLINC
  326. // AND
  327. // ARABIC
  328. // ASIN
  329. // ASINH
  330. // ATAN
  331. // ATAN2
  332. // ATANH
  333. // AVEDEV
  334. // AVERAGE
  335. // AVERAGEA
  336. // AVERAGEIF
  337. // AVERAGEIFS
  338. // BASE
  339. // BESSELI
  340. // BESSELJ
  341. // BESSELK
  342. // BESSELY
  343. // BETADIST
  344. // BETA.DIST
  345. // BETAINV
  346. // BETA.INV
  347. // BIN2DEC
  348. // BIN2HEX
  349. // BIN2OCT
  350. // BINOMDIST
  351. // BINOM.DIST
  352. // BINOM.DIST.RANGE
  353. // BINOM.INV
  354. // BITAND
  355. // BITLSHIFT
  356. // BITOR
  357. // BITRSHIFT
  358. // BITXOR
  359. // CEILING
  360. // CEILING.MATH
  361. // CEILING.PRECISE
  362. // CHAR
  363. // CHIDIST
  364. // CHIINV
  365. // CHITEST
  366. // CHISQ.DIST
  367. // CHISQ.DIST.RT
  368. // CHISQ.INV
  369. // CHISQ.INV.RT
  370. // CHISQ.TEST
  371. // CHOOSE
  372. // CLEAN
  373. // CODE
  374. // COLUMN
  375. // COLUMNS
  376. // COMBIN
  377. // COMBINA
  378. // COMPLEX
  379. // CONCAT
  380. // CONCATENATE
  381. // CONFIDENCE
  382. // CONFIDENCE.NORM
  383. // CONFIDENCE.T
  384. // CONVERT
  385. // CORREL
  386. // COS
  387. // COSH
  388. // COT
  389. // COTH
  390. // COUNT
  391. // COUNTA
  392. // COUNTBLANK
  393. // COUNTIF
  394. // COUNTIFS
  395. // COUPDAYBS
  396. // COUPDAYS
  397. // COUPDAYSNC
  398. // COUPNCD
  399. // COUPNUM
  400. // COUPPCD
  401. // COVAR
  402. // COVARIANCE.P
  403. // COVARIANCE.S
  404. // CRITBINOM
  405. // CSC
  406. // CSCH
  407. // CUMIPMT
  408. // CUMPRINC
  409. // DATE
  410. // DATEDIF
  411. // DATEVALUE
  412. // DAVERAGE
  413. // DAY
  414. // DAYS
  415. // DAYS360
  416. // DB
  417. // DCOUNT
  418. // DCOUNTA
  419. // DDB
  420. // DEC2BIN
  421. // DEC2HEX
  422. // DEC2OCT
  423. // DECIMAL
  424. // DEGREES
  425. // DELTA
  426. // DEVSQ
  427. // DGET
  428. // DISC
  429. // DMAX
  430. // DMIN
  431. // DOLLARDE
  432. // DOLLARFR
  433. // DPRODUCT
  434. // DSTDEV
  435. // DSTDEVP
  436. // DSUM
  437. // DURATION
  438. // DVAR
  439. // DVARP
  440. // EFFECT
  441. // EDATE
  442. // ENCODEURL
  443. // EOMONTH
  444. // ERF
  445. // ERF.PRECISE
  446. // ERFC
  447. // ERFC.PRECISE
  448. // ERROR.TYPE
  449. // EUROCONVERT
  450. // EVEN
  451. // EXACT
  452. // EXP
  453. // EXPON.DIST
  454. // EXPONDIST
  455. // FACT
  456. // FACTDOUBLE
  457. // FALSE
  458. // F.DIST
  459. // F.DIST.RT
  460. // FDIST
  461. // FIND
  462. // FINDB
  463. // F.INV
  464. // F.INV.RT
  465. // FINV
  466. // FISHER
  467. // FISHERINV
  468. // FIXED
  469. // FLOOR
  470. // FLOOR.MATH
  471. // FLOOR.PRECISE
  472. // FORMULATEXT
  473. // F.TEST
  474. // FTEST
  475. // FV
  476. // FVSCHEDULE
  477. // GAMMA
  478. // GAMMA.DIST
  479. // GAMMADIST
  480. // GAMMA.INV
  481. // GAMMAINV
  482. // GAMMALN
  483. // GAMMALN.PRECISE
  484. // GAUSS
  485. // GCD
  486. // GEOMEAN
  487. // GESTEP
  488. // GROWTH
  489. // HARMEAN
  490. // HEX2BIN
  491. // HEX2DEC
  492. // HEX2OCT
  493. // HLOOKUP
  494. // HOUR
  495. // HYPERLINK
  496. // HYPGEOM.DIST
  497. // HYPGEOMDIST
  498. // IF
  499. // IFERROR
  500. // IFNA
  501. // IFS
  502. // IMABS
  503. // IMAGINARY
  504. // IMARGUMENT
  505. // IMCONJUGATE
  506. // IMCOS
  507. // IMCOSH
  508. // IMCOT
  509. // IMCSC
  510. // IMCSCH
  511. // IMDIV
  512. // IMEXP
  513. // IMLN
  514. // IMLOG10
  515. // IMLOG2
  516. // IMPOWER
  517. // IMPRODUCT
  518. // IMREAL
  519. // IMSEC
  520. // IMSECH
  521. // IMSIN
  522. // IMSINH
  523. // IMSQRT
  524. // IMSUB
  525. // IMSUM
  526. // IMTAN
  527. // INDEX
  528. // INDIRECT
  529. // INT
  530. // INTRATE
  531. // IPMT
  532. // IRR
  533. // ISBLANK
  534. // ISERR
  535. // ISERROR
  536. // ISEVEN
  537. // ISFORMULA
  538. // ISLOGICAL
  539. // ISNA
  540. // ISNONTEXT
  541. // ISNUMBER
  542. // ISODD
  543. // ISREF
  544. // ISTEXT
  545. // ISO.CEILING
  546. // ISOWEEKNUM
  547. // ISPMT
  548. // KURT
  549. // LARGE
  550. // LCM
  551. // LEFT
  552. // LEFTB
  553. // LEN
  554. // LENB
  555. // LN
  556. // LOG
  557. // LOG10
  558. // LOGINV
  559. // LOGNORM.DIST
  560. // LOGNORMDIST
  561. // LOGNORM.INV
  562. // LOOKUP
  563. // LOWER
  564. // MATCH
  565. // MAX
  566. // MAXA
  567. // MAXIFS
  568. // MDETERM
  569. // MDURATION
  570. // MEDIAN
  571. // MID
  572. // MIDB
  573. // MIN
  574. // MINA
  575. // MINIFS
  576. // MINUTE
  577. // MINVERSE
  578. // MIRR
  579. // MMULT
  580. // MOD
  581. // MODE
  582. // MODE.MULT
  583. // MODE.SNGL
  584. // MONTH
  585. // MROUND
  586. // MULTINOMIAL
  587. // MUNIT
  588. // N
  589. // NA
  590. // NEGBINOM.DIST
  591. // NEGBINOMDIST
  592. // NETWORKDAYS
  593. // NETWORKDAYS.INTL
  594. // NOMINAL
  595. // NORM.DIST
  596. // NORMDIST
  597. // NORM.INV
  598. // NORMINV
  599. // NORM.S.DIST
  600. // NORMSDIST
  601. // NORM.S.INV
  602. // NORMSINV
  603. // NOT
  604. // NOW
  605. // NPER
  606. // NPV
  607. // OCT2BIN
  608. // OCT2DEC
  609. // OCT2HEX
  610. // ODD
  611. // ODDFPRICE
  612. // OR
  613. // PDURATION
  614. // PEARSON
  615. // PERCENTILE.EXC
  616. // PERCENTILE.INC
  617. // PERCENTILE
  618. // PERCENTRANK.EXC
  619. // PERCENTRANK.INC
  620. // PERCENTRANK
  621. // PERMUT
  622. // PERMUTATIONA
  623. // PHI
  624. // PI
  625. // PMT
  626. // POISSON.DIST
  627. // POISSON
  628. // POWER
  629. // PPMT
  630. // PRICE
  631. // PRICEDISC
  632. // PRICEMAT
  633. // PRODUCT
  634. // PROPER
  635. // PV
  636. // QUARTILE
  637. // QUARTILE.EXC
  638. // QUARTILE.INC
  639. // QUOTIENT
  640. // RADIANS
  641. // RAND
  642. // RANDBETWEEN
  643. // RANK
  644. // RANK.EQ
  645. // RATE
  646. // RECEIVED
  647. // REPLACE
  648. // REPLACEB
  649. // REPT
  650. // RIGHT
  651. // RIGHTB
  652. // ROMAN
  653. // ROUND
  654. // ROUNDDOWN
  655. // ROUNDUP
  656. // ROW
  657. // ROWS
  658. // RRI
  659. // RSQ
  660. // SEC
  661. // SECH
  662. // SECOND
  663. // SERIESSUM
  664. // SHEET
  665. // SHEETS
  666. // SIGN
  667. // SIN
  668. // SINH
  669. // SKEW
  670. // SKEW.P
  671. // SLN
  672. // SLOPE
  673. // SMALL
  674. // SQRT
  675. // SQRTPI
  676. // STANDARDIZE
  677. // STDEV
  678. // STDEV.P
  679. // STDEV.S
  680. // STDEVA
  681. // STDEVP
  682. // STDEVPA
  683. // STEYX
  684. // SUBSTITUTE
  685. // SUBTOTAL
  686. // SUM
  687. // SUMIF
  688. // SUMIFS
  689. // SUMPRODUCT
  690. // SUMSQ
  691. // SUMX2MY2
  692. // SUMX2PY2
  693. // SUMXMY2
  694. // SWITCH
  695. // SYD
  696. // T
  697. // TAN
  698. // TANH
  699. // TBILLEQ
  700. // TBILLPRICE
  701. // TBILLYIELD
  702. // T.DIST
  703. // T.DIST.2T
  704. // T.DIST.RT
  705. // TDIST
  706. // TEXTJOIN
  707. // TIME
  708. // TIMEVALUE
  709. // T.INV
  710. // T.INV.2T
  711. // TINV
  712. // TODAY
  713. // TRANSPOSE
  714. // TREND
  715. // TRIM
  716. // TRIMMEAN
  717. // TRUE
  718. // TRUNC
  719. // T.TEST
  720. // TTEST
  721. // TYPE
  722. // UNICHAR
  723. // UNICODE
  724. // UPPER
  725. // VALUE
  726. // VAR
  727. // VAR.P
  728. // VAR.S
  729. // VARA
  730. // VARP
  731. // VARPA
  732. // VDB
  733. // VLOOKUP
  734. // WEEKDAY
  735. // WEEKNUM
  736. // WEIBULL
  737. // WEIBULL.DIST
  738. // WORKDAY
  739. // WORKDAY.INTL
  740. // XIRR
  741. // XLOOKUP
  742. // XNPV
  743. // XOR
  744. // YEAR
  745. // YEARFRAC
  746. // YIELD
  747. // YIELDDISC
  748. // YIELDMAT
  749. // Z.TEST
  750. // ZTEST
  751. func (f *File) CalcCellValue(sheet, cell string, opts ...Options) (result string, err error) {
  752. var (
  753. rawCellValue = getOptions(opts...).RawCellValue
  754. styleIdx int
  755. token formulaArg
  756. )
  757. if token, err = f.calcCellValue(&calcContext{
  758. entry: fmt.Sprintf("%s!%s", sheet, cell),
  759. maxCalcIterations: getOptions(opts...).MaxCalcIterations,
  760. iterations: make(map[string]uint),
  761. iterationsCache: make(map[string]formulaArg),
  762. }, sheet, cell); err != nil {
  763. result = token.String
  764. return
  765. }
  766. if !rawCellValue {
  767. styleIdx, _ = f.GetCellStyle(sheet, cell)
  768. }
  769. result = token.Value()
  770. if isNum, precision, decimal := isNumeric(result); isNum {
  771. if precision > 15 {
  772. result, err = f.formattedValue(styleIdx, strings.ToUpper(strconv.FormatFloat(decimal, 'G', 15, 64)), rawCellValue)
  773. return
  774. }
  775. if !strings.HasPrefix(result, "0") {
  776. result, err = f.formattedValue(styleIdx, strings.ToUpper(strconv.FormatFloat(decimal, 'f', -1, 64)), rawCellValue)
  777. }
  778. }
  779. return
  780. }
  781. // calcCellValue calculate cell value by given context, worksheet name and cell
  782. // reference.
  783. func (f *File) calcCellValue(ctx *calcContext, sheet, cell string) (result formulaArg, err error) {
  784. var formula string
  785. if formula, err = f.GetCellFormula(sheet, cell); err != nil {
  786. return
  787. }
  788. ps := efp.ExcelParser()
  789. tokens := ps.Parse(formula)
  790. if tokens == nil {
  791. return
  792. }
  793. result, err = f.evalInfixExp(ctx, sheet, cell, tokens)
  794. return
  795. }
  796. // getPriority calculate arithmetic operator priority.
  797. func getPriority(token efp.Token) (pri int) {
  798. pri = tokenPriority[token.TValue]
  799. if token.TValue == "-" && token.TType == efp.TokenTypeOperatorPrefix {
  800. pri = 6
  801. }
  802. if isBeginParenthesesToken(token) { // (
  803. pri = 0
  804. }
  805. return
  806. }
  807. // newNumberFormulaArg constructs a number formula argument.
  808. func newNumberFormulaArg(n float64) formulaArg {
  809. if math.IsNaN(n) {
  810. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  811. }
  812. return formulaArg{Type: ArgNumber, Number: n}
  813. }
  814. // newStringFormulaArg constructs a string formula argument.
  815. func newStringFormulaArg(s string) formulaArg {
  816. return formulaArg{Type: ArgString, String: s}
  817. }
  818. // newMatrixFormulaArg constructs a matrix formula argument.
  819. func newMatrixFormulaArg(m [][]formulaArg) formulaArg {
  820. return formulaArg{Type: ArgMatrix, Matrix: m}
  821. }
  822. // newListFormulaArg create a list formula argument.
  823. func newListFormulaArg(l []formulaArg) formulaArg {
  824. return formulaArg{Type: ArgList, List: l}
  825. }
  826. // newBoolFormulaArg constructs a boolean formula argument.
  827. func newBoolFormulaArg(b bool) formulaArg {
  828. var n float64
  829. if b {
  830. n = 1
  831. }
  832. return formulaArg{Type: ArgNumber, Number: n, Boolean: true}
  833. }
  834. // newErrorFormulaArg create an error formula argument of a given type with a
  835. // specified error message.
  836. func newErrorFormulaArg(formulaError, msg string) formulaArg {
  837. return formulaArg{Type: ArgError, String: formulaError, Error: msg}
  838. }
  839. // newEmptyFormulaArg create an empty formula argument.
  840. func newEmptyFormulaArg() formulaArg {
  841. return formulaArg{Type: ArgEmpty}
  842. }
  843. // evalInfixExp evaluate syntax analysis by given infix expression after
  844. // lexical analysis. Evaluate an infix expression containing formulas by
  845. // stacks:
  846. //
  847. // opd - Operand
  848. // opt - Operator
  849. // opf - Operation formula
  850. // opfd - Operand of the operation formula
  851. // opft - Operator of the operation formula
  852. // args - Arguments list of the operation formula
  853. //
  854. // TODO: handle subtypes: Nothing, Text, Logical, Error, Concatenation, Intersection, Union
  855. func (f *File) evalInfixExp(ctx *calcContext, sheet, cell string, tokens []efp.Token) (formulaArg, error) {
  856. var err error
  857. opdStack, optStack, opfStack, opfdStack, opftStack, argsStack := NewStack(), NewStack(), NewStack(), NewStack(), NewStack(), NewStack()
  858. var inArray, inArrayRow bool
  859. for i := 0; i < len(tokens); i++ {
  860. token := tokens[i]
  861. // out of function stack
  862. if opfStack.Len() == 0 {
  863. if err = f.parseToken(ctx, sheet, token, opdStack, optStack); err != nil {
  864. return newEmptyFormulaArg(), err
  865. }
  866. }
  867. // function start
  868. if isFunctionStartToken(token) {
  869. if token.TValue == "ARRAY" {
  870. inArray = true
  871. continue
  872. }
  873. if token.TValue == "ARRAYROW" {
  874. inArrayRow = true
  875. continue
  876. }
  877. opfStack.Push(token)
  878. argsStack.Push(list.New().Init())
  879. opftStack.Push(token) // to know which operators belong to a function use the function as a separator
  880. continue
  881. }
  882. // in function stack, walk 2 token at once
  883. if opfStack.Len() > 0 {
  884. var nextToken efp.Token
  885. if i+1 < len(tokens) {
  886. nextToken = tokens[i+1]
  887. }
  888. // current token is args or range, skip next token, order required: parse reference first
  889. if token.TSubType == efp.TokenSubTypeRange {
  890. if opftStack.Peek().(efp.Token) != opfStack.Peek().(efp.Token) {
  891. refTo := f.getDefinedNameRefTo(token.TValue, sheet)
  892. if refTo != "" {
  893. token.TValue = refTo
  894. }
  895. // parse reference: must reference at here
  896. result, err := f.parseReference(ctx, sheet, token.TValue)
  897. if err != nil {
  898. return result, err
  899. }
  900. if result.Type == ArgError {
  901. return result, errors.New(result.Error)
  902. }
  903. opfdStack.Push(result)
  904. continue
  905. }
  906. if nextToken.TType == efp.TokenTypeArgument || nextToken.TType == efp.TokenTypeFunction {
  907. // parse reference: reference or range at here
  908. refTo := f.getDefinedNameRefTo(token.TValue, sheet)
  909. if refTo != "" {
  910. token.TValue = refTo
  911. }
  912. result, err := f.parseReference(ctx, sheet, token.TValue)
  913. if err != nil {
  914. return newEmptyFormulaArg(), err
  915. }
  916. if result.Type == ArgUnknown {
  917. return newEmptyFormulaArg(), errors.New(formulaErrorVALUE)
  918. }
  919. // when current token is range, next token is argument and opfdStack not empty,
  920. // should push value to opfdStack and continue
  921. if nextToken.TType == efp.TokenTypeArgument && !opfdStack.Empty() {
  922. opfdStack.Push(result)
  923. continue
  924. }
  925. argsStack.Peek().(*list.List).PushBack(result)
  926. continue
  927. }
  928. }
  929. if isEndParenthesesToken(token) && isBeginParenthesesToken(opftStack.Peek().(efp.Token)) {
  930. if arg := argsStack.Peek().(*list.List).Back(); arg != nil {
  931. opfdStack.Push(arg.Value.(formulaArg))
  932. argsStack.Peek().(*list.List).Remove(arg)
  933. }
  934. }
  935. // check current token is opft
  936. if err = f.parseToken(ctx, sheet, token, opfdStack, opftStack); err != nil {
  937. return newEmptyFormulaArg(), err
  938. }
  939. // current token is arg
  940. if token.TType == efp.TokenTypeArgument {
  941. for opftStack.Peek().(efp.Token) != opfStack.Peek().(efp.Token) {
  942. // calculate trigger
  943. topOpt := opftStack.Peek().(efp.Token)
  944. if err := calculate(opfdStack, topOpt); err != nil {
  945. argsStack.Peek().(*list.List).PushFront(newErrorFormulaArg(formulaErrorVALUE, err.Error()))
  946. }
  947. opftStack.Pop()
  948. }
  949. if !opfdStack.Empty() {
  950. argsStack.Peek().(*list.List).PushBack(opfdStack.Pop().(formulaArg))
  951. }
  952. continue
  953. }
  954. if inArrayRow && isOperand(token) {
  955. continue
  956. }
  957. if inArrayRow && isFunctionStopToken(token) {
  958. inArrayRow = false
  959. continue
  960. }
  961. if inArray && isFunctionStopToken(token) {
  962. argsStack.Peek().(*list.List).PushBack(opfdStack.Pop())
  963. inArray = false
  964. continue
  965. }
  966. if errArg := f.evalInfixExpFunc(ctx, sheet, cell, token, nextToken, opfStack, opdStack, opftStack, opfdStack, argsStack); errArg.Type == ArgError {
  967. return errArg, errors.New(errArg.Error)
  968. }
  969. }
  970. }
  971. for optStack.Len() != 0 {
  972. topOpt := optStack.Peek().(efp.Token)
  973. if err = calculate(opdStack, topOpt); err != nil {
  974. return newEmptyFormulaArg(), err
  975. }
  976. optStack.Pop()
  977. }
  978. if opdStack.Len() == 0 {
  979. return newEmptyFormulaArg(), ErrInvalidFormula
  980. }
  981. return opdStack.Peek().(formulaArg), err
  982. }
  983. // evalInfixExpFunc evaluate formula function in the infix expression.
  984. func (f *File) evalInfixExpFunc(ctx *calcContext, sheet, cell string, token, nextToken efp.Token, opfStack, opdStack, opftStack, opfdStack, argsStack *Stack) formulaArg {
  985. if !isFunctionStopToken(token) {
  986. return newEmptyFormulaArg()
  987. }
  988. prepareEvalInfixExp(opfStack, opftStack, opfdStack, argsStack)
  989. // call formula function to evaluate
  990. arg := callFuncByName(&formulaFuncs{f: f, sheet: sheet, cell: cell, ctx: ctx}, strings.NewReplacer(
  991. "_xlfn.", "", ".", "dot").Replace(opfStack.Peek().(efp.Token).TValue),
  992. []reflect.Value{reflect.ValueOf(argsStack.Peek().(*list.List))})
  993. if arg.Type == ArgError && opfStack.Len() == 1 {
  994. return arg
  995. }
  996. argsStack.Pop()
  997. opftStack.Pop() // remove current function separator
  998. opfStack.Pop()
  999. if opfStack.Len() > 0 { // still in function stack
  1000. if nextToken.TType == efp.TokenTypeOperatorInfix || (opftStack.Len() > 1 && opfdStack.Len() > 0) {
  1001. // mathematics calculate in formula function
  1002. opfdStack.Push(arg)
  1003. } else {
  1004. argsStack.Peek().(*list.List).PushBack(arg)
  1005. }
  1006. } else {
  1007. val := arg.Value()
  1008. if arg.Type == ArgMatrix && len(arg.Matrix) > 0 && len(arg.Matrix[0]) > 0 {
  1009. val = arg.Matrix[0][0].Value()
  1010. }
  1011. opdStack.Push(newStringFormulaArg(val))
  1012. }
  1013. return newEmptyFormulaArg()
  1014. }
  1015. // prepareEvalInfixExp check the token and stack state for formula function
  1016. // evaluate.
  1017. func prepareEvalInfixExp(opfStack, opftStack, opfdStack, argsStack *Stack) {
  1018. // current token is function stop
  1019. for opftStack.Peek().(efp.Token) != opfStack.Peek().(efp.Token) {
  1020. // calculate trigger
  1021. topOpt := opftStack.Peek().(efp.Token)
  1022. if err := calculate(opfdStack, topOpt); err != nil {
  1023. argsStack.Peek().(*list.List).PushBack(newErrorFormulaArg(err.Error(), err.Error()))
  1024. opftStack.Pop()
  1025. continue
  1026. }
  1027. opftStack.Pop()
  1028. }
  1029. argument := true
  1030. if opftStack.Len() > 2 && opfdStack.Len() == 1 {
  1031. topOpt := opftStack.Pop()
  1032. if opftStack.Peek().(efp.Token).TType == efp.TokenTypeOperatorInfix {
  1033. argument = false
  1034. }
  1035. opftStack.Push(topOpt)
  1036. }
  1037. // push opfd to args
  1038. if argument && opfdStack.Len() > 0 {
  1039. argsStack.Peek().(*list.List).PushBack(opfdStack.Pop().(formulaArg))
  1040. }
  1041. }
  1042. // calcPow evaluate exponentiation arithmetic operations.
  1043. func calcPow(rOpd, lOpd formulaArg, opdStack *Stack) error {
  1044. lOpdVal := lOpd.ToNumber()
  1045. if lOpdVal.Type != ArgNumber {
  1046. return errors.New(lOpdVal.Value())
  1047. }
  1048. rOpdVal := rOpd.ToNumber()
  1049. if rOpdVal.Type != ArgNumber {
  1050. return errors.New(rOpdVal.Value())
  1051. }
  1052. opdStack.Push(newNumberFormulaArg(math.Pow(lOpdVal.Number, rOpdVal.Number)))
  1053. return nil
  1054. }
  1055. // calcEq evaluate equal arithmetic operations.
  1056. func calcEq(rOpd, lOpd formulaArg, opdStack *Stack) error {
  1057. opdStack.Push(newBoolFormulaArg(rOpd.Value() == lOpd.Value()))
  1058. return nil
  1059. }
  1060. // calcNEq evaluate not equal arithmetic operations.
  1061. func calcNEq(rOpd, lOpd formulaArg, opdStack *Stack) error {
  1062. opdStack.Push(newBoolFormulaArg(rOpd.Value() != lOpd.Value()))
  1063. return nil
  1064. }
  1065. // calcL evaluate less than arithmetic operations.
  1066. func calcL(rOpd, lOpd formulaArg, opdStack *Stack) error {
  1067. if rOpd.Type == ArgNumber && lOpd.Type == ArgNumber {
  1068. opdStack.Push(newBoolFormulaArg(lOpd.Number < rOpd.Number))
  1069. }
  1070. if rOpd.Type == ArgString && lOpd.Type == ArgString {
  1071. opdStack.Push(newBoolFormulaArg(strings.Compare(lOpd.Value(), rOpd.Value()) == -1))
  1072. }
  1073. if rOpd.Type == ArgNumber && lOpd.Type == ArgString {
  1074. opdStack.Push(newBoolFormulaArg(false))
  1075. }
  1076. if rOpd.Type == ArgString && lOpd.Type == ArgNumber {
  1077. opdStack.Push(newBoolFormulaArg(true))
  1078. }
  1079. return nil
  1080. }
  1081. // calcLe evaluate less than or equal arithmetic operations.
  1082. func calcLe(rOpd, lOpd formulaArg, opdStack *Stack) error {
  1083. if rOpd.Type == ArgNumber && lOpd.Type == ArgNumber {
  1084. opdStack.Push(newBoolFormulaArg(lOpd.Number <= rOpd.Number))
  1085. }
  1086. if rOpd.Type == ArgString && lOpd.Type == ArgString {
  1087. opdStack.Push(newBoolFormulaArg(strings.Compare(lOpd.Value(), rOpd.Value()) != 1))
  1088. }
  1089. if rOpd.Type == ArgNumber && lOpd.Type == ArgString {
  1090. opdStack.Push(newBoolFormulaArg(false))
  1091. }
  1092. if rOpd.Type == ArgString && lOpd.Type == ArgNumber {
  1093. opdStack.Push(newBoolFormulaArg(true))
  1094. }
  1095. return nil
  1096. }
  1097. // calcG evaluate greater than arithmetic operations.
  1098. func calcG(rOpd, lOpd formulaArg, opdStack *Stack) error {
  1099. if rOpd.Type == ArgNumber && lOpd.Type == ArgNumber {
  1100. opdStack.Push(newBoolFormulaArg(lOpd.Number > rOpd.Number))
  1101. }
  1102. if rOpd.Type == ArgString && lOpd.Type == ArgString {
  1103. opdStack.Push(newBoolFormulaArg(strings.Compare(lOpd.Value(), rOpd.Value()) == 1))
  1104. }
  1105. if rOpd.Type == ArgNumber && lOpd.Type == ArgString {
  1106. opdStack.Push(newBoolFormulaArg(true))
  1107. }
  1108. if rOpd.Type == ArgString && lOpd.Type == ArgNumber {
  1109. opdStack.Push(newBoolFormulaArg(false))
  1110. }
  1111. return nil
  1112. }
  1113. // calcGe evaluate greater than or equal arithmetic operations.
  1114. func calcGe(rOpd, lOpd formulaArg, opdStack *Stack) error {
  1115. if rOpd.Type == ArgNumber && lOpd.Type == ArgNumber {
  1116. opdStack.Push(newBoolFormulaArg(lOpd.Number >= rOpd.Number))
  1117. }
  1118. if rOpd.Type == ArgString && lOpd.Type == ArgString {
  1119. opdStack.Push(newBoolFormulaArg(strings.Compare(lOpd.Value(), rOpd.Value()) != -1))
  1120. }
  1121. if rOpd.Type == ArgNumber && lOpd.Type == ArgString {
  1122. opdStack.Push(newBoolFormulaArg(true))
  1123. }
  1124. if rOpd.Type == ArgString && lOpd.Type == ArgNumber {
  1125. opdStack.Push(newBoolFormulaArg(false))
  1126. }
  1127. return nil
  1128. }
  1129. // calcSplice evaluate splice '&' operations.
  1130. func calcSplice(rOpd, lOpd formulaArg, opdStack *Stack) error {
  1131. opdStack.Push(newStringFormulaArg(lOpd.Value() + rOpd.Value()))
  1132. return nil
  1133. }
  1134. // calcAdd evaluate addition arithmetic operations.
  1135. func calcAdd(rOpd, lOpd formulaArg, opdStack *Stack) error {
  1136. lOpdVal := lOpd.ToNumber()
  1137. if lOpdVal.Type != ArgNumber {
  1138. return errors.New(lOpdVal.Value())
  1139. }
  1140. rOpdVal := rOpd.ToNumber()
  1141. if rOpdVal.Type != ArgNumber {
  1142. return errors.New(rOpdVal.Value())
  1143. }
  1144. opdStack.Push(newNumberFormulaArg(lOpdVal.Number + rOpdVal.Number))
  1145. return nil
  1146. }
  1147. // calcSubtract evaluate subtraction arithmetic operations.
  1148. func calcSubtract(rOpd, lOpd formulaArg, opdStack *Stack) error {
  1149. lOpdVal := lOpd.ToNumber()
  1150. if lOpdVal.Type != ArgNumber {
  1151. return errors.New(lOpdVal.Value())
  1152. }
  1153. rOpdVal := rOpd.ToNumber()
  1154. if rOpdVal.Type != ArgNumber {
  1155. return errors.New(rOpdVal.Value())
  1156. }
  1157. opdStack.Push(newNumberFormulaArg(lOpdVal.Number - rOpdVal.Number))
  1158. return nil
  1159. }
  1160. // calcMultiply evaluate multiplication arithmetic operations.
  1161. func calcMultiply(rOpd, lOpd formulaArg, opdStack *Stack) error {
  1162. lOpdVal := lOpd.ToNumber()
  1163. if lOpdVal.Type != ArgNumber {
  1164. return errors.New(lOpdVal.Value())
  1165. }
  1166. rOpdVal := rOpd.ToNumber()
  1167. if rOpdVal.Type != ArgNumber {
  1168. return errors.New(rOpdVal.Value())
  1169. }
  1170. opdStack.Push(newNumberFormulaArg(lOpdVal.Number * rOpdVal.Number))
  1171. return nil
  1172. }
  1173. // calcDiv evaluate division arithmetic operations.
  1174. func calcDiv(rOpd, lOpd formulaArg, opdStack *Stack) error {
  1175. lOpdVal := lOpd.ToNumber()
  1176. if lOpdVal.Type != ArgNumber {
  1177. return errors.New(lOpdVal.Value())
  1178. }
  1179. rOpdVal := rOpd.ToNumber()
  1180. if rOpdVal.Type != ArgNumber {
  1181. return errors.New(rOpdVal.Value())
  1182. }
  1183. if rOpdVal.Number == 0 {
  1184. return errors.New(formulaErrorDIV)
  1185. }
  1186. opdStack.Push(newNumberFormulaArg(lOpdVal.Number / rOpdVal.Number))
  1187. return nil
  1188. }
  1189. // calculate evaluate basic arithmetic operations.
  1190. func calculate(opdStack *Stack, opt efp.Token) error {
  1191. if opt.TValue == "-" && opt.TType == efp.TokenTypeOperatorPrefix {
  1192. if opdStack.Len() < 1 {
  1193. return ErrInvalidFormula
  1194. }
  1195. opd := opdStack.Pop().(formulaArg)
  1196. opdStack.Push(newNumberFormulaArg(0 - opd.ToNumber().Number))
  1197. }
  1198. if opt.TValue == "-" && opt.TType == efp.TokenTypeOperatorInfix {
  1199. if opdStack.Len() < 2 {
  1200. return ErrInvalidFormula
  1201. }
  1202. rOpd := opdStack.Pop().(formulaArg)
  1203. lOpd := opdStack.Pop().(formulaArg)
  1204. if err := calcSubtract(rOpd, lOpd, opdStack); err != nil {
  1205. return err
  1206. }
  1207. }
  1208. tokenCalcFunc := map[string]func(rOpd, lOpd formulaArg, opdStack *Stack) error{
  1209. "^": calcPow,
  1210. "*": calcMultiply,
  1211. "/": calcDiv,
  1212. "+": calcAdd,
  1213. "=": calcEq,
  1214. "<>": calcNEq,
  1215. "<": calcL,
  1216. "<=": calcLe,
  1217. ">": calcG,
  1218. ">=": calcGe,
  1219. "&": calcSplice,
  1220. }
  1221. fn, ok := tokenCalcFunc[opt.TValue]
  1222. if ok {
  1223. if opdStack.Len() < 2 {
  1224. return ErrInvalidFormula
  1225. }
  1226. rOpd := opdStack.Pop().(formulaArg)
  1227. lOpd := opdStack.Pop().(formulaArg)
  1228. if rOpd.Type == ArgError {
  1229. return errors.New(rOpd.Value())
  1230. }
  1231. if lOpd.Type == ArgError {
  1232. return errors.New(lOpd.Value())
  1233. }
  1234. if err := fn(rOpd, lOpd, opdStack); err != nil {
  1235. return err
  1236. }
  1237. }
  1238. return nil
  1239. }
  1240. // parseOperatorPrefixToken parse operator prefix token.
  1241. func (f *File) parseOperatorPrefixToken(optStack, opdStack *Stack, token efp.Token) (err error) {
  1242. if optStack.Len() == 0 {
  1243. optStack.Push(token)
  1244. return
  1245. }
  1246. tokenPriority := getPriority(token)
  1247. topOpt := optStack.Peek().(efp.Token)
  1248. topOptPriority := getPriority(topOpt)
  1249. if tokenPriority > topOptPriority {
  1250. optStack.Push(token)
  1251. return
  1252. }
  1253. for tokenPriority <= topOptPriority {
  1254. optStack.Pop()
  1255. if err = calculate(opdStack, topOpt); err != nil {
  1256. return
  1257. }
  1258. if optStack.Len() > 0 {
  1259. topOpt = optStack.Peek().(efp.Token)
  1260. topOptPriority = getPriority(topOpt)
  1261. continue
  1262. }
  1263. break
  1264. }
  1265. optStack.Push(token)
  1266. return
  1267. }
  1268. // isFunctionStartToken determine if the token is function start.
  1269. func isFunctionStartToken(token efp.Token) bool {
  1270. return token.TType == efp.TokenTypeFunction && token.TSubType == efp.TokenSubTypeStart
  1271. }
  1272. // isFunctionStopToken determine if the token is function stop.
  1273. func isFunctionStopToken(token efp.Token) bool {
  1274. return token.TType == efp.TokenTypeFunction && token.TSubType == efp.TokenSubTypeStop
  1275. }
  1276. // isBeginParenthesesToken determine if the token is begin parentheses: (.
  1277. func isBeginParenthesesToken(token efp.Token) bool {
  1278. return token.TType == efp.TokenTypeSubexpression && token.TSubType == efp.TokenSubTypeStart
  1279. }
  1280. // isEndParenthesesToken determine if the token is end parentheses: ).
  1281. func isEndParenthesesToken(token efp.Token) bool {
  1282. return token.TType == efp.TokenTypeSubexpression && token.TSubType == efp.TokenSubTypeStop
  1283. }
  1284. // isOperatorPrefixToken determine if the token is parse operator prefix
  1285. // token.
  1286. func isOperatorPrefixToken(token efp.Token) bool {
  1287. _, ok := tokenPriority[token.TValue]
  1288. return (token.TValue == "-" && token.TType == efp.TokenTypeOperatorPrefix) || (ok && token.TType == efp.TokenTypeOperatorInfix)
  1289. }
  1290. // isOperand determine if the token is parse operand.
  1291. func isOperand(token efp.Token) bool {
  1292. return token.TType == efp.TokenTypeOperand && (token.TSubType == efp.TokenSubTypeNumber || token.TSubType == efp.TokenSubTypeText || token.TSubType == efp.TokenSubTypeLogical)
  1293. }
  1294. // tokenToFormulaArg create a formula argument by given token.
  1295. func tokenToFormulaArg(token efp.Token) formulaArg {
  1296. switch token.TSubType {
  1297. case efp.TokenSubTypeLogical:
  1298. return newBoolFormulaArg(strings.EqualFold(token.TValue, "TRUE"))
  1299. case efp.TokenSubTypeNumber:
  1300. num, _ := strconv.ParseFloat(token.TValue, 64)
  1301. return newNumberFormulaArg(num)
  1302. default:
  1303. return newStringFormulaArg(token.TValue)
  1304. }
  1305. }
  1306. // formulaArgToToken create a token by given formula argument.
  1307. func formulaArgToToken(arg formulaArg) efp.Token {
  1308. switch arg.Type {
  1309. case ArgNumber:
  1310. if arg.Boolean {
  1311. return efp.Token{TValue: arg.Value(), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeLogical}
  1312. }
  1313. return efp.Token{TValue: arg.Value(), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeNumber}
  1314. default:
  1315. return efp.Token{TValue: arg.Value(), TType: efp.TokenTypeOperand, TSubType: efp.TokenSubTypeText}
  1316. }
  1317. }
  1318. // parseToken parse basic arithmetic operator priority and evaluate based on
  1319. // operators and operands.
  1320. func (f *File) parseToken(ctx *calcContext, sheet string, token efp.Token, opdStack, optStack *Stack) error {
  1321. // parse reference: must reference at here
  1322. if token.TSubType == efp.TokenSubTypeRange {
  1323. refTo := f.getDefinedNameRefTo(token.TValue, sheet)
  1324. if refTo != "" {
  1325. token.TValue = refTo
  1326. }
  1327. result, err := f.parseReference(ctx, sheet, token.TValue)
  1328. if err != nil {
  1329. return errors.New(formulaErrorNAME)
  1330. }
  1331. token = formulaArgToToken(result)
  1332. }
  1333. if isOperatorPrefixToken(token) {
  1334. if err := f.parseOperatorPrefixToken(optStack, opdStack, token); err != nil {
  1335. return err
  1336. }
  1337. }
  1338. if isBeginParenthesesToken(token) { // (
  1339. optStack.Push(token)
  1340. }
  1341. if isEndParenthesesToken(token) { // )
  1342. for !isBeginParenthesesToken(optStack.Peek().(efp.Token)) { // != (
  1343. topOpt := optStack.Peek().(efp.Token)
  1344. if err := calculate(opdStack, topOpt); err != nil {
  1345. return err
  1346. }
  1347. optStack.Pop()
  1348. }
  1349. optStack.Pop()
  1350. }
  1351. if token.TType == efp.TokenTypeOperatorPostfix && !opdStack.Empty() {
  1352. topOpd := opdStack.Pop().(formulaArg)
  1353. opdStack.Push(newNumberFormulaArg(topOpd.Number / 100))
  1354. }
  1355. // opd
  1356. if isOperand(token) {
  1357. opdStack.Push(tokenToFormulaArg(token))
  1358. }
  1359. return nil
  1360. }
  1361. // parseReference parse reference and extract values by given reference
  1362. // characters and default sheet name.
  1363. func (f *File) parseReference(ctx *calcContext, sheet, reference string) (arg formulaArg, err error) {
  1364. reference = strings.ReplaceAll(reference, "$", "")
  1365. refs, cellRanges, cellRefs := list.New(), list.New(), list.New()
  1366. for _, ref := range strings.Split(reference, ":") {
  1367. tokens := strings.Split(ref, "!")
  1368. cr := cellRef{}
  1369. if len(tokens) == 2 { // have a worksheet name
  1370. cr.Sheet = tokens[0]
  1371. // cast to cell reference
  1372. if cr.Col, cr.Row, err = CellNameToCoordinates(tokens[1]); err != nil {
  1373. // cast to column
  1374. if cr.Col, err = ColumnNameToNumber(tokens[1]); err != nil {
  1375. // cast to row
  1376. if cr.Row, err = strconv.Atoi(tokens[1]); err != nil {
  1377. err = newInvalidColumnNameError(tokens[1])
  1378. return
  1379. }
  1380. cr.Col = MaxColumns
  1381. }
  1382. }
  1383. if refs.Len() > 0 {
  1384. e := refs.Back()
  1385. cellRefs.PushBack(e.Value.(cellRef))
  1386. refs.Remove(e)
  1387. }
  1388. refs.PushBack(cr)
  1389. continue
  1390. }
  1391. // cast to cell reference
  1392. if cr.Col, cr.Row, err = CellNameToCoordinates(tokens[0]); err != nil {
  1393. // cast to column
  1394. if cr.Col, err = ColumnNameToNumber(tokens[0]); err != nil {
  1395. // cast to row
  1396. if cr.Row, err = strconv.Atoi(tokens[0]); err != nil {
  1397. err = newInvalidColumnNameError(tokens[0])
  1398. return
  1399. }
  1400. cr.Col = MaxColumns
  1401. }
  1402. cellRanges.PushBack(cellRange{
  1403. From: cellRef{Sheet: sheet, Col: cr.Col, Row: 1},
  1404. To: cellRef{Sheet: sheet, Col: cr.Col, Row: TotalRows},
  1405. })
  1406. cellRefs.Init()
  1407. arg, err = f.rangeResolver(ctx, cellRefs, cellRanges)
  1408. return
  1409. }
  1410. e := refs.Back()
  1411. if e == nil {
  1412. cr.Sheet = sheet
  1413. refs.PushBack(cr)
  1414. continue
  1415. }
  1416. cellRanges.PushBack(cellRange{
  1417. From: e.Value.(cellRef),
  1418. To: cr,
  1419. })
  1420. refs.Remove(e)
  1421. }
  1422. if refs.Len() > 0 {
  1423. e := refs.Back()
  1424. cellRefs.PushBack(e.Value.(cellRef))
  1425. refs.Remove(e)
  1426. }
  1427. arg, err = f.rangeResolver(ctx, cellRefs, cellRanges)
  1428. return
  1429. }
  1430. // prepareValueRange prepare value range.
  1431. func prepareValueRange(cr cellRange, valueRange []int) {
  1432. if cr.From.Row < valueRange[0] || valueRange[0] == 0 {
  1433. valueRange[0] = cr.From.Row
  1434. }
  1435. if cr.From.Col < valueRange[2] || valueRange[2] == 0 {
  1436. valueRange[2] = cr.From.Col
  1437. }
  1438. if cr.To.Row > valueRange[1] || valueRange[1] == 0 {
  1439. valueRange[1] = cr.To.Row
  1440. }
  1441. if cr.To.Col > valueRange[3] || valueRange[3] == 0 {
  1442. valueRange[3] = cr.To.Col
  1443. }
  1444. }
  1445. // prepareValueRef prepare value reference.
  1446. func prepareValueRef(cr cellRef, valueRange []int) {
  1447. if cr.Row < valueRange[0] || valueRange[0] == 0 {
  1448. valueRange[0] = cr.Row
  1449. }
  1450. if cr.Col < valueRange[2] || valueRange[2] == 0 {
  1451. valueRange[2] = cr.Col
  1452. }
  1453. if cr.Row > valueRange[1] || valueRange[1] == 0 {
  1454. valueRange[1] = cr.Row
  1455. }
  1456. if cr.Col > valueRange[3] || valueRange[3] == 0 {
  1457. valueRange[3] = cr.Col
  1458. }
  1459. }
  1460. // cellResolver calc cell value by given worksheet name, cell reference and context.
  1461. func (f *File) cellResolver(ctx *calcContext, sheet, cell string) (formulaArg, error) {
  1462. var (
  1463. arg formulaArg
  1464. value string
  1465. err error
  1466. )
  1467. ref := fmt.Sprintf("%s!%s", sheet, cell)
  1468. if formula, _ := f.GetCellFormula(sheet, cell); len(formula) != 0 {
  1469. ctx.Lock()
  1470. if ctx.entry != ref {
  1471. if ctx.iterations[ref] <= f.options.MaxCalcIterations {
  1472. ctx.iterations[ref]++
  1473. ctx.Unlock()
  1474. arg, _ = f.calcCellValue(ctx, sheet, cell)
  1475. ctx.iterationsCache[ref] = arg
  1476. return arg, nil
  1477. }
  1478. ctx.Unlock()
  1479. return ctx.iterationsCache[ref], nil
  1480. }
  1481. ctx.Unlock()
  1482. }
  1483. if value, err = f.GetCellValue(sheet, cell, Options{RawCellValue: true}); err != nil {
  1484. return arg, err
  1485. }
  1486. arg = newStringFormulaArg(value)
  1487. cellType, _ := f.GetCellType(sheet, cell)
  1488. switch cellType {
  1489. case CellTypeBool:
  1490. return arg.ToBool(), err
  1491. case CellTypeNumber, CellTypeUnset:
  1492. if arg.Value() == "" {
  1493. return newEmptyFormulaArg(), err
  1494. }
  1495. return arg.ToNumber(), err
  1496. case CellTypeInlineString, CellTypeSharedString:
  1497. return arg, err
  1498. default:
  1499. return newEmptyFormulaArg(), err
  1500. }
  1501. }
  1502. // rangeResolver extract value as string from given reference and range list.
  1503. // This function will not ignore the empty cell. For example, A1:A2:A2:B3 will
  1504. // be reference A1:B3.
  1505. func (f *File) rangeResolver(ctx *calcContext, cellRefs, cellRanges *list.List) (arg formulaArg, err error) {
  1506. arg.cellRefs, arg.cellRanges = cellRefs, cellRanges
  1507. // value range order: from row, to row, from column, to column
  1508. valueRange := []int{0, 0, 0, 0}
  1509. var sheet string
  1510. // prepare value range
  1511. for temp := cellRanges.Front(); temp != nil; temp = temp.Next() {
  1512. cr := temp.Value.(cellRange)
  1513. if cr.From.Sheet != cr.To.Sheet {
  1514. err = errors.New(formulaErrorVALUE)
  1515. }
  1516. rng := []int{cr.From.Col, cr.From.Row, cr.To.Col, cr.To.Row}
  1517. _ = sortCoordinates(rng)
  1518. cr.From.Col, cr.From.Row, cr.To.Col, cr.To.Row = rng[0], rng[1], rng[2], rng[3]
  1519. prepareValueRange(cr, valueRange)
  1520. if cr.From.Sheet != "" {
  1521. sheet = cr.From.Sheet
  1522. }
  1523. }
  1524. for temp := cellRefs.Front(); temp != nil; temp = temp.Next() {
  1525. cr := temp.Value.(cellRef)
  1526. if cr.Sheet != "" {
  1527. sheet = cr.Sheet
  1528. }
  1529. prepareValueRef(cr, valueRange)
  1530. }
  1531. // extract value from ranges
  1532. if cellRanges.Len() > 0 {
  1533. arg.Type = ArgMatrix
  1534. for row := valueRange[0]; row <= valueRange[1]; row++ {
  1535. var matrixRow []formulaArg
  1536. for col := valueRange[2]; col <= valueRange[3]; col++ {
  1537. var cell string
  1538. var value formulaArg
  1539. if cell, err = CoordinatesToCellName(col, row); err != nil {
  1540. return
  1541. }
  1542. if value, err = f.cellResolver(ctx, sheet, cell); err != nil {
  1543. return
  1544. }
  1545. matrixRow = append(matrixRow, value)
  1546. }
  1547. arg.Matrix = append(arg.Matrix, matrixRow)
  1548. }
  1549. return
  1550. }
  1551. // extract value from references
  1552. for temp := cellRefs.Front(); temp != nil; temp = temp.Next() {
  1553. cr := temp.Value.(cellRef)
  1554. var cell string
  1555. if cell, err = CoordinatesToCellName(cr.Col, cr.Row); err != nil {
  1556. return
  1557. }
  1558. if arg, err = f.cellResolver(ctx, cr.Sheet, cell); err != nil {
  1559. return
  1560. }
  1561. arg.cellRefs, arg.cellRanges = cellRefs, cellRanges
  1562. }
  1563. return
  1564. }
  1565. // callFuncByName calls the no error or only error return function with
  1566. // reflect by given receiver, name and parameters.
  1567. func callFuncByName(receiver interface{}, name string, params []reflect.Value) (arg formulaArg) {
  1568. function := reflect.ValueOf(receiver).MethodByName(name)
  1569. if function.IsValid() {
  1570. rt := function.Call(params)
  1571. if len(rt) == 0 {
  1572. return
  1573. }
  1574. arg = rt[0].Interface().(formulaArg)
  1575. return
  1576. }
  1577. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("not support %s function", name))
  1578. }
  1579. // formulaCriteriaParser parse formula criteria.
  1580. func formulaCriteriaParser(exp string) (fc *formulaCriteria) {
  1581. fc = &formulaCriteria{}
  1582. if exp == "" {
  1583. return
  1584. }
  1585. if match := regexp.MustCompile(`^(\d+)$`).FindStringSubmatch(exp); len(match) > 1 {
  1586. fc.Type, fc.Condition = criteriaEq, match[1]
  1587. return
  1588. }
  1589. if match := regexp.MustCompile(`^=(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
  1590. fc.Type, fc.Condition = criteriaEq, match[1]
  1591. return
  1592. }
  1593. if match := regexp.MustCompile(`^<>(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
  1594. fc.Type, fc.Condition = criteriaNe, match[1]
  1595. return
  1596. }
  1597. if match := regexp.MustCompile(`^<=(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
  1598. fc.Type, fc.Condition = criteriaLe, match[1]
  1599. return
  1600. }
  1601. if match := regexp.MustCompile(`^>=(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
  1602. fc.Type, fc.Condition = criteriaGe, match[1]
  1603. return
  1604. }
  1605. if match := regexp.MustCompile(`^<(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
  1606. fc.Type, fc.Condition = criteriaL, match[1]
  1607. return
  1608. }
  1609. if match := regexp.MustCompile(`^>(.*)$`).FindStringSubmatch(exp); len(match) > 1 {
  1610. fc.Type, fc.Condition = criteriaG, match[1]
  1611. return
  1612. }
  1613. if strings.Contains(exp, "?") {
  1614. exp = strings.ReplaceAll(exp, "?", ".")
  1615. }
  1616. if strings.Contains(exp, "*") {
  1617. exp = strings.ReplaceAll(exp, "*", ".*")
  1618. }
  1619. fc.Type, fc.Condition = criteriaRegexp, exp
  1620. return
  1621. }
  1622. // formulaCriteriaEval evaluate formula criteria expression.
  1623. func formulaCriteriaEval(val string, criteria *formulaCriteria) (result bool, err error) {
  1624. var value, expected float64
  1625. var e error
  1626. prepareValue := func(val, cond string) (value float64, expected float64, err error) {
  1627. percentile := 1.0
  1628. if strings.HasSuffix(cond, "%") {
  1629. cond = strings.TrimSuffix(cond, "%")
  1630. percentile /= 100
  1631. }
  1632. if value, err = strconv.ParseFloat(val, 64); err != nil {
  1633. return
  1634. }
  1635. if expected, err = strconv.ParseFloat(cond, 64); err != nil {
  1636. return
  1637. }
  1638. expected *= percentile
  1639. return
  1640. }
  1641. switch criteria.Type {
  1642. case criteriaEq:
  1643. return val == criteria.Condition, err
  1644. case criteriaLe:
  1645. value, expected, e = prepareValue(val, criteria.Condition)
  1646. return value <= expected && e == nil, err
  1647. case criteriaGe:
  1648. value, expected, e = prepareValue(val, criteria.Condition)
  1649. return value >= expected && e == nil, err
  1650. case criteriaNe:
  1651. return val != criteria.Condition, err
  1652. case criteriaL:
  1653. value, expected, e = prepareValue(val, criteria.Condition)
  1654. return value < expected && e == nil, err
  1655. case criteriaG:
  1656. value, expected, e = prepareValue(val, criteria.Condition)
  1657. return value > expected && e == nil, err
  1658. case criteriaRegexp:
  1659. return regexp.MatchString(criteria.Condition, val)
  1660. }
  1661. return
  1662. }
  1663. // Engineering Functions
  1664. // BESSELI function the modified Bessel function, which is equivalent to the
  1665. // Bessel function evaluated for purely imaginary arguments. The syntax of
  1666. // the Besseli function is:
  1667. //
  1668. // BESSELI(x,n)
  1669. func (fn *formulaFuncs) BESSELI(argsList *list.List) formulaArg {
  1670. if argsList.Len() != 2 {
  1671. return newErrorFormulaArg(formulaErrorVALUE, "BESSELI requires 2 numeric arguments")
  1672. }
  1673. return fn.bassel(argsList, true)
  1674. }
  1675. // BESSELJ function returns the Bessel function, Jn(x), for a specified order
  1676. // and value of x. The syntax of the function is:
  1677. //
  1678. // BESSELJ(x,n)
  1679. func (fn *formulaFuncs) BESSELJ(argsList *list.List) formulaArg {
  1680. if argsList.Len() != 2 {
  1681. return newErrorFormulaArg(formulaErrorVALUE, "BESSELJ requires 2 numeric arguments")
  1682. }
  1683. return fn.bassel(argsList, false)
  1684. }
  1685. // bassel is an implementation of the formula functions BESSELI and BESSELJ.
  1686. func (fn *formulaFuncs) bassel(argsList *list.List, modfied bool) formulaArg {
  1687. x, n := argsList.Front().Value.(formulaArg).ToNumber(), argsList.Back().Value.(formulaArg).ToNumber()
  1688. if x.Type != ArgNumber {
  1689. return x
  1690. }
  1691. if n.Type != ArgNumber {
  1692. return n
  1693. }
  1694. max, x1 := 100, x.Number*0.5
  1695. x2 := x1 * x1
  1696. x1 = math.Pow(x1, n.Number)
  1697. n1, n2, n3, n4, add := fact(n.Number), 1.0, 0.0, n.Number, false
  1698. result := x1 / n1
  1699. t := result * 0.9
  1700. for result != t && max != 0 {
  1701. x1 *= x2
  1702. n3++
  1703. n1 *= n3
  1704. n4++
  1705. n2 *= n4
  1706. t = result
  1707. r := x1 / n1 / n2
  1708. if modfied || add {
  1709. result += r
  1710. } else {
  1711. result -= r
  1712. }
  1713. max--
  1714. add = !add
  1715. }
  1716. return newNumberFormulaArg(result)
  1717. }
  1718. // BESSELK function calculates the modified Bessel functions, Kn(x), which are
  1719. // also known as the hyperbolic Bessel Functions. These are the equivalent of
  1720. // the Bessel functions, evaluated for purely imaginary arguments. The syntax
  1721. // of the function is:
  1722. //
  1723. // BESSELK(x,n)
  1724. func (fn *formulaFuncs) BESSELK(argsList *list.List) formulaArg {
  1725. if argsList.Len() != 2 {
  1726. return newErrorFormulaArg(formulaErrorVALUE, "BESSELK requires 2 numeric arguments")
  1727. }
  1728. x, n := argsList.Front().Value.(formulaArg).ToNumber(), argsList.Back().Value.(formulaArg).ToNumber()
  1729. if x.Type != ArgNumber {
  1730. return x
  1731. }
  1732. if n.Type != ArgNumber {
  1733. return n
  1734. }
  1735. if x.Number <= 0 || n.Number < 0 {
  1736. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  1737. }
  1738. var result float64
  1739. switch math.Floor(n.Number) {
  1740. case 0:
  1741. result = fn.besselK0(x)
  1742. case 1:
  1743. result = fn.besselK1(x)
  1744. default:
  1745. result = fn.besselK2(x, n)
  1746. }
  1747. return newNumberFormulaArg(result)
  1748. }
  1749. // besselK0 is an implementation of the formula function BESSELK.
  1750. func (fn *formulaFuncs) besselK0(x formulaArg) float64 {
  1751. var y float64
  1752. if x.Number <= 2 {
  1753. n2 := x.Number * 0.5
  1754. y = n2 * n2
  1755. args := list.New()
  1756. args.PushBack(x)
  1757. args.PushBack(newNumberFormulaArg(0))
  1758. return -math.Log(n2)*fn.BESSELI(args).Number +
  1759. (-0.57721566 + y*(0.42278420+y*(0.23069756+y*(0.3488590e-1+y*(0.262698e-2+y*
  1760. (0.10750e-3+y*0.74e-5))))))
  1761. }
  1762. y = 2 / x.Number
  1763. return math.Exp(-x.Number) / math.Sqrt(x.Number) *
  1764. (1.25331414 + y*(-0.7832358e-1+y*(0.2189568e-1+y*(-0.1062446e-1+y*
  1765. (0.587872e-2+y*(-0.251540e-2+y*0.53208e-3))))))
  1766. }
  1767. // besselK1 is an implementation of the formula function BESSELK.
  1768. func (fn *formulaFuncs) besselK1(x formulaArg) float64 {
  1769. var n2, y float64
  1770. if x.Number <= 2 {
  1771. n2 = x.Number * 0.5
  1772. y = n2 * n2
  1773. args := list.New()
  1774. args.PushBack(x)
  1775. args.PushBack(newNumberFormulaArg(1))
  1776. return math.Log(n2)*fn.BESSELI(args).Number +
  1777. (1+y*(0.15443144+y*(-0.67278579+y*(-0.18156897+y*(-0.1919402e-1+y*(-0.110404e-2+y*(-0.4686e-4)))))))/x.Number
  1778. }
  1779. y = 2 / x.Number
  1780. return math.Exp(-x.Number) / math.Sqrt(x.Number) *
  1781. (1.25331414 + y*(0.23498619+y*(-0.3655620e-1+y*(0.1504268e-1+y*(-0.780353e-2+y*
  1782. (0.325614e-2+y*(-0.68245e-3)))))))
  1783. }
  1784. // besselK2 is an implementation of the formula function BESSELK.
  1785. func (fn *formulaFuncs) besselK2(x, n formulaArg) float64 {
  1786. tox, bkm, bk, bkp := 2/x.Number, fn.besselK0(x), fn.besselK1(x), 0.0
  1787. for i := 1.0; i < n.Number; i++ {
  1788. bkp = bkm + i*tox*bk
  1789. bkm = bk
  1790. bk = bkp
  1791. }
  1792. return bk
  1793. }
  1794. // BESSELY function returns the Bessel function, Yn(x), (also known as the
  1795. // Weber function or the Neumann function), for a specified order and value
  1796. // of x. The syntax of the function is:
  1797. //
  1798. // BESSELY(x,n)
  1799. func (fn *formulaFuncs) BESSELY(argsList *list.List) formulaArg {
  1800. if argsList.Len() != 2 {
  1801. return newErrorFormulaArg(formulaErrorVALUE, "BESSELY requires 2 numeric arguments")
  1802. }
  1803. x, n := argsList.Front().Value.(formulaArg).ToNumber(), argsList.Back().Value.(formulaArg).ToNumber()
  1804. if x.Type != ArgNumber {
  1805. return x
  1806. }
  1807. if n.Type != ArgNumber {
  1808. return n
  1809. }
  1810. if x.Number <= 0 || n.Number < 0 {
  1811. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  1812. }
  1813. var result float64
  1814. switch math.Floor(n.Number) {
  1815. case 0:
  1816. result = fn.besselY0(x)
  1817. case 1:
  1818. result = fn.besselY1(x)
  1819. default:
  1820. result = fn.besselY2(x, n)
  1821. }
  1822. return newNumberFormulaArg(result)
  1823. }
  1824. // besselY0 is an implementation of the formula function BESSELY.
  1825. func (fn *formulaFuncs) besselY0(x formulaArg) float64 {
  1826. var y float64
  1827. if x.Number < 8 {
  1828. y = x.Number * x.Number
  1829. f1 := -2957821389.0 + y*(7062834065.0+y*(-512359803.6+y*(10879881.29+y*
  1830. (-86327.92757+y*228.4622733))))
  1831. f2 := 40076544269.0 + y*(745249964.8+y*(7189466.438+y*
  1832. (47447.26470+y*(226.1030244+y))))
  1833. args := list.New()
  1834. args.PushBack(x)
  1835. args.PushBack(newNumberFormulaArg(0))
  1836. return f1/f2 + 0.636619772*fn.BESSELJ(args).Number*math.Log(x.Number)
  1837. }
  1838. z := 8.0 / x.Number
  1839. y = z * z
  1840. xx := x.Number - 0.785398164
  1841. f1 := 1 + y*(-0.1098628627e-2+y*(0.2734510407e-4+y*(-0.2073370639e-5+y*0.2093887211e-6)))
  1842. f2 := -0.1562499995e-1 + y*(0.1430488765e-3+y*(-0.6911147651e-5+y*(0.7621095161e-6+y*
  1843. (-0.934945152e-7))))
  1844. return math.Sqrt(0.636619772/x.Number) * (math.Sin(xx)*f1 + z*math.Cos(xx)*f2)
  1845. }
  1846. // besselY1 is an implementation of the formula function BESSELY.
  1847. func (fn *formulaFuncs) besselY1(x formulaArg) float64 {
  1848. if x.Number < 8 {
  1849. y := x.Number * x.Number
  1850. f1 := x.Number * (-0.4900604943e13 + y*(0.1275274390e13+y*(-0.5153438139e11+y*
  1851. (0.7349264551e9+y*(-0.4237922726e7+y*0.8511937935e4)))))
  1852. f2 := 0.2499580570e14 + y*(0.4244419664e12+y*(0.3733650367e10+y*(0.2245904002e8+y*
  1853. (0.1020426050e6+y*(0.3549632885e3+y)))))
  1854. args := list.New()
  1855. args.PushBack(x)
  1856. args.PushBack(newNumberFormulaArg(1))
  1857. return f1/f2 + 0.636619772*(fn.BESSELJ(args).Number*math.Log(x.Number)-1/x.Number)
  1858. }
  1859. return math.Sqrt(0.636619772/x.Number) * math.Sin(x.Number-2.356194491)
  1860. }
  1861. // besselY2 is an implementation of the formula function BESSELY.
  1862. func (fn *formulaFuncs) besselY2(x, n formulaArg) float64 {
  1863. tox, bym, by, byp := 2/x.Number, fn.besselY0(x), fn.besselY1(x), 0.0
  1864. for i := 1.0; i < n.Number; i++ {
  1865. byp = i*tox*by - bym
  1866. bym = by
  1867. by = byp
  1868. }
  1869. return by
  1870. }
  1871. // BIN2DEC function converts a Binary (a base-2 number) into a decimal number.
  1872. // The syntax of the function is:
  1873. //
  1874. // BIN2DEC(number)
  1875. func (fn *formulaFuncs) BIN2DEC(argsList *list.List) formulaArg {
  1876. if argsList.Len() != 1 {
  1877. return newErrorFormulaArg(formulaErrorVALUE, "BIN2DEC requires 1 numeric argument")
  1878. }
  1879. token := argsList.Front().Value.(formulaArg)
  1880. number := token.ToNumber()
  1881. if number.Type != ArgNumber {
  1882. return newErrorFormulaArg(formulaErrorVALUE, number.Error)
  1883. }
  1884. return fn.bin2dec(token.Value())
  1885. }
  1886. // BIN2HEX function converts a Binary (Base 2) number into a Hexadecimal
  1887. // (Base 16) number. The syntax of the function is:
  1888. //
  1889. // BIN2HEX(number,[places])
  1890. func (fn *formulaFuncs) BIN2HEX(argsList *list.List) formulaArg {
  1891. if argsList.Len() < 1 {
  1892. return newErrorFormulaArg(formulaErrorVALUE, "BIN2HEX requires at least 1 argument")
  1893. }
  1894. if argsList.Len() > 2 {
  1895. return newErrorFormulaArg(formulaErrorVALUE, "BIN2HEX allows at most 2 arguments")
  1896. }
  1897. token := argsList.Front().Value.(formulaArg)
  1898. number := token.ToNumber()
  1899. if number.Type != ArgNumber {
  1900. return newErrorFormulaArg(formulaErrorVALUE, number.Error)
  1901. }
  1902. decimal, newList := fn.bin2dec(token.Value()), list.New()
  1903. if decimal.Type != ArgNumber {
  1904. return decimal
  1905. }
  1906. newList.PushBack(decimal)
  1907. if argsList.Len() == 2 {
  1908. newList.PushBack(argsList.Back().Value.(formulaArg))
  1909. }
  1910. return fn.dec2x("BIN2HEX", newList)
  1911. }
  1912. // BIN2OCT function converts a Binary (Base 2) number into an Octal (Base 8)
  1913. // number. The syntax of the function is:
  1914. //
  1915. // BIN2OCT(number,[places])
  1916. func (fn *formulaFuncs) BIN2OCT(argsList *list.List) formulaArg {
  1917. if argsList.Len() < 1 {
  1918. return newErrorFormulaArg(formulaErrorVALUE, "BIN2OCT requires at least 1 argument")
  1919. }
  1920. if argsList.Len() > 2 {
  1921. return newErrorFormulaArg(formulaErrorVALUE, "BIN2OCT allows at most 2 arguments")
  1922. }
  1923. token := argsList.Front().Value.(formulaArg)
  1924. number := token.ToNumber()
  1925. if number.Type != ArgNumber {
  1926. return newErrorFormulaArg(formulaErrorVALUE, number.Error)
  1927. }
  1928. decimal, newList := fn.bin2dec(token.Value()), list.New()
  1929. if decimal.Type != ArgNumber {
  1930. return decimal
  1931. }
  1932. newList.PushBack(decimal)
  1933. if argsList.Len() == 2 {
  1934. newList.PushBack(argsList.Back().Value.(formulaArg))
  1935. }
  1936. return fn.dec2x("BIN2OCT", newList)
  1937. }
  1938. // bin2dec is an implementation of the formula function BIN2DEC.
  1939. func (fn *formulaFuncs) bin2dec(number string) formulaArg {
  1940. decimal, length := 0.0, len(number)
  1941. for i := length; i > 0; i-- {
  1942. s := string(number[length-i])
  1943. if i == 10 && s == "1" {
  1944. decimal += math.Pow(-2.0, float64(i-1))
  1945. continue
  1946. }
  1947. if s == "1" {
  1948. decimal += math.Pow(2.0, float64(i-1))
  1949. continue
  1950. }
  1951. if s != "0" {
  1952. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  1953. }
  1954. }
  1955. return newNumberFormulaArg(decimal)
  1956. }
  1957. // BITAND function returns the bitwise 'AND' for two supplied integers. The
  1958. // syntax of the function is:
  1959. //
  1960. // BITAND(number1,number2)
  1961. func (fn *formulaFuncs) BITAND(argsList *list.List) formulaArg {
  1962. return fn.bitwise("BITAND", argsList)
  1963. }
  1964. // BITLSHIFT function returns a supplied integer, shifted left by a specified
  1965. // number of bits. The syntax of the function is:
  1966. //
  1967. // BITLSHIFT(number1,shift_amount)
  1968. func (fn *formulaFuncs) BITLSHIFT(argsList *list.List) formulaArg {
  1969. return fn.bitwise("BITLSHIFT", argsList)
  1970. }
  1971. // BITOR function returns the bitwise 'OR' for two supplied integers. The
  1972. // syntax of the function is:
  1973. //
  1974. // BITOR(number1,number2)
  1975. func (fn *formulaFuncs) BITOR(argsList *list.List) formulaArg {
  1976. return fn.bitwise("BITOR", argsList)
  1977. }
  1978. // BITRSHIFT function returns a supplied integer, shifted right by a specified
  1979. // number of bits. The syntax of the function is:
  1980. //
  1981. // BITRSHIFT(number1,shift_amount)
  1982. func (fn *formulaFuncs) BITRSHIFT(argsList *list.List) formulaArg {
  1983. return fn.bitwise("BITRSHIFT", argsList)
  1984. }
  1985. // BITXOR function returns the bitwise 'XOR' (exclusive 'OR') for two supplied
  1986. // integers. The syntax of the function is:
  1987. //
  1988. // BITXOR(number1,number2)
  1989. func (fn *formulaFuncs) BITXOR(argsList *list.List) formulaArg {
  1990. return fn.bitwise("BITXOR", argsList)
  1991. }
  1992. // bitwise is an implementation of the formula functions BITAND, BITLSHIFT,
  1993. // BITOR, BITRSHIFT and BITXOR.
  1994. func (fn *formulaFuncs) bitwise(name string, argsList *list.List) formulaArg {
  1995. if argsList.Len() != 2 {
  1996. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 2 numeric arguments", name))
  1997. }
  1998. num1, num2 := argsList.Front().Value.(formulaArg).ToNumber(), argsList.Back().Value.(formulaArg).ToNumber()
  1999. if num1.Type != ArgNumber || num2.Type != ArgNumber {
  2000. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  2001. }
  2002. max := math.Pow(2, 48) - 1
  2003. if num1.Number < 0 || num1.Number > max || num2.Number < 0 || num2.Number > max {
  2004. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  2005. }
  2006. bitwiseFuncMap := map[string]func(a, b int) int{
  2007. "BITAND": func(a, b int) int { return a & b },
  2008. "BITLSHIFT": func(a, b int) int { return a << uint(b) },
  2009. "BITOR": func(a, b int) int { return a | b },
  2010. "BITRSHIFT": func(a, b int) int { return a >> uint(b) },
  2011. "BITXOR": func(a, b int) int { return a ^ b },
  2012. }
  2013. bitwiseFunc := bitwiseFuncMap[name]
  2014. return newNumberFormulaArg(float64(bitwiseFunc(int(num1.Number), int(num2.Number))))
  2015. }
  2016. // COMPLEX function takes two arguments, representing the real and the
  2017. // imaginary coefficients of a complex number, and from these, creates a
  2018. // complex number. The syntax of the function is:
  2019. //
  2020. // COMPLEX(real_num,i_num,[suffix])
  2021. func (fn *formulaFuncs) COMPLEX(argsList *list.List) formulaArg {
  2022. if argsList.Len() < 2 {
  2023. return newErrorFormulaArg(formulaErrorVALUE, "COMPLEX requires at least 2 arguments")
  2024. }
  2025. if argsList.Len() > 3 {
  2026. return newErrorFormulaArg(formulaErrorVALUE, "COMPLEX allows at most 3 arguments")
  2027. }
  2028. realNum, i, suffix := argsList.Front().Value.(formulaArg).ToNumber(), argsList.Front().Next().Value.(formulaArg).ToNumber(), "i"
  2029. if realNum.Type != ArgNumber {
  2030. return realNum
  2031. }
  2032. if i.Type != ArgNumber {
  2033. return i
  2034. }
  2035. if argsList.Len() == 3 {
  2036. if suffix = strings.ToLower(argsList.Back().Value.(formulaArg).Value()); suffix != "i" && suffix != "j" {
  2037. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  2038. }
  2039. }
  2040. return newStringFormulaArg(cmplx2str(complex(realNum.Number, i.Number), suffix))
  2041. }
  2042. // cmplx2str replace complex number string characters.
  2043. func cmplx2str(num complex128, suffix string) string {
  2044. realPart, imagPart := fmt.Sprint(real(num)), fmt.Sprint(imag(num))
  2045. isNum, i, decimal := isNumeric(realPart)
  2046. if isNum && i > 15 {
  2047. realPart = strconv.FormatFloat(decimal, 'G', 15, 64)
  2048. }
  2049. isNum, i, decimal = isNumeric(imagPart)
  2050. if isNum && i > 15 {
  2051. imagPart = strconv.FormatFloat(decimal, 'G', 15, 64)
  2052. }
  2053. c := realPart
  2054. if imag(num) > 0 {
  2055. c += "+"
  2056. }
  2057. if imag(num) != 0 {
  2058. c += imagPart + "i"
  2059. }
  2060. c = strings.TrimPrefix(c, "(")
  2061. c = strings.TrimPrefix(c, "+0+")
  2062. c = strings.TrimPrefix(c, "-0+")
  2063. c = strings.TrimSuffix(c, ")")
  2064. c = strings.TrimPrefix(c, "0+")
  2065. if strings.HasPrefix(c, "0-") {
  2066. c = "-" + strings.TrimPrefix(c, "0-")
  2067. }
  2068. c = strings.TrimPrefix(c, "0+")
  2069. c = strings.TrimSuffix(c, "+0i")
  2070. c = strings.TrimSuffix(c, "-0i")
  2071. c = strings.NewReplacer("+1i", "+i", "-1i", "-i").Replace(c)
  2072. c = strings.ReplaceAll(c, "i", suffix)
  2073. return c
  2074. }
  2075. // str2cmplx convert complex number string characters.
  2076. func str2cmplx(c string) string {
  2077. c = strings.ReplaceAll(c, "j", "i")
  2078. if c == "i" {
  2079. c = "1i"
  2080. }
  2081. c = strings.NewReplacer("+i", "+1i", "-i", "-1i").Replace(c)
  2082. return c
  2083. }
  2084. // conversionUnit defined unit info for conversion.
  2085. type conversionUnit struct {
  2086. group uint8
  2087. allowPrefix bool
  2088. }
  2089. // conversionUnits maps info list for unit conversion, that can be used in
  2090. // formula function CONVERT.
  2091. var conversionUnits = map[string]conversionUnit{
  2092. // weight and mass
  2093. "g": {group: categoryWeightAndMass, allowPrefix: true},
  2094. "sg": {group: categoryWeightAndMass, allowPrefix: false},
  2095. "lbm": {group: categoryWeightAndMass, allowPrefix: false},
  2096. "u": {group: categoryWeightAndMass, allowPrefix: true},
  2097. "ozm": {group: categoryWeightAndMass, allowPrefix: false},
  2098. "grain": {group: categoryWeightAndMass, allowPrefix: false},
  2099. "cwt": {group: categoryWeightAndMass, allowPrefix: false},
  2100. "shweight": {group: categoryWeightAndMass, allowPrefix: false},
  2101. "uk_cwt": {group: categoryWeightAndMass, allowPrefix: false},
  2102. "lcwt": {group: categoryWeightAndMass, allowPrefix: false},
  2103. "hweight": {group: categoryWeightAndMass, allowPrefix: false},
  2104. "stone": {group: categoryWeightAndMass, allowPrefix: false},
  2105. "ton": {group: categoryWeightAndMass, allowPrefix: false},
  2106. "uk_ton": {group: categoryWeightAndMass, allowPrefix: false},
  2107. "LTON": {group: categoryWeightAndMass, allowPrefix: false},
  2108. "brton": {group: categoryWeightAndMass, allowPrefix: false},
  2109. // distance
  2110. "m": {group: categoryDistance, allowPrefix: true},
  2111. "mi": {group: categoryDistance, allowPrefix: false},
  2112. "Nmi": {group: categoryDistance, allowPrefix: false},
  2113. "in": {group: categoryDistance, allowPrefix: false},
  2114. "ft": {group: categoryDistance, allowPrefix: false},
  2115. "yd": {group: categoryDistance, allowPrefix: false},
  2116. "ang": {group: categoryDistance, allowPrefix: true},
  2117. "ell": {group: categoryDistance, allowPrefix: false},
  2118. "ly": {group: categoryDistance, allowPrefix: false},
  2119. "parsec": {group: categoryDistance, allowPrefix: false},
  2120. "pc": {group: categoryDistance, allowPrefix: false},
  2121. "Pica": {group: categoryDistance, allowPrefix: false},
  2122. "Picapt": {group: categoryDistance, allowPrefix: false},
  2123. "pica": {group: categoryDistance, allowPrefix: false},
  2124. "survey_mi": {group: categoryDistance, allowPrefix: false},
  2125. // time
  2126. "yr": {group: categoryTime, allowPrefix: false},
  2127. "day": {group: categoryTime, allowPrefix: false},
  2128. "d": {group: categoryTime, allowPrefix: false},
  2129. "hr": {group: categoryTime, allowPrefix: false},
  2130. "mn": {group: categoryTime, allowPrefix: false},
  2131. "min": {group: categoryTime, allowPrefix: false},
  2132. "sec": {group: categoryTime, allowPrefix: true},
  2133. "s": {group: categoryTime, allowPrefix: true},
  2134. // pressure
  2135. "Pa": {group: categoryPressure, allowPrefix: true},
  2136. "p": {group: categoryPressure, allowPrefix: true},
  2137. "atm": {group: categoryPressure, allowPrefix: true},
  2138. "at": {group: categoryPressure, allowPrefix: true},
  2139. "mmHg": {group: categoryPressure, allowPrefix: true},
  2140. "psi": {group: categoryPressure, allowPrefix: true},
  2141. "Torr": {group: categoryPressure, allowPrefix: true},
  2142. // force
  2143. "N": {group: categoryForce, allowPrefix: true},
  2144. "dyn": {group: categoryForce, allowPrefix: true},
  2145. "dy": {group: categoryForce, allowPrefix: true},
  2146. "lbf": {group: categoryForce, allowPrefix: false},
  2147. "pond": {group: categoryForce, allowPrefix: true},
  2148. // energy
  2149. "J": {group: categoryEnergy, allowPrefix: true},
  2150. "e": {group: categoryEnergy, allowPrefix: true},
  2151. "c": {group: categoryEnergy, allowPrefix: true},
  2152. "cal": {group: categoryEnergy, allowPrefix: true},
  2153. "eV": {group: categoryEnergy, allowPrefix: true},
  2154. "ev": {group: categoryEnergy, allowPrefix: true},
  2155. "HPh": {group: categoryEnergy, allowPrefix: false},
  2156. "hh": {group: categoryEnergy, allowPrefix: false},
  2157. "Wh": {group: categoryEnergy, allowPrefix: true},
  2158. "wh": {group: categoryEnergy, allowPrefix: true},
  2159. "flb": {group: categoryEnergy, allowPrefix: false},
  2160. "BTU": {group: categoryEnergy, allowPrefix: false},
  2161. "btu": {group: categoryEnergy, allowPrefix: false},
  2162. // power
  2163. "HP": {group: categoryPower, allowPrefix: false},
  2164. "h": {group: categoryPower, allowPrefix: false},
  2165. "W": {group: categoryPower, allowPrefix: true},
  2166. "w": {group: categoryPower, allowPrefix: true},
  2167. "PS": {group: categoryPower, allowPrefix: false},
  2168. "T": {group: categoryMagnetism, allowPrefix: true},
  2169. "ga": {group: categoryMagnetism, allowPrefix: true},
  2170. // temperature
  2171. "C": {group: categoryTemperature, allowPrefix: false},
  2172. "cel": {group: categoryTemperature, allowPrefix: false},
  2173. "F": {group: categoryTemperature, allowPrefix: false},
  2174. "fah": {group: categoryTemperature, allowPrefix: false},
  2175. "K": {group: categoryTemperature, allowPrefix: false},
  2176. "kel": {group: categoryTemperature, allowPrefix: false},
  2177. "Rank": {group: categoryTemperature, allowPrefix: false},
  2178. "Reau": {group: categoryTemperature, allowPrefix: false},
  2179. // volume
  2180. "l": {group: categoryVolumeAndLiquidMeasure, allowPrefix: true},
  2181. "L": {group: categoryVolumeAndLiquidMeasure, allowPrefix: true},
  2182. "lt": {group: categoryVolumeAndLiquidMeasure, allowPrefix: true},
  2183. "tsp": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2184. "tspm": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2185. "tbs": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2186. "oz": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2187. "cup": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2188. "pt": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2189. "us_pt": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2190. "uk_pt": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2191. "qt": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2192. "uk_qt": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2193. "gal": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2194. "uk_gal": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2195. "ang3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: true},
  2196. "ang^3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: true},
  2197. "barrel": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2198. "bushel": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2199. "in3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2200. "in^3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2201. "ft3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2202. "ft^3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2203. "ly3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2204. "ly^3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2205. "m3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: true},
  2206. "m^3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: true},
  2207. "mi3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2208. "mi^3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2209. "yd3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2210. "yd^3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2211. "Nmi3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2212. "Nmi^3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2213. "Pica3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2214. "Pica^3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2215. "Picapt3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2216. "Picapt^3": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2217. "GRT": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2218. "regton": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2219. "MTON": {group: categoryVolumeAndLiquidMeasure, allowPrefix: false},
  2220. // area
  2221. "ha": {group: categoryArea, allowPrefix: true},
  2222. "uk_acre": {group: categoryArea, allowPrefix: false},
  2223. "us_acre": {group: categoryArea, allowPrefix: false},
  2224. "ang2": {group: categoryArea, allowPrefix: true},
  2225. "ang^2": {group: categoryArea, allowPrefix: true},
  2226. "ar": {group: categoryArea, allowPrefix: true},
  2227. "ft2": {group: categoryArea, allowPrefix: false},
  2228. "ft^2": {group: categoryArea, allowPrefix: false},
  2229. "in2": {group: categoryArea, allowPrefix: false},
  2230. "in^2": {group: categoryArea, allowPrefix: false},
  2231. "ly2": {group: categoryArea, allowPrefix: false},
  2232. "ly^2": {group: categoryArea, allowPrefix: false},
  2233. "m2": {group: categoryArea, allowPrefix: true},
  2234. "m^2": {group: categoryArea, allowPrefix: true},
  2235. "Morgen": {group: categoryArea, allowPrefix: false},
  2236. "mi2": {group: categoryArea, allowPrefix: false},
  2237. "mi^2": {group: categoryArea, allowPrefix: false},
  2238. "Nmi2": {group: categoryArea, allowPrefix: false},
  2239. "Nmi^2": {group: categoryArea, allowPrefix: false},
  2240. "Pica2": {group: categoryArea, allowPrefix: false},
  2241. "Pica^2": {group: categoryArea, allowPrefix: false},
  2242. "Picapt2": {group: categoryArea, allowPrefix: false},
  2243. "Picapt^2": {group: categoryArea, allowPrefix: false},
  2244. "yd2": {group: categoryArea, allowPrefix: false},
  2245. "yd^2": {group: categoryArea, allowPrefix: false},
  2246. // information
  2247. "byte": {group: categoryInformation, allowPrefix: true},
  2248. "bit": {group: categoryInformation, allowPrefix: true},
  2249. // speed
  2250. "m/s": {group: categorySpeed, allowPrefix: true},
  2251. "m/sec": {group: categorySpeed, allowPrefix: true},
  2252. "m/h": {group: categorySpeed, allowPrefix: true},
  2253. "m/hr": {group: categorySpeed, allowPrefix: true},
  2254. "mph": {group: categorySpeed, allowPrefix: false},
  2255. "admkn": {group: categorySpeed, allowPrefix: false},
  2256. "kn": {group: categorySpeed, allowPrefix: false},
  2257. }
  2258. // unitConversions maps details of the Units of measure conversion factors,
  2259. // organised by group.
  2260. var unitConversions = map[byte]map[string]float64{
  2261. // conversion uses gram (g) as an intermediate unit
  2262. categoryWeightAndMass: {
  2263. "g": 1,
  2264. "sg": 6.85217658567918e-05,
  2265. "lbm": 2.20462262184878e-03,
  2266. "u": 6.02214179421676e+23,
  2267. "ozm": 3.52739619495804e-02,
  2268. "grain": 1.54323583529414e+01,
  2269. "cwt": 2.20462262184878e-05,
  2270. "shweight": 2.20462262184878e-05,
  2271. "uk_cwt": 1.96841305522212e-05,
  2272. "lcwt": 1.96841305522212e-05,
  2273. "hweight": 1.96841305522212e-05,
  2274. "stone": 1.57473044417770e-04,
  2275. "ton": 1.10231131092439e-06,
  2276. "uk_ton": 9.84206527611061e-07,
  2277. "LTON": 9.84206527611061e-07,
  2278. "brton": 9.84206527611061e-07,
  2279. },
  2280. // conversion uses meter (m) as an intermediate unit
  2281. categoryDistance: {
  2282. "m": 1,
  2283. "mi": 6.21371192237334e-04,
  2284. "Nmi": 5.39956803455724e-04,
  2285. "in": 3.93700787401575e+01,
  2286. "ft": 3.28083989501312e+00,
  2287. "yd": 1.09361329833771e+00,
  2288. "ang": 1.0e+10,
  2289. "ell": 8.74890638670166e-01,
  2290. "ly": 1.05700083402462e-16,
  2291. "parsec": 3.24077928966473e-17,
  2292. "pc": 3.24077928966473e-17,
  2293. "Pica": 2.83464566929134e+03,
  2294. "Picapt": 2.83464566929134e+03,
  2295. "pica": 2.36220472440945e+02,
  2296. "survey_mi": 6.21369949494950e-04,
  2297. },
  2298. // conversion uses second (s) as an intermediate unit
  2299. categoryTime: {
  2300. "yr": 3.16880878140289e-08,
  2301. "day": 1.15740740740741e-05,
  2302. "d": 1.15740740740741e-05,
  2303. "hr": 2.77777777777778e-04,
  2304. "mn": 1.66666666666667e-02,
  2305. "min": 1.66666666666667e-02,
  2306. "sec": 1,
  2307. "s": 1,
  2308. },
  2309. // conversion uses Pascal (Pa) as an intermediate unit
  2310. categoryPressure: {
  2311. "Pa": 1,
  2312. "p": 1,
  2313. "atm": 9.86923266716013e-06,
  2314. "at": 9.86923266716013e-06,
  2315. "mmHg": 7.50063755419211e-03,
  2316. "psi": 1.45037737730209e-04,
  2317. "Torr": 7.50061682704170e-03,
  2318. },
  2319. // conversion uses Newton (N) as an intermediate unit
  2320. categoryForce: {
  2321. "N": 1,
  2322. "dyn": 1.0e+5,
  2323. "dy": 1.0e+5,
  2324. "lbf": 2.24808923655339e-01,
  2325. "pond": 1.01971621297793e+02,
  2326. },
  2327. // conversion uses Joule (J) as an intermediate unit
  2328. categoryEnergy: {
  2329. "J": 1,
  2330. "e": 9.99999519343231e+06,
  2331. "c": 2.39006249473467e-01,
  2332. "cal": 2.38846190642017e-01,
  2333. "eV": 6.24145700000000e+18,
  2334. "ev": 6.24145700000000e+18,
  2335. "HPh": 3.72506430801000e-07,
  2336. "hh": 3.72506430801000e-07,
  2337. "Wh": 2.77777916238711e-04,
  2338. "wh": 2.77777916238711e-04,
  2339. "flb": 2.37304222192651e+01,
  2340. "BTU": 9.47815067349015e-04,
  2341. "btu": 9.47815067349015e-04,
  2342. },
  2343. // conversion uses Horsepower (HP) as an intermediate unit
  2344. categoryPower: {
  2345. "HP": 1,
  2346. "h": 1,
  2347. "W": 7.45699871582270e+02,
  2348. "w": 7.45699871582270e+02,
  2349. "PS": 1.01386966542400e+00,
  2350. },
  2351. // conversion uses Tesla (T) as an intermediate unit
  2352. categoryMagnetism: {
  2353. "T": 1,
  2354. "ga": 10000,
  2355. },
  2356. // conversion uses litre (l) as an intermediate unit
  2357. categoryVolumeAndLiquidMeasure: {
  2358. "l": 1,
  2359. "L": 1,
  2360. "lt": 1,
  2361. "tsp": 2.02884136211058e+02,
  2362. "tspm": 2.0e+02,
  2363. "tbs": 6.76280454036860e+01,
  2364. "oz": 3.38140227018430e+01,
  2365. "cup": 4.22675283773038e+00,
  2366. "pt": 2.11337641886519e+00,
  2367. "us_pt": 2.11337641886519e+00,
  2368. "uk_pt": 1.75975398639270e+00,
  2369. "qt": 1.05668820943259e+00,
  2370. "uk_qt": 8.79876993196351e-01,
  2371. "gal": 2.64172052358148e-01,
  2372. "uk_gal": 2.19969248299088e-01,
  2373. "ang3": 1.0e+27,
  2374. "ang^3": 1.0e+27,
  2375. "barrel": 6.28981077043211e-03,
  2376. "bushel": 2.83775932584017e-02,
  2377. "in3": 6.10237440947323e+01,
  2378. "in^3": 6.10237440947323e+01,
  2379. "ft3": 3.53146667214886e-02,
  2380. "ft^3": 3.53146667214886e-02,
  2381. "ly3": 1.18093498844171e-51,
  2382. "ly^3": 1.18093498844171e-51,
  2383. "m3": 1.0e-03,
  2384. "m^3": 1.0e-03,
  2385. "mi3": 2.39912758578928e-13,
  2386. "mi^3": 2.39912758578928e-13,
  2387. "yd3": 1.30795061931439e-03,
  2388. "yd^3": 1.30795061931439e-03,
  2389. "Nmi3": 1.57426214685811e-13,
  2390. "Nmi^3": 1.57426214685811e-13,
  2391. "Pica3": 2.27769904358706e+07,
  2392. "Pica^3": 2.27769904358706e+07,
  2393. "Picapt3": 2.27769904358706e+07,
  2394. "Picapt^3": 2.27769904358706e+07,
  2395. "GRT": 3.53146667214886e-04,
  2396. "regton": 3.53146667214886e-04,
  2397. "MTON": 8.82866668037215e-04,
  2398. },
  2399. // conversion uses hectare (ha) as an intermediate unit
  2400. categoryArea: {
  2401. "ha": 1,
  2402. "uk_acre": 2.47105381467165e+00,
  2403. "us_acre": 2.47104393046628e+00,
  2404. "ang2": 1.0e+24,
  2405. "ang^2": 1.0e+24,
  2406. "ar": 1.0e+02,
  2407. "ft2": 1.07639104167097e+05,
  2408. "ft^2": 1.07639104167097e+05,
  2409. "in2": 1.55000310000620e+07,
  2410. "in^2": 1.55000310000620e+07,
  2411. "ly2": 1.11725076312873e-28,
  2412. "ly^2": 1.11725076312873e-28,
  2413. "m2": 1.0e+04,
  2414. "m^2": 1.0e+04,
  2415. "Morgen": 4.0e+00,
  2416. "mi2": 3.86102158542446e-03,
  2417. "mi^2": 3.86102158542446e-03,
  2418. "Nmi2": 2.91553349598123e-03,
  2419. "Nmi^2": 2.91553349598123e-03,
  2420. "Pica2": 8.03521607043214e+10,
  2421. "Pica^2": 8.03521607043214e+10,
  2422. "Picapt2": 8.03521607043214e+10,
  2423. "Picapt^2": 8.03521607043214e+10,
  2424. "yd2": 1.19599004630108e+04,
  2425. "yd^2": 1.19599004630108e+04,
  2426. },
  2427. // conversion uses bit (bit) as an intermediate unit
  2428. categoryInformation: {
  2429. "bit": 1,
  2430. "byte": 0.125,
  2431. },
  2432. // conversion uses Meters per Second (m/s) as an intermediate unit
  2433. categorySpeed: {
  2434. "m/s": 1,
  2435. "m/sec": 1,
  2436. "m/h": 3.60e+03,
  2437. "m/hr": 3.60e+03,
  2438. "mph": 2.23693629205440e+00,
  2439. "admkn": 1.94260256941567e+00,
  2440. "kn": 1.94384449244060e+00,
  2441. },
  2442. }
  2443. // conversionMultipliers maps details of the Multiplier prefixes that can be
  2444. // used with Units of Measure in CONVERT.
  2445. var conversionMultipliers = map[string]float64{
  2446. "Y": 1e24,
  2447. "Z": 1e21,
  2448. "E": 1e18,
  2449. "P": 1e15,
  2450. "T": 1e12,
  2451. "G": 1e9,
  2452. "M": 1e6,
  2453. "k": 1e3,
  2454. "h": 1e2,
  2455. "e": 1e1,
  2456. "da": 1e1,
  2457. "d": 1e-1,
  2458. "c": 1e-2,
  2459. "m": 1e-3,
  2460. "u": 1e-6,
  2461. "n": 1e-9,
  2462. "p": 1e-12,
  2463. "f": 1e-15,
  2464. "a": 1e-18,
  2465. "z": 1e-21,
  2466. "y": 1e-24,
  2467. "Yi": math.Pow(2, 80),
  2468. "Zi": math.Pow(2, 70),
  2469. "Ei": math.Pow(2, 60),
  2470. "Pi": math.Pow(2, 50),
  2471. "Ti": math.Pow(2, 40),
  2472. "Gi": math.Pow(2, 30),
  2473. "Mi": math.Pow(2, 20),
  2474. "ki": math.Pow(2, 10),
  2475. }
  2476. // getUnitDetails check and returns the unit of measure details.
  2477. func getUnitDetails(uom string) (unit string, catgory byte, res float64, ok bool) {
  2478. if len(uom) == 0 {
  2479. ok = false
  2480. return
  2481. }
  2482. if unit, ok := conversionUnits[uom]; ok {
  2483. return uom, unit.group, 1, ok
  2484. }
  2485. // 1 character standard metric multiplier prefixes
  2486. multiplierType := uom[:1]
  2487. uom = uom[1:]
  2488. conversionUnit, ok1 := conversionUnits[uom]
  2489. multiplier, ok2 := conversionMultipliers[multiplierType]
  2490. if ok1 && ok2 {
  2491. if !conversionUnit.allowPrefix {
  2492. ok = false
  2493. return
  2494. }
  2495. unitCategory := conversionUnit.group
  2496. return uom, unitCategory, multiplier, true
  2497. }
  2498. // 2 character standard and binary metric multiplier prefixes
  2499. if len(uom) > 0 {
  2500. multiplierType += uom[:1]
  2501. uom = uom[1:]
  2502. }
  2503. conversionUnit, ok1 = conversionUnits[uom]
  2504. multiplier, ok2 = conversionMultipliers[multiplierType]
  2505. if ok1 && ok2 {
  2506. if !conversionUnit.allowPrefix {
  2507. ok = false
  2508. return
  2509. }
  2510. unitCategory := conversionUnit.group
  2511. return uom, unitCategory, multiplier, true
  2512. }
  2513. ok = false
  2514. return
  2515. }
  2516. // resolveTemperatureSynonyms returns unit of measure according to a given
  2517. // temperature synonyms.
  2518. func resolveTemperatureSynonyms(uom string) string {
  2519. switch uom {
  2520. case "fah":
  2521. return "F"
  2522. case "cel":
  2523. return "C"
  2524. case "kel":
  2525. return "K"
  2526. }
  2527. return uom
  2528. }
  2529. // convertTemperature returns converted temperature by a given unit of measure.
  2530. func convertTemperature(fromUOM, toUOM string, value float64) float64 {
  2531. fromUOM = resolveTemperatureSynonyms(fromUOM)
  2532. toUOM = resolveTemperatureSynonyms(toUOM)
  2533. if fromUOM == toUOM {
  2534. return value
  2535. }
  2536. // convert to Kelvin
  2537. switch fromUOM {
  2538. case "F":
  2539. value = (value-32)/1.8 + 273.15
  2540. case "C":
  2541. value += 273.15
  2542. case "Rank":
  2543. value /= 1.8
  2544. case "Reau":
  2545. value = value*1.25 + 273.15
  2546. }
  2547. // convert from Kelvin
  2548. switch toUOM {
  2549. case "F":
  2550. value = (value-273.15)*1.8 + 32
  2551. case "C":
  2552. value -= 273.15
  2553. case "Rank":
  2554. value *= 1.8
  2555. case "Reau":
  2556. value = (value - 273.15) * 0.8
  2557. }
  2558. return value
  2559. }
  2560. // CONVERT function converts a number from one unit type (e.g. Yards) to
  2561. // another unit type (e.g. Meters). The syntax of the function is:
  2562. //
  2563. // CONVERT(number,from_unit,to_unit)
  2564. func (fn *formulaFuncs) CONVERT(argsList *list.List) formulaArg {
  2565. if argsList.Len() != 3 {
  2566. return newErrorFormulaArg(formulaErrorVALUE, "CONVERT requires 3 arguments")
  2567. }
  2568. num := argsList.Front().Value.(formulaArg).ToNumber()
  2569. if num.Type != ArgNumber {
  2570. return num
  2571. }
  2572. fromUOM, fromCategory, fromMultiplier, ok1 := getUnitDetails(argsList.Front().Next().Value.(formulaArg).Value())
  2573. toUOM, toCategory, toMultiplier, ok2 := getUnitDetails(argsList.Back().Value.(formulaArg).Value())
  2574. if !ok1 || !ok2 || fromCategory != toCategory {
  2575. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  2576. }
  2577. val := num.Number * fromMultiplier
  2578. if fromUOM == toUOM && fromMultiplier == toMultiplier {
  2579. return newNumberFormulaArg(val / fromMultiplier)
  2580. } else if fromUOM == toUOM {
  2581. return newNumberFormulaArg(val / toMultiplier)
  2582. } else if fromCategory == categoryTemperature {
  2583. return newNumberFormulaArg(convertTemperature(fromUOM, toUOM, val))
  2584. }
  2585. fromConversion := unitConversions[fromCategory][fromUOM]
  2586. toConversion := unitConversions[fromCategory][toUOM]
  2587. baseValue := val * (1 / fromConversion)
  2588. return newNumberFormulaArg((baseValue * toConversion) / toMultiplier)
  2589. }
  2590. // DEC2BIN function converts a decimal number into a Binary (Base 2) number.
  2591. // The syntax of the function is:
  2592. //
  2593. // DEC2BIN(number,[places])
  2594. func (fn *formulaFuncs) DEC2BIN(argsList *list.List) formulaArg {
  2595. return fn.dec2x("DEC2BIN", argsList)
  2596. }
  2597. // DEC2HEX function converts a decimal number into a Hexadecimal (Base 16)
  2598. // number. The syntax of the function is:
  2599. //
  2600. // DEC2HEX(number,[places])
  2601. func (fn *formulaFuncs) DEC2HEX(argsList *list.List) formulaArg {
  2602. return fn.dec2x("DEC2HEX", argsList)
  2603. }
  2604. // DEC2OCT function converts a decimal number into an Octal (Base 8) number.
  2605. // The syntax of the function is:
  2606. //
  2607. // DEC2OCT(number,[places])
  2608. func (fn *formulaFuncs) DEC2OCT(argsList *list.List) formulaArg {
  2609. return fn.dec2x("DEC2OCT", argsList)
  2610. }
  2611. // dec2x is an implementation of the formula functions DEC2BIN, DEC2HEX and
  2612. // DEC2OCT.
  2613. func (fn *formulaFuncs) dec2x(name string, argsList *list.List) formulaArg {
  2614. if argsList.Len() < 1 {
  2615. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at least 1 argument", name))
  2616. }
  2617. if argsList.Len() > 2 {
  2618. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s allows at most 2 arguments", name))
  2619. }
  2620. decimal := argsList.Front().Value.(formulaArg).ToNumber()
  2621. if decimal.Type != ArgNumber {
  2622. return newErrorFormulaArg(formulaErrorVALUE, decimal.Error)
  2623. }
  2624. maxLimitMap := map[string]float64{
  2625. "DEC2BIN": 511,
  2626. "HEX2BIN": 511,
  2627. "OCT2BIN": 511,
  2628. "BIN2HEX": 549755813887,
  2629. "DEC2HEX": 549755813887,
  2630. "OCT2HEX": 549755813887,
  2631. "BIN2OCT": 536870911,
  2632. "DEC2OCT": 536870911,
  2633. "HEX2OCT": 536870911,
  2634. }
  2635. minLimitMap := map[string]float64{
  2636. "DEC2BIN": -512,
  2637. "HEX2BIN": -512,
  2638. "OCT2BIN": -512,
  2639. "BIN2HEX": -549755813888,
  2640. "DEC2HEX": -549755813888,
  2641. "OCT2HEX": -549755813888,
  2642. "BIN2OCT": -536870912,
  2643. "DEC2OCT": -536870912,
  2644. "HEX2OCT": -536870912,
  2645. }
  2646. baseMap := map[string]int{
  2647. "DEC2BIN": 2,
  2648. "HEX2BIN": 2,
  2649. "OCT2BIN": 2,
  2650. "BIN2HEX": 16,
  2651. "DEC2HEX": 16,
  2652. "OCT2HEX": 16,
  2653. "BIN2OCT": 8,
  2654. "DEC2OCT": 8,
  2655. "HEX2OCT": 8,
  2656. }
  2657. maxLimit, minLimit := maxLimitMap[name], minLimitMap[name]
  2658. base := baseMap[name]
  2659. if decimal.Number < minLimit || decimal.Number > maxLimit {
  2660. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  2661. }
  2662. n := int64(decimal.Number)
  2663. binary := strconv.FormatUint(*(*uint64)(unsafe.Pointer(&n)), base)
  2664. if argsList.Len() == 2 {
  2665. places := argsList.Back().Value.(formulaArg).ToNumber()
  2666. if places.Type != ArgNumber {
  2667. return newErrorFormulaArg(formulaErrorVALUE, places.Error)
  2668. }
  2669. binaryPlaces := len(binary)
  2670. if places.Number < 0 || places.Number > 10 || binaryPlaces > int(places.Number) {
  2671. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  2672. }
  2673. return newStringFormulaArg(strings.ToUpper(fmt.Sprintf("%s%s", strings.Repeat("0", int(places.Number)-binaryPlaces), binary)))
  2674. }
  2675. if decimal.Number < 0 && len(binary) > 10 {
  2676. return newStringFormulaArg(strings.ToUpper(binary[len(binary)-10:]))
  2677. }
  2678. return newStringFormulaArg(strings.ToUpper(binary))
  2679. }
  2680. // DELTA function tests two numbers for equality and returns the Kronecker
  2681. // Delta. i.e. the function returns 1 if the two supplied numbers are equal
  2682. // and 0 otherwise. The syntax of the function is:
  2683. //
  2684. // DELTA(number1,[number2])
  2685. func (fn *formulaFuncs) DELTA(argsList *list.List) formulaArg {
  2686. if argsList.Len() < 1 {
  2687. return newErrorFormulaArg(formulaErrorVALUE, "DELTA requires at least 1 argument")
  2688. }
  2689. if argsList.Len() > 2 {
  2690. return newErrorFormulaArg(formulaErrorVALUE, "DELTA allows at most 2 arguments")
  2691. }
  2692. number1 := argsList.Front().Value.(formulaArg).ToNumber()
  2693. if number1.Type != ArgNumber {
  2694. return number1
  2695. }
  2696. number2 := newNumberFormulaArg(0)
  2697. if argsList.Len() == 2 {
  2698. if number2 = argsList.Back().Value.(formulaArg).ToNumber(); number2.Type != ArgNumber {
  2699. return number2
  2700. }
  2701. }
  2702. return newBoolFormulaArg(number1.Number == number2.Number).ToNumber()
  2703. }
  2704. // ERF function calculates the Error Function, integrated between two supplied
  2705. // limits. The syntax of the function is:
  2706. //
  2707. // ERF(lower_limit,[upper_limit])
  2708. func (fn *formulaFuncs) ERF(argsList *list.List) formulaArg {
  2709. if argsList.Len() < 1 {
  2710. return newErrorFormulaArg(formulaErrorVALUE, "ERF requires at least 1 argument")
  2711. }
  2712. if argsList.Len() > 2 {
  2713. return newErrorFormulaArg(formulaErrorVALUE, "ERF allows at most 2 arguments")
  2714. }
  2715. lower := argsList.Front().Value.(formulaArg).ToNumber()
  2716. if lower.Type != ArgNumber {
  2717. return lower
  2718. }
  2719. if argsList.Len() == 2 {
  2720. upper := argsList.Back().Value.(formulaArg).ToNumber()
  2721. if upper.Type != ArgNumber {
  2722. return upper
  2723. }
  2724. return newNumberFormulaArg(math.Erf(upper.Number) - math.Erf(lower.Number))
  2725. }
  2726. return newNumberFormulaArg(math.Erf(lower.Number))
  2727. }
  2728. // ERFdotPRECISE function calculates the Error Function, integrated between a
  2729. // supplied lower or upper limit and 0. The syntax of the function is:
  2730. //
  2731. // ERF.PRECISE(x)
  2732. func (fn *formulaFuncs) ERFdotPRECISE(argsList *list.List) formulaArg {
  2733. if argsList.Len() != 1 {
  2734. return newErrorFormulaArg(formulaErrorVALUE, "ERF.PRECISE requires 1 argument")
  2735. }
  2736. x := argsList.Front().Value.(formulaArg).ToNumber()
  2737. if x.Type != ArgNumber {
  2738. return x
  2739. }
  2740. return newNumberFormulaArg(math.Erf(x.Number))
  2741. }
  2742. // erfc is an implementation of the formula functions ERFC and ERFC.PRECISE.
  2743. func (fn *formulaFuncs) erfc(name string, argsList *list.List) formulaArg {
  2744. if argsList.Len() != 1 {
  2745. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 1 argument", name))
  2746. }
  2747. x := argsList.Front().Value.(formulaArg).ToNumber()
  2748. if x.Type != ArgNumber {
  2749. return x
  2750. }
  2751. return newNumberFormulaArg(math.Erfc(x.Number))
  2752. }
  2753. // ERFC function calculates the Complementary Error Function, integrated
  2754. // between a supplied lower limit and infinity. The syntax of the function
  2755. // is:
  2756. //
  2757. // ERFC(x)
  2758. func (fn *formulaFuncs) ERFC(argsList *list.List) formulaArg {
  2759. return fn.erfc("ERFC", argsList)
  2760. }
  2761. // ERFCdotPRECISE function calculates the Complementary Error Function,
  2762. // integrated between a supplied lower limit and infinity. The syntax of the
  2763. // function is:
  2764. //
  2765. // ERFC(x)
  2766. func (fn *formulaFuncs) ERFCdotPRECISE(argsList *list.List) formulaArg {
  2767. return fn.erfc("ERFC.PRECISE", argsList)
  2768. }
  2769. // GESTEP unction tests whether a supplied number is greater than a supplied
  2770. // step size and returns. The syntax of the function is:
  2771. //
  2772. // GESTEP(number,[step])
  2773. func (fn *formulaFuncs) GESTEP(argsList *list.List) formulaArg {
  2774. if argsList.Len() < 1 {
  2775. return newErrorFormulaArg(formulaErrorVALUE, "GESTEP requires at least 1 argument")
  2776. }
  2777. if argsList.Len() > 2 {
  2778. return newErrorFormulaArg(formulaErrorVALUE, "GESTEP allows at most 2 arguments")
  2779. }
  2780. number := argsList.Front().Value.(formulaArg).ToNumber()
  2781. if number.Type != ArgNumber {
  2782. return number
  2783. }
  2784. step := newNumberFormulaArg(0)
  2785. if argsList.Len() == 2 {
  2786. if step = argsList.Back().Value.(formulaArg).ToNumber(); step.Type != ArgNumber {
  2787. return step
  2788. }
  2789. }
  2790. return newBoolFormulaArg(number.Number >= step.Number).ToNumber()
  2791. }
  2792. // HEX2BIN function converts a Hexadecimal (Base 16) number into a Binary
  2793. // (Base 2) number. The syntax of the function is:
  2794. //
  2795. // HEX2BIN(number,[places])
  2796. func (fn *formulaFuncs) HEX2BIN(argsList *list.List) formulaArg {
  2797. if argsList.Len() < 1 {
  2798. return newErrorFormulaArg(formulaErrorVALUE, "HEX2BIN requires at least 1 argument")
  2799. }
  2800. if argsList.Len() > 2 {
  2801. return newErrorFormulaArg(formulaErrorVALUE, "HEX2BIN allows at most 2 arguments")
  2802. }
  2803. decimal, newList := fn.hex2dec(argsList.Front().Value.(formulaArg).Value()), list.New()
  2804. if decimal.Type != ArgNumber {
  2805. return decimal
  2806. }
  2807. newList.PushBack(decimal)
  2808. if argsList.Len() == 2 {
  2809. newList.PushBack(argsList.Back().Value.(formulaArg))
  2810. }
  2811. return fn.dec2x("HEX2BIN", newList)
  2812. }
  2813. // HEX2DEC function converts a hexadecimal (a base-16 number) into a decimal
  2814. // number. The syntax of the function is:
  2815. //
  2816. // HEX2DEC(number)
  2817. func (fn *formulaFuncs) HEX2DEC(argsList *list.List) formulaArg {
  2818. if argsList.Len() != 1 {
  2819. return newErrorFormulaArg(formulaErrorVALUE, "HEX2DEC requires 1 numeric argument")
  2820. }
  2821. return fn.hex2dec(argsList.Front().Value.(formulaArg).Value())
  2822. }
  2823. // HEX2OCT function converts a Hexadecimal (Base 16) number into an Octal
  2824. // (Base 8) number. The syntax of the function is:
  2825. //
  2826. // HEX2OCT(number,[places])
  2827. func (fn *formulaFuncs) HEX2OCT(argsList *list.List) formulaArg {
  2828. if argsList.Len() < 1 {
  2829. return newErrorFormulaArg(formulaErrorVALUE, "HEX2OCT requires at least 1 argument")
  2830. }
  2831. if argsList.Len() > 2 {
  2832. return newErrorFormulaArg(formulaErrorVALUE, "HEX2OCT allows at most 2 arguments")
  2833. }
  2834. decimal, newList := fn.hex2dec(argsList.Front().Value.(formulaArg).Value()), list.New()
  2835. if decimal.Type != ArgNumber {
  2836. return decimal
  2837. }
  2838. newList.PushBack(decimal)
  2839. if argsList.Len() == 2 {
  2840. newList.PushBack(argsList.Back().Value.(formulaArg))
  2841. }
  2842. return fn.dec2x("HEX2OCT", newList)
  2843. }
  2844. // hex2dec is an implementation of the formula function HEX2DEC.
  2845. func (fn *formulaFuncs) hex2dec(number string) formulaArg {
  2846. decimal, length := 0.0, len(number)
  2847. for i := length; i > 0; i-- {
  2848. num, err := strconv.ParseInt(string(number[length-i]), 16, 64)
  2849. if err != nil {
  2850. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  2851. }
  2852. if i == 10 && string(number[length-i]) == "F" {
  2853. decimal += math.Pow(-16.0, float64(i-1))
  2854. continue
  2855. }
  2856. decimal += float64(num) * math.Pow(16.0, float64(i-1))
  2857. }
  2858. return newNumberFormulaArg(decimal)
  2859. }
  2860. // IMABS function returns the absolute value (the modulus) of a complex
  2861. // number. The syntax of the function is:
  2862. //
  2863. // IMABS(inumber)
  2864. func (fn *formulaFuncs) IMABS(argsList *list.List) formulaArg {
  2865. if argsList.Len() != 1 {
  2866. return newErrorFormulaArg(formulaErrorVALUE, "IMABS requires 1 argument")
  2867. }
  2868. value := argsList.Front().Value.(formulaArg).Value()
  2869. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  2870. if err != nil {
  2871. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  2872. }
  2873. return newNumberFormulaArg(cmplx.Abs(inumber))
  2874. }
  2875. // IMAGINARY function returns the imaginary coefficient of a supplied complex
  2876. // number. The syntax of the function is:
  2877. //
  2878. // IMAGINARY(inumber)
  2879. func (fn *formulaFuncs) IMAGINARY(argsList *list.List) formulaArg {
  2880. if argsList.Len() != 1 {
  2881. return newErrorFormulaArg(formulaErrorVALUE, "IMAGINARY requires 1 argument")
  2882. }
  2883. value := argsList.Front().Value.(formulaArg).Value()
  2884. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  2885. if err != nil {
  2886. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  2887. }
  2888. return newNumberFormulaArg(imag(inumber))
  2889. }
  2890. // IMARGUMENT function returns the phase (also called the argument) of a
  2891. // supplied complex number. The syntax of the function is:
  2892. //
  2893. // IMARGUMENT(inumber)
  2894. func (fn *formulaFuncs) IMARGUMENT(argsList *list.List) formulaArg {
  2895. if argsList.Len() != 1 {
  2896. return newErrorFormulaArg(formulaErrorVALUE, "IMARGUMENT requires 1 argument")
  2897. }
  2898. value := argsList.Front().Value.(formulaArg).Value()
  2899. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  2900. if err != nil {
  2901. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  2902. }
  2903. return newNumberFormulaArg(cmplx.Phase(inumber))
  2904. }
  2905. // IMCONJUGATE function returns the complex conjugate of a supplied complex
  2906. // number. The syntax of the function is:
  2907. //
  2908. // IMCONJUGATE(inumber)
  2909. func (fn *formulaFuncs) IMCONJUGATE(argsList *list.List) formulaArg {
  2910. if argsList.Len() != 1 {
  2911. return newErrorFormulaArg(formulaErrorVALUE, "IMCONJUGATE requires 1 argument")
  2912. }
  2913. value := argsList.Front().Value.(formulaArg).Value()
  2914. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  2915. if err != nil {
  2916. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  2917. }
  2918. return newStringFormulaArg(cmplx2str(cmplx.Conj(inumber), value[len(value)-1:]))
  2919. }
  2920. // IMCOS function returns the cosine of a supplied complex number. The syntax
  2921. // of the function is:
  2922. //
  2923. // IMCOS(inumber)
  2924. func (fn *formulaFuncs) IMCOS(argsList *list.List) formulaArg {
  2925. if argsList.Len() != 1 {
  2926. return newErrorFormulaArg(formulaErrorVALUE, "IMCOS requires 1 argument")
  2927. }
  2928. value := argsList.Front().Value.(formulaArg).Value()
  2929. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  2930. if err != nil {
  2931. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  2932. }
  2933. return newStringFormulaArg(cmplx2str(cmplx.Cos(inumber), value[len(value)-1:]))
  2934. }
  2935. // IMCOSH function returns the hyperbolic cosine of a supplied complex number. The syntax
  2936. // of the function is:
  2937. //
  2938. // IMCOSH(inumber)
  2939. func (fn *formulaFuncs) IMCOSH(argsList *list.List) formulaArg {
  2940. if argsList.Len() != 1 {
  2941. return newErrorFormulaArg(formulaErrorVALUE, "IMCOSH requires 1 argument")
  2942. }
  2943. value := argsList.Front().Value.(formulaArg).Value()
  2944. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  2945. if err != nil {
  2946. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  2947. }
  2948. return newStringFormulaArg(cmplx2str(cmplx.Cosh(inumber), value[len(value)-1:]))
  2949. }
  2950. // IMCOT function returns the cotangent of a supplied complex number. The syntax
  2951. // of the function is:
  2952. //
  2953. // IMCOT(inumber)
  2954. func (fn *formulaFuncs) IMCOT(argsList *list.List) formulaArg {
  2955. if argsList.Len() != 1 {
  2956. return newErrorFormulaArg(formulaErrorVALUE, "IMCOT requires 1 argument")
  2957. }
  2958. value := argsList.Front().Value.(formulaArg).Value()
  2959. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  2960. if err != nil {
  2961. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  2962. }
  2963. return newStringFormulaArg(cmplx2str(cmplx.Cot(inumber), value[len(value)-1:]))
  2964. }
  2965. // IMCSC function returns the cosecant of a supplied complex number. The syntax
  2966. // of the function is:
  2967. //
  2968. // IMCSC(inumber)
  2969. func (fn *formulaFuncs) IMCSC(argsList *list.List) formulaArg {
  2970. if argsList.Len() != 1 {
  2971. return newErrorFormulaArg(formulaErrorVALUE, "IMCSC requires 1 argument")
  2972. }
  2973. value := argsList.Front().Value.(formulaArg).Value()
  2974. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  2975. if err != nil {
  2976. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  2977. }
  2978. num := 1 / cmplx.Sin(inumber)
  2979. if cmplx.IsInf(num) {
  2980. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  2981. }
  2982. return newStringFormulaArg(cmplx2str(num, value[len(value)-1:]))
  2983. }
  2984. // IMCSCH function returns the hyperbolic cosecant of a supplied complex
  2985. // number. The syntax of the function is:
  2986. //
  2987. // IMCSCH(inumber)
  2988. func (fn *formulaFuncs) IMCSCH(argsList *list.List) formulaArg {
  2989. if argsList.Len() != 1 {
  2990. return newErrorFormulaArg(formulaErrorVALUE, "IMCSCH requires 1 argument")
  2991. }
  2992. value := argsList.Front().Value.(formulaArg).Value()
  2993. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  2994. if err != nil {
  2995. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  2996. }
  2997. num := 1 / cmplx.Sinh(inumber)
  2998. if cmplx.IsInf(num) {
  2999. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  3000. }
  3001. return newStringFormulaArg(cmplx2str(num, value[len(value)-1:]))
  3002. }
  3003. // IMDIV function calculates the quotient of two complex numbers (i.e. divides
  3004. // one complex number by another). The syntax of the function is:
  3005. //
  3006. // IMDIV(inumber1,inumber2)
  3007. func (fn *formulaFuncs) IMDIV(argsList *list.List) formulaArg {
  3008. if argsList.Len() != 2 {
  3009. return newErrorFormulaArg(formulaErrorVALUE, "IMDIV requires 2 arguments")
  3010. }
  3011. value := argsList.Front().Value.(formulaArg).Value()
  3012. inumber1, err := strconv.ParseComplex(str2cmplx(value), 128)
  3013. if err != nil {
  3014. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3015. }
  3016. inumber2, err := strconv.ParseComplex(str2cmplx(argsList.Back().Value.(formulaArg).Value()), 128)
  3017. if err != nil {
  3018. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3019. }
  3020. num := inumber1 / inumber2
  3021. if cmplx.IsInf(num) {
  3022. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  3023. }
  3024. return newStringFormulaArg(cmplx2str(num, value[len(value)-1:]))
  3025. }
  3026. // IMEXP function returns the exponential of a supplied complex number. The
  3027. // syntax of the function is:
  3028. //
  3029. // IMEXP(inumber)
  3030. func (fn *formulaFuncs) IMEXP(argsList *list.List) formulaArg {
  3031. if argsList.Len() != 1 {
  3032. return newErrorFormulaArg(formulaErrorVALUE, "IMEXP requires 1 argument")
  3033. }
  3034. value := argsList.Front().Value.(formulaArg).Value()
  3035. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  3036. if err != nil {
  3037. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3038. }
  3039. return newStringFormulaArg(cmplx2str(cmplx.Exp(inumber), value[len(value)-1:]))
  3040. }
  3041. // IMLN function returns the natural logarithm of a supplied complex number.
  3042. // The syntax of the function is:
  3043. //
  3044. // IMLN(inumber)
  3045. func (fn *formulaFuncs) IMLN(argsList *list.List) formulaArg {
  3046. if argsList.Len() != 1 {
  3047. return newErrorFormulaArg(formulaErrorVALUE, "IMLN requires 1 argument")
  3048. }
  3049. value := argsList.Front().Value.(formulaArg).Value()
  3050. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  3051. if err != nil {
  3052. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3053. }
  3054. num := cmplx.Log(inumber)
  3055. if cmplx.IsInf(num) {
  3056. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  3057. }
  3058. return newStringFormulaArg(cmplx2str(num, value[len(value)-1:]))
  3059. }
  3060. // IMLOG10 function returns the common (base 10) logarithm of a supplied
  3061. // complex number. The syntax of the function is:
  3062. //
  3063. // IMLOG10(inumber)
  3064. func (fn *formulaFuncs) IMLOG10(argsList *list.List) formulaArg {
  3065. if argsList.Len() != 1 {
  3066. return newErrorFormulaArg(formulaErrorVALUE, "IMLOG10 requires 1 argument")
  3067. }
  3068. value := argsList.Front().Value.(formulaArg).Value()
  3069. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  3070. if err != nil {
  3071. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3072. }
  3073. num := cmplx.Log10(inumber)
  3074. if cmplx.IsInf(num) {
  3075. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  3076. }
  3077. return newStringFormulaArg(cmplx2str(num, value[len(value)-1:]))
  3078. }
  3079. // IMLOG2 function calculates the base 2 logarithm of a supplied complex
  3080. // number. The syntax of the function is:
  3081. //
  3082. // IMLOG2(inumber)
  3083. func (fn *formulaFuncs) IMLOG2(argsList *list.List) formulaArg {
  3084. if argsList.Len() != 1 {
  3085. return newErrorFormulaArg(formulaErrorVALUE, "IMLOG2 requires 1 argument")
  3086. }
  3087. value := argsList.Front().Value.(formulaArg).Value()
  3088. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  3089. if err != nil {
  3090. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3091. }
  3092. num := cmplx.Log(inumber)
  3093. if cmplx.IsInf(num) {
  3094. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  3095. }
  3096. return newStringFormulaArg(cmplx2str(num/cmplx.Log(2), value[len(value)-1:]))
  3097. }
  3098. // IMPOWER function returns a supplied complex number, raised to a given
  3099. // power. The syntax of the function is:
  3100. //
  3101. // IMPOWER(inumber,number)
  3102. func (fn *formulaFuncs) IMPOWER(argsList *list.List) formulaArg {
  3103. if argsList.Len() != 2 {
  3104. return newErrorFormulaArg(formulaErrorVALUE, "IMPOWER requires 2 arguments")
  3105. }
  3106. value := argsList.Front().Value.(formulaArg).Value()
  3107. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  3108. if err != nil {
  3109. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3110. }
  3111. number, err := strconv.ParseComplex(str2cmplx(argsList.Back().Value.(formulaArg).Value()), 128)
  3112. if err != nil {
  3113. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3114. }
  3115. if inumber == 0 && number == 0 {
  3116. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  3117. }
  3118. num := cmplx.Pow(inumber, number)
  3119. if cmplx.IsInf(num) {
  3120. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  3121. }
  3122. return newStringFormulaArg(cmplx2str(num, value[len(value)-1:]))
  3123. }
  3124. // IMPRODUCT function calculates the product of two or more complex numbers.
  3125. // The syntax of the function is:
  3126. //
  3127. // IMPRODUCT(number1,[number2],...)
  3128. func (fn *formulaFuncs) IMPRODUCT(argsList *list.List) formulaArg {
  3129. product := complex128(1)
  3130. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  3131. token := arg.Value.(formulaArg)
  3132. switch token.Type {
  3133. case ArgString:
  3134. if token.Value() == "" {
  3135. continue
  3136. }
  3137. val, err := strconv.ParseComplex(str2cmplx(token.Value()), 128)
  3138. if err != nil {
  3139. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3140. }
  3141. product = product * val
  3142. case ArgNumber:
  3143. product = product * complex(token.Number, 0)
  3144. case ArgMatrix:
  3145. for _, row := range token.Matrix {
  3146. for _, value := range row {
  3147. if value.Value() == "" {
  3148. continue
  3149. }
  3150. val, err := strconv.ParseComplex(str2cmplx(value.Value()), 128)
  3151. if err != nil {
  3152. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3153. }
  3154. product = product * val
  3155. }
  3156. }
  3157. }
  3158. }
  3159. return newStringFormulaArg(cmplx2str(product, "i"))
  3160. }
  3161. // IMREAL function returns the real coefficient of a supplied complex number.
  3162. // The syntax of the function is:
  3163. //
  3164. // IMREAL(inumber)
  3165. func (fn *formulaFuncs) IMREAL(argsList *list.List) formulaArg {
  3166. if argsList.Len() != 1 {
  3167. return newErrorFormulaArg(formulaErrorVALUE, "IMREAL requires 1 argument")
  3168. }
  3169. value := argsList.Front().Value.(formulaArg).Value()
  3170. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  3171. if err != nil {
  3172. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3173. }
  3174. return newStringFormulaArg(fmt.Sprint(real(inumber)))
  3175. }
  3176. // IMSEC function returns the secant of a supplied complex number. The syntax
  3177. // of the function is:
  3178. //
  3179. // IMSEC(inumber)
  3180. func (fn *formulaFuncs) IMSEC(argsList *list.List) formulaArg {
  3181. if argsList.Len() != 1 {
  3182. return newErrorFormulaArg(formulaErrorVALUE, "IMSEC requires 1 argument")
  3183. }
  3184. value := argsList.Front().Value.(formulaArg).Value()
  3185. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  3186. if err != nil {
  3187. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3188. }
  3189. return newStringFormulaArg(cmplx2str(1/cmplx.Cos(inumber), value[len(value)-1:]))
  3190. }
  3191. // IMSECH function returns the hyperbolic secant of a supplied complex number.
  3192. // The syntax of the function is:
  3193. //
  3194. // IMSECH(inumber)
  3195. func (fn *formulaFuncs) IMSECH(argsList *list.List) formulaArg {
  3196. if argsList.Len() != 1 {
  3197. return newErrorFormulaArg(formulaErrorVALUE, "IMSECH requires 1 argument")
  3198. }
  3199. value := argsList.Front().Value.(formulaArg).Value()
  3200. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  3201. if err != nil {
  3202. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3203. }
  3204. return newStringFormulaArg(cmplx2str(1/cmplx.Cosh(inumber), value[len(value)-1:]))
  3205. }
  3206. // IMSIN function returns the Sine of a supplied complex number. The syntax of
  3207. // the function is:
  3208. //
  3209. // IMSIN(inumber)
  3210. func (fn *formulaFuncs) IMSIN(argsList *list.List) formulaArg {
  3211. if argsList.Len() != 1 {
  3212. return newErrorFormulaArg(formulaErrorVALUE, "IMSIN requires 1 argument")
  3213. }
  3214. value := argsList.Front().Value.(formulaArg).Value()
  3215. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  3216. if err != nil {
  3217. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3218. }
  3219. return newStringFormulaArg(cmplx2str(cmplx.Sin(inumber), value[len(value)-1:]))
  3220. }
  3221. // IMSINH function returns the hyperbolic sine of a supplied complex number.
  3222. // The syntax of the function is:
  3223. //
  3224. // IMSINH(inumber)
  3225. func (fn *formulaFuncs) IMSINH(argsList *list.List) formulaArg {
  3226. if argsList.Len() != 1 {
  3227. return newErrorFormulaArg(formulaErrorVALUE, "IMSINH requires 1 argument")
  3228. }
  3229. value := argsList.Front().Value.(formulaArg).Value()
  3230. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  3231. if err != nil {
  3232. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3233. }
  3234. return newStringFormulaArg(cmplx2str(cmplx.Sinh(inumber), value[len(value)-1:]))
  3235. }
  3236. // IMSQRT function returns the square root of a supplied complex number. The
  3237. // syntax of the function is:
  3238. //
  3239. // IMSQRT(inumber)
  3240. func (fn *formulaFuncs) IMSQRT(argsList *list.List) formulaArg {
  3241. if argsList.Len() != 1 {
  3242. return newErrorFormulaArg(formulaErrorVALUE, "IMSQRT requires 1 argument")
  3243. }
  3244. value := argsList.Front().Value.(formulaArg).Value()
  3245. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  3246. if err != nil {
  3247. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3248. }
  3249. return newStringFormulaArg(cmplx2str(cmplx.Sqrt(inumber), value[len(value)-1:]))
  3250. }
  3251. // IMSUB function calculates the difference between two complex numbers
  3252. // (i.e. subtracts one complex number from another). The syntax of the
  3253. // function is:
  3254. //
  3255. // IMSUB(inumber1,inumber2)
  3256. func (fn *formulaFuncs) IMSUB(argsList *list.List) formulaArg {
  3257. if argsList.Len() != 2 {
  3258. return newErrorFormulaArg(formulaErrorVALUE, "IMSUB requires 2 arguments")
  3259. }
  3260. i1, err := strconv.ParseComplex(str2cmplx(argsList.Front().Value.(formulaArg).Value()), 128)
  3261. if err != nil {
  3262. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3263. }
  3264. i2, err := strconv.ParseComplex(str2cmplx(argsList.Back().Value.(formulaArg).Value()), 128)
  3265. if err != nil {
  3266. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3267. }
  3268. return newStringFormulaArg(cmplx2str(i1-i2, "i"))
  3269. }
  3270. // IMSUM function calculates the sum of two or more complex numbers. The
  3271. // syntax of the function is:
  3272. //
  3273. // IMSUM(inumber1,inumber2,...)
  3274. func (fn *formulaFuncs) IMSUM(argsList *list.List) formulaArg {
  3275. if argsList.Len() < 1 {
  3276. return newErrorFormulaArg(formulaErrorVALUE, "IMSUM requires at least 1 argument")
  3277. }
  3278. var result complex128
  3279. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  3280. token := arg.Value.(formulaArg)
  3281. num, err := strconv.ParseComplex(str2cmplx(token.Value()), 128)
  3282. if err != nil {
  3283. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3284. }
  3285. result += num
  3286. }
  3287. return newStringFormulaArg(cmplx2str(result, "i"))
  3288. }
  3289. // IMTAN function returns the tangent of a supplied complex number. The syntax
  3290. // of the function is:
  3291. //
  3292. // IMTAN(inumber)
  3293. func (fn *formulaFuncs) IMTAN(argsList *list.List) formulaArg {
  3294. if argsList.Len() != 1 {
  3295. return newErrorFormulaArg(formulaErrorVALUE, "IMTAN requires 1 argument")
  3296. }
  3297. value := argsList.Front().Value.(formulaArg).Value()
  3298. inumber, err := strconv.ParseComplex(str2cmplx(value), 128)
  3299. if err != nil {
  3300. return newErrorFormulaArg(formulaErrorNUM, err.Error())
  3301. }
  3302. return newStringFormulaArg(cmplx2str(cmplx.Tan(inumber), value[len(value)-1:]))
  3303. }
  3304. // OCT2BIN function converts an Octal (Base 8) number into a Binary (Base 2)
  3305. // number. The syntax of the function is:
  3306. //
  3307. // OCT2BIN(number,[places])
  3308. func (fn *formulaFuncs) OCT2BIN(argsList *list.List) formulaArg {
  3309. if argsList.Len() < 1 {
  3310. return newErrorFormulaArg(formulaErrorVALUE, "OCT2BIN requires at least 1 argument")
  3311. }
  3312. if argsList.Len() > 2 {
  3313. return newErrorFormulaArg(formulaErrorVALUE, "OCT2BIN allows at most 2 arguments")
  3314. }
  3315. token := argsList.Front().Value.(formulaArg)
  3316. number := token.ToNumber()
  3317. if number.Type != ArgNumber {
  3318. return newErrorFormulaArg(formulaErrorVALUE, number.Error)
  3319. }
  3320. decimal, newList := fn.oct2dec(token.Value()), list.New()
  3321. newList.PushBack(decimal)
  3322. if argsList.Len() == 2 {
  3323. newList.PushBack(argsList.Back().Value.(formulaArg))
  3324. }
  3325. return fn.dec2x("OCT2BIN", newList)
  3326. }
  3327. // OCT2DEC function converts an Octal (a base-8 number) into a decimal number.
  3328. // The syntax of the function is:
  3329. //
  3330. // OCT2DEC(number)
  3331. func (fn *formulaFuncs) OCT2DEC(argsList *list.List) formulaArg {
  3332. if argsList.Len() != 1 {
  3333. return newErrorFormulaArg(formulaErrorVALUE, "OCT2DEC requires 1 numeric argument")
  3334. }
  3335. token := argsList.Front().Value.(formulaArg)
  3336. number := token.ToNumber()
  3337. if number.Type != ArgNumber {
  3338. return newErrorFormulaArg(formulaErrorVALUE, number.Error)
  3339. }
  3340. return fn.oct2dec(token.Value())
  3341. }
  3342. // OCT2HEX function converts an Octal (Base 8) number into a Hexadecimal
  3343. // (Base 16) number. The syntax of the function is:
  3344. //
  3345. // OCT2HEX(number,[places])
  3346. func (fn *formulaFuncs) OCT2HEX(argsList *list.List) formulaArg {
  3347. if argsList.Len() < 1 {
  3348. return newErrorFormulaArg(formulaErrorVALUE, "OCT2HEX requires at least 1 argument")
  3349. }
  3350. if argsList.Len() > 2 {
  3351. return newErrorFormulaArg(formulaErrorVALUE, "OCT2HEX allows at most 2 arguments")
  3352. }
  3353. token := argsList.Front().Value.(formulaArg)
  3354. number := token.ToNumber()
  3355. if number.Type != ArgNumber {
  3356. return newErrorFormulaArg(formulaErrorVALUE, number.Error)
  3357. }
  3358. decimal, newList := fn.oct2dec(token.Value()), list.New()
  3359. newList.PushBack(decimal)
  3360. if argsList.Len() == 2 {
  3361. newList.PushBack(argsList.Back().Value.(formulaArg))
  3362. }
  3363. return fn.dec2x("OCT2HEX", newList)
  3364. }
  3365. // oct2dec is an implementation of the formula function OCT2DEC.
  3366. func (fn *formulaFuncs) oct2dec(number string) formulaArg {
  3367. decimal, length := 0.0, len(number)
  3368. for i := length; i > 0; i-- {
  3369. num, _ := strconv.Atoi(string(number[length-i]))
  3370. if i == 10 && string(number[length-i]) == "7" {
  3371. decimal += math.Pow(-8.0, float64(i-1))
  3372. continue
  3373. }
  3374. decimal += float64(num) * math.Pow(8.0, float64(i-1))
  3375. }
  3376. return newNumberFormulaArg(decimal)
  3377. }
  3378. // Math and Trigonometric Functions
  3379. // ABS function returns the absolute value of any supplied number. The syntax
  3380. // of the function is:
  3381. //
  3382. // ABS(number)
  3383. func (fn *formulaFuncs) ABS(argsList *list.List) formulaArg {
  3384. if argsList.Len() != 1 {
  3385. return newErrorFormulaArg(formulaErrorVALUE, "ABS requires 1 numeric argument")
  3386. }
  3387. arg := argsList.Front().Value.(formulaArg).ToNumber()
  3388. if arg.Type == ArgError {
  3389. return arg
  3390. }
  3391. return newNumberFormulaArg(math.Abs(arg.Number))
  3392. }
  3393. // ACOS function calculates the arccosine (i.e. the inverse cosine) of a given
  3394. // number, and returns an angle, in radians, between 0 and π. The syntax of
  3395. // the function is:
  3396. //
  3397. // ACOS(number)
  3398. func (fn *formulaFuncs) ACOS(argsList *list.List) formulaArg {
  3399. if argsList.Len() != 1 {
  3400. return newErrorFormulaArg(formulaErrorVALUE, "ACOS requires 1 numeric argument")
  3401. }
  3402. arg := argsList.Front().Value.(formulaArg).ToNumber()
  3403. if arg.Type == ArgError {
  3404. return arg
  3405. }
  3406. return newNumberFormulaArg(math.Acos(arg.Number))
  3407. }
  3408. // ACOSH function calculates the inverse hyperbolic cosine of a supplied number.
  3409. // of the function is:
  3410. //
  3411. // ACOSH(number)
  3412. func (fn *formulaFuncs) ACOSH(argsList *list.List) formulaArg {
  3413. if argsList.Len() != 1 {
  3414. return newErrorFormulaArg(formulaErrorVALUE, "ACOSH requires 1 numeric argument")
  3415. }
  3416. arg := argsList.Front().Value.(formulaArg).ToNumber()
  3417. if arg.Type == ArgError {
  3418. return arg
  3419. }
  3420. return newNumberFormulaArg(math.Acosh(arg.Number))
  3421. }
  3422. // ACOT function calculates the arccotangent (i.e. the inverse cotangent) of a
  3423. // given number, and returns an angle, in radians, between 0 and π. The syntax
  3424. // of the function is:
  3425. //
  3426. // ACOT(number)
  3427. func (fn *formulaFuncs) ACOT(argsList *list.List) formulaArg {
  3428. if argsList.Len() != 1 {
  3429. return newErrorFormulaArg(formulaErrorVALUE, "ACOT requires 1 numeric argument")
  3430. }
  3431. arg := argsList.Front().Value.(formulaArg).ToNumber()
  3432. if arg.Type == ArgError {
  3433. return arg
  3434. }
  3435. return newNumberFormulaArg(math.Pi/2 - math.Atan(arg.Number))
  3436. }
  3437. // ACOTH function calculates the hyperbolic arccotangent (coth) of a supplied
  3438. // value. The syntax of the function is:
  3439. //
  3440. // ACOTH(number)
  3441. func (fn *formulaFuncs) ACOTH(argsList *list.List) formulaArg {
  3442. if argsList.Len() != 1 {
  3443. return newErrorFormulaArg(formulaErrorVALUE, "ACOTH requires 1 numeric argument")
  3444. }
  3445. arg := argsList.Front().Value.(formulaArg).ToNumber()
  3446. if arg.Type == ArgError {
  3447. return arg
  3448. }
  3449. return newNumberFormulaArg(math.Atanh(1 / arg.Number))
  3450. }
  3451. // AGGREGATE function returns the result of a specified operation or function,
  3452. // applied to a list or database of values. The syntax of the function is:
  3453. //
  3454. // AGGREGATE(function_num,options,ref1,[ref2],...)
  3455. func (fn *formulaFuncs) AGGREGATE(argsList *list.List) formulaArg {
  3456. if argsList.Len() < 2 {
  3457. return newErrorFormulaArg(formulaErrorVALUE, "AGGREGATE requires at least 3 arguments")
  3458. }
  3459. var fnNum, opts formulaArg
  3460. if fnNum = argsList.Front().Value.(formulaArg).ToNumber(); fnNum.Type != ArgNumber {
  3461. return fnNum
  3462. }
  3463. subFn, ok := map[int]func(argsList *list.List) formulaArg{
  3464. 1: fn.AVERAGE,
  3465. 2: fn.COUNT,
  3466. 3: fn.COUNTA,
  3467. 4: fn.MAX,
  3468. 5: fn.MIN,
  3469. 6: fn.PRODUCT,
  3470. 7: fn.STDEVdotS,
  3471. 8: fn.STDEVdotP,
  3472. 9: fn.SUM,
  3473. 10: fn.VARdotS,
  3474. 11: fn.VARdotP,
  3475. 12: fn.MEDIAN,
  3476. 13: fn.MODEdotSNGL,
  3477. 14: fn.LARGE,
  3478. 15: fn.SMALL,
  3479. 16: fn.PERCENTILEdotINC,
  3480. 17: fn.QUARTILEdotINC,
  3481. 18: fn.PERCENTILEdotEXC,
  3482. 19: fn.QUARTILEdotEXC,
  3483. }[int(fnNum.Number)]
  3484. if !ok {
  3485. return newErrorFormulaArg(formulaErrorVALUE, "AGGREGATE has invalid function_num")
  3486. }
  3487. if opts = argsList.Front().Next().Value.(formulaArg).ToNumber(); opts.Type != ArgNumber {
  3488. return opts
  3489. }
  3490. // TODO: apply option argument values to be ignored during the calculation
  3491. if int(opts.Number) < 0 || int(opts.Number) > 7 {
  3492. return newErrorFormulaArg(formulaErrorVALUE, "AGGREGATE has invalid options")
  3493. }
  3494. subArgList := list.New().Init()
  3495. for arg := argsList.Front().Next().Next(); arg != nil; arg = arg.Next() {
  3496. subArgList.PushBack(arg.Value.(formulaArg))
  3497. }
  3498. return subFn(subArgList)
  3499. }
  3500. // ARABIC function converts a Roman numeral into an Arabic numeral. The syntax
  3501. // of the function is:
  3502. //
  3503. // ARABIC(text)
  3504. func (fn *formulaFuncs) ARABIC(argsList *list.List) formulaArg {
  3505. if argsList.Len() != 1 {
  3506. return newErrorFormulaArg(formulaErrorVALUE, "ARABIC requires 1 numeric argument")
  3507. }
  3508. text := argsList.Front().Value.(formulaArg).Value()
  3509. if len(text) > MaxFieldLength {
  3510. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  3511. }
  3512. text = strings.ToUpper(text)
  3513. number, actualStart, index, isNegative := 0, 0, len(text)-1, false
  3514. startIndex, subtractNumber, currentPartValue, currentCharValue, prevCharValue := 0, 0, 0, 0, -1
  3515. for index >= 0 && text[index] == ' ' {
  3516. index--
  3517. }
  3518. for actualStart <= index && text[actualStart] == ' ' {
  3519. actualStart++
  3520. }
  3521. if actualStart <= index && text[actualStart] == '-' {
  3522. isNegative = true
  3523. actualStart++
  3524. }
  3525. charMap := map[rune]int{'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
  3526. for index >= actualStart {
  3527. startIndex = index
  3528. startChar := text[startIndex]
  3529. index--
  3530. for index >= actualStart && (text[index]|' ') == startChar {
  3531. index--
  3532. }
  3533. currentCharValue = charMap[rune(startChar)]
  3534. currentPartValue = (startIndex - index) * currentCharValue
  3535. if currentCharValue >= prevCharValue {
  3536. number += currentPartValue - subtractNumber
  3537. prevCharValue = currentCharValue
  3538. subtractNumber = 0
  3539. continue
  3540. }
  3541. subtractNumber += currentPartValue
  3542. }
  3543. if subtractNumber != 0 {
  3544. number -= subtractNumber
  3545. }
  3546. if isNegative {
  3547. number = -number
  3548. }
  3549. return newNumberFormulaArg(float64(number))
  3550. }
  3551. // ASIN function calculates the arcsine (i.e. the inverse sine) of a given
  3552. // number, and returns an angle, in radians, between -π/2 and π/2. The syntax
  3553. // of the function is:
  3554. //
  3555. // ASIN(number)
  3556. func (fn *formulaFuncs) ASIN(argsList *list.List) formulaArg {
  3557. if argsList.Len() != 1 {
  3558. return newErrorFormulaArg(formulaErrorVALUE, "ASIN requires 1 numeric argument")
  3559. }
  3560. arg := argsList.Front().Value.(formulaArg).ToNumber()
  3561. if arg.Type == ArgError {
  3562. return arg
  3563. }
  3564. return newNumberFormulaArg(math.Asin(arg.Number))
  3565. }
  3566. // ASINH function calculates the inverse hyperbolic sine of a supplied number.
  3567. // The syntax of the function is:
  3568. //
  3569. // ASINH(number)
  3570. func (fn *formulaFuncs) ASINH(argsList *list.List) formulaArg {
  3571. if argsList.Len() != 1 {
  3572. return newErrorFormulaArg(formulaErrorVALUE, "ASINH requires 1 numeric argument")
  3573. }
  3574. arg := argsList.Front().Value.(formulaArg).ToNumber()
  3575. if arg.Type == ArgError {
  3576. return arg
  3577. }
  3578. return newNumberFormulaArg(math.Asinh(arg.Number))
  3579. }
  3580. // ATAN function calculates the arctangent (i.e. the inverse tangent) of a
  3581. // given number, and returns an angle, in radians, between -π/2 and +π/2. The
  3582. // syntax of the function is:
  3583. //
  3584. // ATAN(number)
  3585. func (fn *formulaFuncs) ATAN(argsList *list.List) formulaArg {
  3586. if argsList.Len() != 1 {
  3587. return newErrorFormulaArg(formulaErrorVALUE, "ATAN requires 1 numeric argument")
  3588. }
  3589. arg := argsList.Front().Value.(formulaArg).ToNumber()
  3590. if arg.Type == ArgError {
  3591. return arg
  3592. }
  3593. return newNumberFormulaArg(math.Atan(arg.Number))
  3594. }
  3595. // ATANH function calculates the inverse hyperbolic tangent of a supplied
  3596. // number. The syntax of the function is:
  3597. //
  3598. // ATANH(number)
  3599. func (fn *formulaFuncs) ATANH(argsList *list.List) formulaArg {
  3600. if argsList.Len() != 1 {
  3601. return newErrorFormulaArg(formulaErrorVALUE, "ATANH requires 1 numeric argument")
  3602. }
  3603. arg := argsList.Front().Value.(formulaArg).ToNumber()
  3604. if arg.Type == ArgError {
  3605. return arg
  3606. }
  3607. return newNumberFormulaArg(math.Atanh(arg.Number))
  3608. }
  3609. // ATAN2 function calculates the arctangent (i.e. the inverse tangent) of a
  3610. // given set of x and y coordinates, and returns an angle, in radians, between
  3611. // -π/2 and +π/2. The syntax of the function is:
  3612. //
  3613. // ATAN2(x_num,y_num)
  3614. func (fn *formulaFuncs) ATAN2(argsList *list.List) formulaArg {
  3615. if argsList.Len() != 2 {
  3616. return newErrorFormulaArg(formulaErrorVALUE, "ATAN2 requires 2 numeric arguments")
  3617. }
  3618. x := argsList.Back().Value.(formulaArg).ToNumber()
  3619. if x.Type == ArgError {
  3620. return x
  3621. }
  3622. y := argsList.Front().Value.(formulaArg).ToNumber()
  3623. if y.Type == ArgError {
  3624. return y
  3625. }
  3626. return newNumberFormulaArg(math.Atan2(x.Number, y.Number))
  3627. }
  3628. // BASE function converts a number into a supplied base (radix), and returns a
  3629. // text representation of the calculated value. The syntax of the function is:
  3630. //
  3631. // BASE(number,radix,[min_length])
  3632. func (fn *formulaFuncs) BASE(argsList *list.List) formulaArg {
  3633. if argsList.Len() < 2 {
  3634. return newErrorFormulaArg(formulaErrorVALUE, "BASE requires at least 2 arguments")
  3635. }
  3636. if argsList.Len() > 3 {
  3637. return newErrorFormulaArg(formulaErrorVALUE, "BASE allows at most 3 arguments")
  3638. }
  3639. var minLength int
  3640. var err error
  3641. number := argsList.Front().Value.(formulaArg).ToNumber()
  3642. if number.Type == ArgError {
  3643. return number
  3644. }
  3645. radix := argsList.Front().Next().Value.(formulaArg).ToNumber()
  3646. if radix.Type == ArgError {
  3647. return radix
  3648. }
  3649. if int(radix.Number) < 2 || int(radix.Number) > 36 {
  3650. return newErrorFormulaArg(formulaErrorVALUE, "radix must be an integer >= 2 and <= 36")
  3651. }
  3652. if argsList.Len() > 2 {
  3653. if minLength, err = strconv.Atoi(argsList.Back().Value.(formulaArg).Value()); err != nil {
  3654. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  3655. }
  3656. }
  3657. result := strconv.FormatInt(int64(number.Number), int(radix.Number))
  3658. if len(result) < minLength {
  3659. result = strings.Repeat("0", minLength-len(result)) + result
  3660. }
  3661. return newStringFormulaArg(strings.ToUpper(result))
  3662. }
  3663. // CEILING function rounds a supplied number away from zero, to the nearest
  3664. // multiple of a given number. The syntax of the function is:
  3665. //
  3666. // CEILING(number,significance)
  3667. func (fn *formulaFuncs) CEILING(argsList *list.List) formulaArg {
  3668. if argsList.Len() == 0 {
  3669. return newErrorFormulaArg(formulaErrorVALUE, "CEILING requires at least 1 argument")
  3670. }
  3671. if argsList.Len() > 2 {
  3672. return newErrorFormulaArg(formulaErrorVALUE, "CEILING allows at most 2 arguments")
  3673. }
  3674. number, significance, res := 0.0, 1.0, 0.0
  3675. n := argsList.Front().Value.(formulaArg).ToNumber()
  3676. if n.Type == ArgError {
  3677. return n
  3678. }
  3679. number = n.Number
  3680. if number < 0 {
  3681. significance = -1
  3682. }
  3683. if argsList.Len() > 1 {
  3684. s := argsList.Back().Value.(formulaArg).ToNumber()
  3685. if s.Type == ArgError {
  3686. return s
  3687. }
  3688. significance = s.Number
  3689. }
  3690. if significance < 0 && number > 0 {
  3691. return newErrorFormulaArg(formulaErrorVALUE, "negative sig to CEILING invalid")
  3692. }
  3693. if argsList.Len() == 1 {
  3694. return newNumberFormulaArg(math.Ceil(number))
  3695. }
  3696. number, res = math.Modf(number / significance)
  3697. if res > 0 {
  3698. number++
  3699. }
  3700. return newNumberFormulaArg(number * significance)
  3701. }
  3702. // CEILINGdotMATH function rounds a supplied number up to a supplied multiple
  3703. // of significance. The syntax of the function is:
  3704. //
  3705. // CEILING.MATH(number,[significance],[mode])
  3706. func (fn *formulaFuncs) CEILINGdotMATH(argsList *list.List) formulaArg {
  3707. if argsList.Len() == 0 {
  3708. return newErrorFormulaArg(formulaErrorVALUE, "CEILING.MATH requires at least 1 argument")
  3709. }
  3710. if argsList.Len() > 3 {
  3711. return newErrorFormulaArg(formulaErrorVALUE, "CEILING.MATH allows at most 3 arguments")
  3712. }
  3713. number, significance, mode := 0.0, 1.0, 1.0
  3714. n := argsList.Front().Value.(formulaArg).ToNumber()
  3715. if n.Type == ArgError {
  3716. return n
  3717. }
  3718. number = n.Number
  3719. if number < 0 {
  3720. significance = -1
  3721. }
  3722. if argsList.Len() > 1 {
  3723. s := argsList.Front().Next().Value.(formulaArg).ToNumber()
  3724. if s.Type == ArgError {
  3725. return s
  3726. }
  3727. significance = s.Number
  3728. }
  3729. if argsList.Len() == 1 {
  3730. return newNumberFormulaArg(math.Ceil(number))
  3731. }
  3732. if argsList.Len() > 2 {
  3733. m := argsList.Back().Value.(formulaArg).ToNumber()
  3734. if m.Type == ArgError {
  3735. return m
  3736. }
  3737. mode = m.Number
  3738. }
  3739. val, res := math.Modf(number / significance)
  3740. if res != 0 {
  3741. if number > 0 {
  3742. val++
  3743. } else if mode < 0 {
  3744. val--
  3745. }
  3746. }
  3747. return newNumberFormulaArg(val * significance)
  3748. }
  3749. // CEILINGdotPRECISE function rounds a supplied number up (regardless of the
  3750. // number's sign), to the nearest multiple of a given number. The syntax of
  3751. // the function is:
  3752. //
  3753. // CEILING.PRECISE(number,[significance])
  3754. func (fn *formulaFuncs) CEILINGdotPRECISE(argsList *list.List) formulaArg {
  3755. if argsList.Len() == 0 {
  3756. return newErrorFormulaArg(formulaErrorVALUE, "CEILING.PRECISE requires at least 1 argument")
  3757. }
  3758. if argsList.Len() > 2 {
  3759. return newErrorFormulaArg(formulaErrorVALUE, "CEILING.PRECISE allows at most 2 arguments")
  3760. }
  3761. number, significance := 0.0, 1.0
  3762. n := argsList.Front().Value.(formulaArg).ToNumber()
  3763. if n.Type == ArgError {
  3764. return n
  3765. }
  3766. number = n.Number
  3767. if number < 0 {
  3768. significance = -1
  3769. }
  3770. if argsList.Len() == 1 {
  3771. return newNumberFormulaArg(math.Ceil(number))
  3772. }
  3773. if argsList.Len() > 1 {
  3774. s := argsList.Back().Value.(formulaArg).ToNumber()
  3775. if s.Type == ArgError {
  3776. return s
  3777. }
  3778. significance = s.Number
  3779. significance = math.Abs(significance)
  3780. if significance == 0 {
  3781. return newNumberFormulaArg(significance)
  3782. }
  3783. }
  3784. val, res := math.Modf(number / significance)
  3785. if res != 0 {
  3786. if number > 0 {
  3787. val++
  3788. }
  3789. }
  3790. return newNumberFormulaArg(val * significance)
  3791. }
  3792. // COMBIN function calculates the number of combinations (in any order) of a
  3793. // given number objects from a set. The syntax of the function is:
  3794. //
  3795. // COMBIN(number,number_chosen)
  3796. func (fn *formulaFuncs) COMBIN(argsList *list.List) formulaArg {
  3797. if argsList.Len() != 2 {
  3798. return newErrorFormulaArg(formulaErrorVALUE, "COMBIN requires 2 argument")
  3799. }
  3800. number, chosen, val := 0.0, 0.0, 1.0
  3801. n := argsList.Front().Value.(formulaArg).ToNumber()
  3802. if n.Type == ArgError {
  3803. return n
  3804. }
  3805. number = n.Number
  3806. c := argsList.Back().Value.(formulaArg).ToNumber()
  3807. if c.Type == ArgError {
  3808. return c
  3809. }
  3810. chosen = c.Number
  3811. number, chosen = math.Trunc(number), math.Trunc(chosen)
  3812. if chosen > number {
  3813. return newErrorFormulaArg(formulaErrorVALUE, "COMBIN requires number >= number_chosen")
  3814. }
  3815. if chosen == number || chosen == 0 {
  3816. return newNumberFormulaArg(1)
  3817. }
  3818. for c := float64(1); c <= chosen; c++ {
  3819. val *= (number + 1 - c) / c
  3820. }
  3821. return newNumberFormulaArg(math.Ceil(val))
  3822. }
  3823. // COMBINA function calculates the number of combinations, with repetitions,
  3824. // of a given number objects from a set. The syntax of the function is:
  3825. //
  3826. // COMBINA(number,number_chosen)
  3827. func (fn *formulaFuncs) COMBINA(argsList *list.List) formulaArg {
  3828. if argsList.Len() != 2 {
  3829. return newErrorFormulaArg(formulaErrorVALUE, "COMBINA requires 2 argument")
  3830. }
  3831. var number, chosen float64
  3832. n := argsList.Front().Value.(formulaArg).ToNumber()
  3833. if n.Type == ArgError {
  3834. return n
  3835. }
  3836. number = n.Number
  3837. c := argsList.Back().Value.(formulaArg).ToNumber()
  3838. if c.Type == ArgError {
  3839. return c
  3840. }
  3841. chosen = c.Number
  3842. number, chosen = math.Trunc(number), math.Trunc(chosen)
  3843. if number < chosen {
  3844. return newErrorFormulaArg(formulaErrorVALUE, "COMBINA requires number > number_chosen")
  3845. }
  3846. if number == 0 {
  3847. return newNumberFormulaArg(number)
  3848. }
  3849. args := list.New()
  3850. args.PushBack(formulaArg{
  3851. String: fmt.Sprintf("%g", number+chosen-1),
  3852. Type: ArgString,
  3853. })
  3854. args.PushBack(formulaArg{
  3855. String: fmt.Sprintf("%g", number-1),
  3856. Type: ArgString,
  3857. })
  3858. return fn.COMBIN(args)
  3859. }
  3860. // COS function calculates the cosine of a given angle. The syntax of the
  3861. // function is:
  3862. //
  3863. // COS(number)
  3864. func (fn *formulaFuncs) COS(argsList *list.List) formulaArg {
  3865. if argsList.Len() != 1 {
  3866. return newErrorFormulaArg(formulaErrorVALUE, "COS requires 1 numeric argument")
  3867. }
  3868. val := argsList.Front().Value.(formulaArg).ToNumber()
  3869. if val.Type == ArgError {
  3870. return val
  3871. }
  3872. return newNumberFormulaArg(math.Cos(val.Number))
  3873. }
  3874. // COSH function calculates the hyperbolic cosine (cosh) of a supplied number.
  3875. // The syntax of the function is:
  3876. //
  3877. // COSH(number)
  3878. func (fn *formulaFuncs) COSH(argsList *list.List) formulaArg {
  3879. if argsList.Len() != 1 {
  3880. return newErrorFormulaArg(formulaErrorVALUE, "COSH requires 1 numeric argument")
  3881. }
  3882. val := argsList.Front().Value.(formulaArg).ToNumber()
  3883. if val.Type == ArgError {
  3884. return val
  3885. }
  3886. return newNumberFormulaArg(math.Cosh(val.Number))
  3887. }
  3888. // COT function calculates the cotangent of a given angle. The syntax of the
  3889. // function is:
  3890. //
  3891. // COT(number)
  3892. func (fn *formulaFuncs) COT(argsList *list.List) formulaArg {
  3893. if argsList.Len() != 1 {
  3894. return newErrorFormulaArg(formulaErrorVALUE, "COT requires 1 numeric argument")
  3895. }
  3896. val := argsList.Front().Value.(formulaArg).ToNumber()
  3897. if val.Type == ArgError {
  3898. return val
  3899. }
  3900. if val.Number == 0 {
  3901. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  3902. }
  3903. return newNumberFormulaArg(1 / math.Tan(val.Number))
  3904. }
  3905. // COTH function calculates the hyperbolic cotangent (coth) of a supplied
  3906. // angle. The syntax of the function is:
  3907. //
  3908. // COTH(number)
  3909. func (fn *formulaFuncs) COTH(argsList *list.List) formulaArg {
  3910. if argsList.Len() != 1 {
  3911. return newErrorFormulaArg(formulaErrorVALUE, "COTH requires 1 numeric argument")
  3912. }
  3913. val := argsList.Front().Value.(formulaArg).ToNumber()
  3914. if val.Type == ArgError {
  3915. return val
  3916. }
  3917. if val.Number == 0 {
  3918. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  3919. }
  3920. return newNumberFormulaArg((math.Exp(val.Number) + math.Exp(-val.Number)) / (math.Exp(val.Number) - math.Exp(-val.Number)))
  3921. }
  3922. // CSC function calculates the cosecant of a given angle. The syntax of the
  3923. // function is:
  3924. //
  3925. // CSC(number)
  3926. func (fn *formulaFuncs) CSC(argsList *list.List) formulaArg {
  3927. if argsList.Len() != 1 {
  3928. return newErrorFormulaArg(formulaErrorVALUE, "CSC requires 1 numeric argument")
  3929. }
  3930. val := argsList.Front().Value.(formulaArg).ToNumber()
  3931. if val.Type == ArgError {
  3932. return val
  3933. }
  3934. if val.Number == 0 {
  3935. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  3936. }
  3937. return newNumberFormulaArg(1 / math.Sin(val.Number))
  3938. }
  3939. // CSCH function calculates the hyperbolic cosecant (csch) of a supplied
  3940. // angle. The syntax of the function is:
  3941. //
  3942. // CSCH(number)
  3943. func (fn *formulaFuncs) CSCH(argsList *list.List) formulaArg {
  3944. if argsList.Len() != 1 {
  3945. return newErrorFormulaArg(formulaErrorVALUE, "CSCH requires 1 numeric argument")
  3946. }
  3947. val := argsList.Front().Value.(formulaArg).ToNumber()
  3948. if val.Type == ArgError {
  3949. return val
  3950. }
  3951. if val.Number == 0 {
  3952. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  3953. }
  3954. return newNumberFormulaArg(1 / math.Sinh(val.Number))
  3955. }
  3956. // DECIMAL function converts a text representation of a number in a specified
  3957. // base, into a decimal value. The syntax of the function is:
  3958. //
  3959. // DECIMAL(text,radix)
  3960. func (fn *formulaFuncs) DECIMAL(argsList *list.List) formulaArg {
  3961. if argsList.Len() != 2 {
  3962. return newErrorFormulaArg(formulaErrorVALUE, "DECIMAL requires 2 numeric arguments")
  3963. }
  3964. text := argsList.Front().Value.(formulaArg).Value()
  3965. var err error
  3966. radix := argsList.Back().Value.(formulaArg).ToNumber()
  3967. if radix.Type != ArgNumber {
  3968. return radix
  3969. }
  3970. if len(text) > 2 && (strings.HasPrefix(text, "0x") || strings.HasPrefix(text, "0X")) {
  3971. text = text[2:]
  3972. }
  3973. val, err := strconv.ParseInt(text, int(radix.Number), 64)
  3974. if err != nil {
  3975. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  3976. }
  3977. return newNumberFormulaArg(float64(val))
  3978. }
  3979. // DEGREES function converts radians into degrees. The syntax of the function
  3980. // is:
  3981. //
  3982. // DEGREES(angle)
  3983. func (fn *formulaFuncs) DEGREES(argsList *list.List) formulaArg {
  3984. if argsList.Len() != 1 {
  3985. return newErrorFormulaArg(formulaErrorVALUE, "DEGREES requires 1 numeric argument")
  3986. }
  3987. val := argsList.Front().Value.(formulaArg).ToNumber()
  3988. if val.Type == ArgError {
  3989. return val
  3990. }
  3991. if val.Number == 0 {
  3992. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  3993. }
  3994. return newNumberFormulaArg(180.0 / math.Pi * val.Number)
  3995. }
  3996. // EVEN function rounds a supplied number away from zero (i.e. rounds a
  3997. // positive number up and a negative number down), to the next even number.
  3998. // The syntax of the function is:
  3999. //
  4000. // EVEN(number)
  4001. func (fn *formulaFuncs) EVEN(argsList *list.List) formulaArg {
  4002. if argsList.Len() != 1 {
  4003. return newErrorFormulaArg(formulaErrorVALUE, "EVEN requires 1 numeric argument")
  4004. }
  4005. number := argsList.Front().Value.(formulaArg).ToNumber()
  4006. if number.Type == ArgError {
  4007. return number
  4008. }
  4009. sign := math.Signbit(number.Number)
  4010. m, frac := math.Modf(number.Number / 2)
  4011. val := m * 2
  4012. if frac != 0 {
  4013. if !sign {
  4014. val += 2
  4015. } else {
  4016. val -= 2
  4017. }
  4018. }
  4019. return newNumberFormulaArg(val)
  4020. }
  4021. // EXP function calculates the value of the mathematical constant e, raised to
  4022. // the power of a given number. The syntax of the function is:
  4023. //
  4024. // EXP(number)
  4025. func (fn *formulaFuncs) EXP(argsList *list.List) formulaArg {
  4026. if argsList.Len() != 1 {
  4027. return newErrorFormulaArg(formulaErrorVALUE, "EXP requires 1 numeric argument")
  4028. }
  4029. number := argsList.Front().Value.(formulaArg).ToNumber()
  4030. if number.Type == ArgError {
  4031. return number
  4032. }
  4033. return newStringFormulaArg(strings.ToUpper(fmt.Sprintf("%g", math.Exp(number.Number))))
  4034. }
  4035. // fact returns the factorial of a supplied number.
  4036. func fact(number float64) float64 {
  4037. val := float64(1)
  4038. for i := float64(2); i <= number; i++ {
  4039. val *= i
  4040. }
  4041. return val
  4042. }
  4043. // FACT function returns the factorial of a supplied number. The syntax of the
  4044. // function is:
  4045. //
  4046. // FACT(number)
  4047. func (fn *formulaFuncs) FACT(argsList *list.List) formulaArg {
  4048. if argsList.Len() != 1 {
  4049. return newErrorFormulaArg(formulaErrorVALUE, "FACT requires 1 numeric argument")
  4050. }
  4051. number := argsList.Front().Value.(formulaArg).ToNumber()
  4052. if number.Type == ArgError {
  4053. return number
  4054. }
  4055. if number.Number < 0 {
  4056. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  4057. }
  4058. return newNumberFormulaArg(fact(number.Number))
  4059. }
  4060. // FACTDOUBLE function returns the double factorial of a supplied number. The
  4061. // syntax of the function is:
  4062. //
  4063. // FACTDOUBLE(number)
  4064. func (fn *formulaFuncs) FACTDOUBLE(argsList *list.List) formulaArg {
  4065. if argsList.Len() != 1 {
  4066. return newErrorFormulaArg(formulaErrorVALUE, "FACTDOUBLE requires 1 numeric argument")
  4067. }
  4068. val := 1.0
  4069. number := argsList.Front().Value.(formulaArg).ToNumber()
  4070. if number.Type == ArgError {
  4071. return number
  4072. }
  4073. if number.Number < 0 {
  4074. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  4075. }
  4076. for i := math.Trunc(number.Number); i > 1; i -= 2 {
  4077. val *= i
  4078. }
  4079. return newStringFormulaArg(strings.ToUpper(fmt.Sprintf("%g", val)))
  4080. }
  4081. // FLOOR function rounds a supplied number towards zero to the nearest
  4082. // multiple of a specified significance. The syntax of the function is:
  4083. //
  4084. // FLOOR(number,significance)
  4085. func (fn *formulaFuncs) FLOOR(argsList *list.List) formulaArg {
  4086. if argsList.Len() != 2 {
  4087. return newErrorFormulaArg(formulaErrorVALUE, "FLOOR requires 2 numeric arguments")
  4088. }
  4089. number := argsList.Front().Value.(formulaArg).ToNumber()
  4090. if number.Type == ArgError {
  4091. return number
  4092. }
  4093. significance := argsList.Back().Value.(formulaArg).ToNumber()
  4094. if significance.Type == ArgError {
  4095. return significance
  4096. }
  4097. if significance.Number < 0 && number.Number >= 0 {
  4098. return newErrorFormulaArg(formulaErrorNUM, "invalid arguments to FLOOR")
  4099. }
  4100. val := number.Number
  4101. val, res := math.Modf(val / significance.Number)
  4102. if res != 0 {
  4103. if number.Number < 0 && res < 0 {
  4104. val--
  4105. }
  4106. }
  4107. return newStringFormulaArg(strings.ToUpper(fmt.Sprintf("%g", val*significance.Number)))
  4108. }
  4109. // FLOORdotMATH function rounds a supplied number down to a supplied multiple
  4110. // of significance. The syntax of the function is:
  4111. //
  4112. // FLOOR.MATH(number,[significance],[mode])
  4113. func (fn *formulaFuncs) FLOORdotMATH(argsList *list.List) formulaArg {
  4114. if argsList.Len() == 0 {
  4115. return newErrorFormulaArg(formulaErrorVALUE, "FLOOR.MATH requires at least 1 argument")
  4116. }
  4117. if argsList.Len() > 3 {
  4118. return newErrorFormulaArg(formulaErrorVALUE, "FLOOR.MATH allows at most 3 arguments")
  4119. }
  4120. significance, mode := 1.0, 1.0
  4121. number := argsList.Front().Value.(formulaArg).ToNumber()
  4122. if number.Type == ArgError {
  4123. return number
  4124. }
  4125. if number.Number < 0 {
  4126. significance = -1
  4127. }
  4128. if argsList.Len() > 1 {
  4129. s := argsList.Front().Next().Value.(formulaArg).ToNumber()
  4130. if s.Type == ArgError {
  4131. return s
  4132. }
  4133. significance = s.Number
  4134. }
  4135. if argsList.Len() == 1 {
  4136. return newNumberFormulaArg(math.Floor(number.Number))
  4137. }
  4138. if argsList.Len() > 2 {
  4139. m := argsList.Back().Value.(formulaArg).ToNumber()
  4140. if m.Type == ArgError {
  4141. return m
  4142. }
  4143. mode = m.Number
  4144. }
  4145. val, res := math.Modf(number.Number / significance)
  4146. if res != 0 && number.Number < 0 && mode > 0 {
  4147. val--
  4148. }
  4149. return newNumberFormulaArg(val * significance)
  4150. }
  4151. // FLOORdotPRECISE function rounds a supplied number down to a supplied
  4152. // multiple of significance. The syntax of the function is:
  4153. //
  4154. // FLOOR.PRECISE(number,[significance])
  4155. func (fn *formulaFuncs) FLOORdotPRECISE(argsList *list.List) formulaArg {
  4156. if argsList.Len() == 0 {
  4157. return newErrorFormulaArg(formulaErrorVALUE, "FLOOR.PRECISE requires at least 1 argument")
  4158. }
  4159. if argsList.Len() > 2 {
  4160. return newErrorFormulaArg(formulaErrorVALUE, "FLOOR.PRECISE allows at most 2 arguments")
  4161. }
  4162. var significance float64
  4163. number := argsList.Front().Value.(formulaArg).ToNumber()
  4164. if number.Type == ArgError {
  4165. return number
  4166. }
  4167. if number.Number < 0 {
  4168. significance = -1
  4169. }
  4170. if argsList.Len() == 1 {
  4171. return newNumberFormulaArg(math.Floor(number.Number))
  4172. }
  4173. if argsList.Len() > 1 {
  4174. s := argsList.Back().Value.(formulaArg).ToNumber()
  4175. if s.Type == ArgError {
  4176. return s
  4177. }
  4178. significance = s.Number
  4179. significance = math.Abs(significance)
  4180. if significance == 0 {
  4181. return newNumberFormulaArg(significance)
  4182. }
  4183. }
  4184. val, res := math.Modf(number.Number / significance)
  4185. if res != 0 {
  4186. if number.Number < 0 {
  4187. val--
  4188. }
  4189. }
  4190. return newNumberFormulaArg(val * significance)
  4191. }
  4192. // gcd returns the greatest common divisor of two supplied integers.
  4193. func gcd(x, y float64) float64 {
  4194. x, y = math.Trunc(x), math.Trunc(y)
  4195. if x == 0 {
  4196. return y
  4197. }
  4198. if y == 0 {
  4199. return x
  4200. }
  4201. for x != y {
  4202. if x > y {
  4203. x = x - y
  4204. } else {
  4205. y = y - x
  4206. }
  4207. }
  4208. return x
  4209. }
  4210. // GCD function returns the greatest common divisor of two or more supplied
  4211. // integers. The syntax of the function is:
  4212. //
  4213. // GCD(number1,[number2],...)
  4214. func (fn *formulaFuncs) GCD(argsList *list.List) formulaArg {
  4215. if argsList.Len() == 0 {
  4216. return newErrorFormulaArg(formulaErrorVALUE, "GCD requires at least 1 argument")
  4217. }
  4218. var (
  4219. val float64
  4220. nums []float64
  4221. )
  4222. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  4223. token := arg.Value.(formulaArg)
  4224. switch token.Type {
  4225. case ArgString:
  4226. num := token.ToNumber()
  4227. if num.Type == ArgError {
  4228. return num
  4229. }
  4230. val = num.Number
  4231. case ArgNumber:
  4232. val = token.Number
  4233. }
  4234. nums = append(nums, val)
  4235. }
  4236. if nums[0] < 0 {
  4237. return newErrorFormulaArg(formulaErrorVALUE, "GCD only accepts positive arguments")
  4238. }
  4239. if len(nums) == 1 {
  4240. return newNumberFormulaArg(nums[0])
  4241. }
  4242. cd := nums[0]
  4243. for i := 1; i < len(nums); i++ {
  4244. if nums[i] < 0 {
  4245. return newErrorFormulaArg(formulaErrorVALUE, "GCD only accepts positive arguments")
  4246. }
  4247. cd = gcd(cd, nums[i])
  4248. }
  4249. return newNumberFormulaArg(cd)
  4250. }
  4251. // INT function truncates a supplied number down to the closest integer. The
  4252. // syntax of the function is:
  4253. //
  4254. // INT(number)
  4255. func (fn *formulaFuncs) INT(argsList *list.List) formulaArg {
  4256. if argsList.Len() != 1 {
  4257. return newErrorFormulaArg(formulaErrorVALUE, "INT requires 1 numeric argument")
  4258. }
  4259. number := argsList.Front().Value.(formulaArg).ToNumber()
  4260. if number.Type == ArgError {
  4261. return number
  4262. }
  4263. val, frac := math.Modf(number.Number)
  4264. if frac < 0 {
  4265. val--
  4266. }
  4267. return newNumberFormulaArg(val)
  4268. }
  4269. // ISOdotCEILING function rounds a supplied number up (regardless of the
  4270. // number's sign), to the nearest multiple of a supplied significance. The
  4271. // syntax of the function is:
  4272. //
  4273. // ISO.CEILING(number,[significance])
  4274. func (fn *formulaFuncs) ISOdotCEILING(argsList *list.List) formulaArg {
  4275. if argsList.Len() == 0 {
  4276. return newErrorFormulaArg(formulaErrorVALUE, "ISO.CEILING requires at least 1 argument")
  4277. }
  4278. if argsList.Len() > 2 {
  4279. return newErrorFormulaArg(formulaErrorVALUE, "ISO.CEILING allows at most 2 arguments")
  4280. }
  4281. var significance float64
  4282. number := argsList.Front().Value.(formulaArg).ToNumber()
  4283. if number.Type == ArgError {
  4284. return number
  4285. }
  4286. if number.Number < 0 {
  4287. significance = -1
  4288. }
  4289. if argsList.Len() == 1 {
  4290. return newNumberFormulaArg(math.Ceil(number.Number))
  4291. }
  4292. if argsList.Len() > 1 {
  4293. s := argsList.Back().Value.(formulaArg).ToNumber()
  4294. if s.Type == ArgError {
  4295. return s
  4296. }
  4297. significance = s.Number
  4298. significance = math.Abs(significance)
  4299. if significance == 0 {
  4300. return newNumberFormulaArg(significance)
  4301. }
  4302. }
  4303. val, res := math.Modf(number.Number / significance)
  4304. if res != 0 {
  4305. if number.Number > 0 {
  4306. val++
  4307. }
  4308. }
  4309. return newNumberFormulaArg(val * significance)
  4310. }
  4311. // lcm returns the least common multiple of two supplied integers.
  4312. func lcm(a, b float64) float64 {
  4313. a = math.Trunc(a)
  4314. b = math.Trunc(b)
  4315. if a == 0 && b == 0 {
  4316. return 0
  4317. }
  4318. return a * b / gcd(a, b)
  4319. }
  4320. // LCM function returns the least common multiple of two or more supplied
  4321. // integers. The syntax of the function is:
  4322. //
  4323. // LCM(number1,[number2],...)
  4324. func (fn *formulaFuncs) LCM(argsList *list.List) formulaArg {
  4325. if argsList.Len() == 0 {
  4326. return newErrorFormulaArg(formulaErrorVALUE, "LCM requires at least 1 argument")
  4327. }
  4328. var (
  4329. val float64
  4330. nums []float64
  4331. err error
  4332. )
  4333. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  4334. token := arg.Value.(formulaArg)
  4335. switch token.Type {
  4336. case ArgString:
  4337. if token.String == "" {
  4338. continue
  4339. }
  4340. if val, err = strconv.ParseFloat(token.String, 64); err != nil {
  4341. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  4342. }
  4343. case ArgNumber:
  4344. val = token.Number
  4345. }
  4346. nums = append(nums, val)
  4347. }
  4348. if nums[0] < 0 {
  4349. return newErrorFormulaArg(formulaErrorVALUE, "LCM only accepts positive arguments")
  4350. }
  4351. if len(nums) == 1 {
  4352. return newNumberFormulaArg(nums[0])
  4353. }
  4354. cm := nums[0]
  4355. for i := 1; i < len(nums); i++ {
  4356. if nums[i] < 0 {
  4357. return newErrorFormulaArg(formulaErrorVALUE, "LCM only accepts positive arguments")
  4358. }
  4359. cm = lcm(cm, nums[i])
  4360. }
  4361. return newNumberFormulaArg(cm)
  4362. }
  4363. // LN function calculates the natural logarithm of a given number. The syntax
  4364. // of the function is:
  4365. //
  4366. // LN(number)
  4367. func (fn *formulaFuncs) LN(argsList *list.List) formulaArg {
  4368. if argsList.Len() != 1 {
  4369. return newErrorFormulaArg(formulaErrorVALUE, "LN requires 1 numeric argument")
  4370. }
  4371. number := argsList.Front().Value.(formulaArg).ToNumber()
  4372. if number.Type == ArgError {
  4373. return number
  4374. }
  4375. return newNumberFormulaArg(math.Log(number.Number))
  4376. }
  4377. // LOG function calculates the logarithm of a given number, to a supplied
  4378. // base. The syntax of the function is:
  4379. //
  4380. // LOG(number,[base])
  4381. func (fn *formulaFuncs) LOG(argsList *list.List) formulaArg {
  4382. if argsList.Len() == 0 {
  4383. return newErrorFormulaArg(formulaErrorVALUE, "LOG requires at least 1 argument")
  4384. }
  4385. if argsList.Len() > 2 {
  4386. return newErrorFormulaArg(formulaErrorVALUE, "LOG allows at most 2 arguments")
  4387. }
  4388. base := 10.0
  4389. number := argsList.Front().Value.(formulaArg).ToNumber()
  4390. if number.Type == ArgError {
  4391. return number
  4392. }
  4393. if argsList.Len() > 1 {
  4394. b := argsList.Back().Value.(formulaArg).ToNumber()
  4395. if b.Type == ArgError {
  4396. return b
  4397. }
  4398. base = b.Number
  4399. }
  4400. if number.Number == 0 {
  4401. return newErrorFormulaArg(formulaErrorNUM, formulaErrorDIV)
  4402. }
  4403. if base == 0 {
  4404. return newErrorFormulaArg(formulaErrorNUM, formulaErrorDIV)
  4405. }
  4406. if base == 1 {
  4407. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  4408. }
  4409. return newNumberFormulaArg(math.Log(number.Number) / math.Log(base))
  4410. }
  4411. // LOG10 function calculates the base 10 logarithm of a given number. The
  4412. // syntax of the function is:
  4413. //
  4414. // LOG10(number)
  4415. func (fn *formulaFuncs) LOG10(argsList *list.List) formulaArg {
  4416. if argsList.Len() != 1 {
  4417. return newErrorFormulaArg(formulaErrorVALUE, "LOG10 requires 1 numeric argument")
  4418. }
  4419. number := argsList.Front().Value.(formulaArg).ToNumber()
  4420. if number.Type == ArgError {
  4421. return number
  4422. }
  4423. return newNumberFormulaArg(math.Log10(number.Number))
  4424. }
  4425. // minor function implement a minor of a matrix A is the determinant of some
  4426. // smaller square matrix.
  4427. func minor(sqMtx [][]float64, idx int) [][]float64 {
  4428. var ret [][]float64
  4429. for i := range sqMtx {
  4430. if i == 0 {
  4431. continue
  4432. }
  4433. var row []float64
  4434. for j := range sqMtx {
  4435. if j == idx {
  4436. continue
  4437. }
  4438. row = append(row, sqMtx[i][j])
  4439. }
  4440. ret = append(ret, row)
  4441. }
  4442. return ret
  4443. }
  4444. // det determinant of the 2x2 matrix.
  4445. func det(sqMtx [][]float64) float64 {
  4446. if len(sqMtx) == 2 {
  4447. m00 := sqMtx[0][0]
  4448. m01 := sqMtx[0][1]
  4449. m10 := sqMtx[1][0]
  4450. m11 := sqMtx[1][1]
  4451. return m00*m11 - m10*m01
  4452. }
  4453. var res, sgn float64 = 0, 1
  4454. for j := range sqMtx {
  4455. res += sgn * sqMtx[0][j] * det(minor(sqMtx, j))
  4456. sgn *= -1
  4457. }
  4458. return res
  4459. }
  4460. // newNumberMatrix converts a formula arguments matrix to a number matrix.
  4461. func newNumberMatrix(arg formulaArg, phalanx bool) (numMtx [][]float64, ele formulaArg) {
  4462. rows := len(arg.Matrix)
  4463. for r, row := range arg.Matrix {
  4464. if phalanx && len(row) != rows {
  4465. ele = newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  4466. return
  4467. }
  4468. numMtx = append(numMtx, make([]float64, len(row)))
  4469. for c, cell := range row {
  4470. if cell.Type != ArgNumber {
  4471. ele = newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  4472. return
  4473. }
  4474. numMtx[r][c] = cell.Number
  4475. }
  4476. }
  4477. return
  4478. }
  4479. // newFormulaArgMatrix converts the number formula arguments matrix to a
  4480. // formula arguments matrix.
  4481. func newFormulaArgMatrix(numMtx [][]float64) (arg [][]formulaArg) {
  4482. for r, row := range numMtx {
  4483. arg = append(arg, make([]formulaArg, len(row)))
  4484. for c, cell := range row {
  4485. arg[r][c] = newNumberFormulaArg(cell)
  4486. }
  4487. }
  4488. return
  4489. }
  4490. // MDETERM calculates the determinant of a square matrix. The
  4491. // syntax of the function is:
  4492. //
  4493. // MDETERM(array)
  4494. func (fn *formulaFuncs) MDETERM(argsList *list.List) (result formulaArg) {
  4495. if argsList.Len() < 1 {
  4496. return newErrorFormulaArg(formulaErrorVALUE, "MDETERM requires 1 argument")
  4497. }
  4498. numMtx, errArg := newNumberMatrix(argsList.Front().Value.(formulaArg), true)
  4499. if errArg.Type == ArgError {
  4500. return errArg
  4501. }
  4502. return newNumberFormulaArg(det(numMtx))
  4503. }
  4504. // cofactorMatrix returns the matrix A of cofactors.
  4505. func cofactorMatrix(i, j int, A [][]float64) float64 {
  4506. N, sign := len(A), -1.0
  4507. if (i+j)%2 == 0 {
  4508. sign = 1
  4509. }
  4510. var B [][]float64
  4511. B = append(B, A...)
  4512. for m := 0; m < N; m++ {
  4513. for n := j + 1; n < N; n++ {
  4514. B[m][n-1] = B[m][n]
  4515. }
  4516. B[m] = B[m][:len(B[m])-1]
  4517. }
  4518. for k := i + 1; k < N; k++ {
  4519. B[k-1] = B[k]
  4520. }
  4521. B = B[:len(B)-1]
  4522. return sign * det(B)
  4523. }
  4524. // adjugateMatrix returns transpose of the cofactor matrix A with Cramer's
  4525. // rule.
  4526. func adjugateMatrix(A [][]float64) (adjA [][]float64) {
  4527. N := len(A)
  4528. var B [][]float64
  4529. for i := 0; i < N; i++ {
  4530. adjA = append(adjA, make([]float64, N))
  4531. for j := 0; j < N; j++ {
  4532. for m := 0; m < N; m++ {
  4533. for n := 0; n < N; n++ {
  4534. for x := len(B); x <= m; x++ {
  4535. B = append(B, []float64{})
  4536. }
  4537. for k := len(B[m]); k <= n; k++ {
  4538. B[m] = append(B[m], 0)
  4539. }
  4540. B[m][n] = A[m][n]
  4541. }
  4542. }
  4543. adjA[i][j] = cofactorMatrix(j, i, B)
  4544. }
  4545. }
  4546. return
  4547. }
  4548. // MINVERSE function calculates the inverse of a square matrix. The syntax of
  4549. // the function is:
  4550. //
  4551. // MINVERSE(array)
  4552. func (fn *formulaFuncs) MINVERSE(argsList *list.List) formulaArg {
  4553. if argsList.Len() != 1 {
  4554. return newErrorFormulaArg(formulaErrorVALUE, "MINVERSE requires 1 argument")
  4555. }
  4556. numMtx, errArg := newNumberMatrix(argsList.Front().Value.(formulaArg), true)
  4557. if errArg.Type == ArgError {
  4558. return errArg
  4559. }
  4560. if detM := det(numMtx); detM != 0 {
  4561. datM, invertM := 1/detM, adjugateMatrix(numMtx)
  4562. for i := 0; i < len(invertM); i++ {
  4563. for j := 0; j < len(invertM[i]); j++ {
  4564. invertM[i][j] *= datM
  4565. }
  4566. }
  4567. return newMatrixFormulaArg(newFormulaArgMatrix(invertM))
  4568. }
  4569. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  4570. }
  4571. // MMULT function calculates the matrix product of two arrays
  4572. // (representing matrices). The syntax of the function is:
  4573. //
  4574. // MMULT(array1,array2)
  4575. func (fn *formulaFuncs) MMULT(argsList *list.List) formulaArg {
  4576. if argsList.Len() != 2 {
  4577. return newErrorFormulaArg(formulaErrorVALUE, "MMULT requires 2 argument")
  4578. }
  4579. numMtx1, errArg1 := newNumberMatrix(argsList.Front().Value.(formulaArg), false)
  4580. if errArg1.Type == ArgError {
  4581. return errArg1
  4582. }
  4583. numMtx2, errArg2 := newNumberMatrix(argsList.Back().Value.(formulaArg), false)
  4584. if errArg2.Type == ArgError {
  4585. return errArg2
  4586. }
  4587. array2Rows, array2Cols := len(numMtx2), len(numMtx2[0])
  4588. if len(numMtx1[0]) != array2Rows {
  4589. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  4590. }
  4591. var numMtx [][]float64
  4592. var row1, row []float64
  4593. var sum float64
  4594. for i := 0; i < len(numMtx1); i++ {
  4595. numMtx = append(numMtx, []float64{})
  4596. row = []float64{}
  4597. row1 = numMtx1[i]
  4598. for j := 0; j < array2Cols; j++ {
  4599. sum = 0
  4600. for k := 0; k < array2Rows; k++ {
  4601. sum += row1[k] * numMtx2[k][j]
  4602. }
  4603. for l := len(row); l <= j; l++ {
  4604. row = append(row, 0)
  4605. }
  4606. row[j] = sum
  4607. numMtx[i] = row
  4608. }
  4609. }
  4610. return newMatrixFormulaArg(newFormulaArgMatrix(numMtx))
  4611. }
  4612. // MOD function returns the remainder of a division between two supplied
  4613. // numbers. The syntax of the function is:
  4614. //
  4615. // MOD(number,divisor)
  4616. func (fn *formulaFuncs) MOD(argsList *list.List) formulaArg {
  4617. if argsList.Len() != 2 {
  4618. return newErrorFormulaArg(formulaErrorVALUE, "MOD requires 2 numeric arguments")
  4619. }
  4620. number := argsList.Front().Value.(formulaArg).ToNumber()
  4621. if number.Type == ArgError {
  4622. return number
  4623. }
  4624. divisor := argsList.Back().Value.(formulaArg).ToNumber()
  4625. if divisor.Type == ArgError {
  4626. return divisor
  4627. }
  4628. if divisor.Number == 0 {
  4629. return newErrorFormulaArg(formulaErrorDIV, "MOD divide by zero")
  4630. }
  4631. trunc, rem := math.Modf(number.Number / divisor.Number)
  4632. if rem < 0 {
  4633. trunc--
  4634. }
  4635. return newNumberFormulaArg(number.Number - divisor.Number*trunc)
  4636. }
  4637. // MROUND function rounds a supplied number up or down to the nearest multiple
  4638. // of a given number. The syntax of the function is:
  4639. //
  4640. // MROUND(number,multiple)
  4641. func (fn *formulaFuncs) MROUND(argsList *list.List) formulaArg {
  4642. if argsList.Len() != 2 {
  4643. return newErrorFormulaArg(formulaErrorVALUE, "MROUND requires 2 numeric arguments")
  4644. }
  4645. n := argsList.Front().Value.(formulaArg).ToNumber()
  4646. if n.Type == ArgError {
  4647. return n
  4648. }
  4649. multiple := argsList.Back().Value.(formulaArg).ToNumber()
  4650. if multiple.Type == ArgError {
  4651. return multiple
  4652. }
  4653. if multiple.Number == 0 {
  4654. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  4655. }
  4656. if multiple.Number < 0 && n.Number > 0 ||
  4657. multiple.Number > 0 && n.Number < 0 {
  4658. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  4659. }
  4660. number, res := math.Modf(n.Number / multiple.Number)
  4661. if math.Trunc(res+0.5) > 0 {
  4662. number++
  4663. }
  4664. return newNumberFormulaArg(number * multiple.Number)
  4665. }
  4666. // MULTINOMIAL function calculates the ratio of the factorial of a sum of
  4667. // supplied values to the product of factorials of those values. The syntax of
  4668. // the function is:
  4669. //
  4670. // MULTINOMIAL(number1,[number2],...)
  4671. func (fn *formulaFuncs) MULTINOMIAL(argsList *list.List) formulaArg {
  4672. val, num, denom := 0.0, 0.0, 1.0
  4673. var err error
  4674. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  4675. token := arg.Value.(formulaArg)
  4676. switch token.Type {
  4677. case ArgString:
  4678. if token.String == "" {
  4679. continue
  4680. }
  4681. if val, err = strconv.ParseFloat(token.String, 64); err != nil {
  4682. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  4683. }
  4684. case ArgNumber:
  4685. val = token.Number
  4686. }
  4687. num += val
  4688. denom *= fact(val)
  4689. }
  4690. return newNumberFormulaArg(fact(num) / denom)
  4691. }
  4692. // MUNIT function returns the unit matrix for a specified dimension. The
  4693. // syntax of the function is:
  4694. //
  4695. // MUNIT(dimension)
  4696. func (fn *formulaFuncs) MUNIT(argsList *list.List) (result formulaArg) {
  4697. if argsList.Len() != 1 {
  4698. return newErrorFormulaArg(formulaErrorVALUE, "MUNIT requires 1 numeric argument")
  4699. }
  4700. dimension := argsList.Back().Value.(formulaArg).ToNumber()
  4701. if dimension.Type == ArgError || dimension.Number < 0 {
  4702. return newErrorFormulaArg(formulaErrorVALUE, dimension.Error)
  4703. }
  4704. matrix := make([][]formulaArg, 0, int(dimension.Number))
  4705. for i := 0; i < int(dimension.Number); i++ {
  4706. row := make([]formulaArg, int(dimension.Number))
  4707. for j := 0; j < int(dimension.Number); j++ {
  4708. if i == j {
  4709. row[j] = newNumberFormulaArg(1.0)
  4710. } else {
  4711. row[j] = newNumberFormulaArg(0.0)
  4712. }
  4713. }
  4714. matrix = append(matrix, row)
  4715. }
  4716. return newMatrixFormulaArg(matrix)
  4717. }
  4718. // ODD function ounds a supplied number away from zero (i.e. rounds a positive
  4719. // number up and a negative number down), to the next odd number. The syntax
  4720. // of the function is:
  4721. //
  4722. // ODD(number)
  4723. func (fn *formulaFuncs) ODD(argsList *list.List) formulaArg {
  4724. if argsList.Len() != 1 {
  4725. return newErrorFormulaArg(formulaErrorVALUE, "ODD requires 1 numeric argument")
  4726. }
  4727. number := argsList.Back().Value.(formulaArg).ToNumber()
  4728. if number.Type == ArgError {
  4729. return number
  4730. }
  4731. if number.Number == 0 {
  4732. return newNumberFormulaArg(1)
  4733. }
  4734. sign := math.Signbit(number.Number)
  4735. m, frac := math.Modf((number.Number - 1) / 2)
  4736. val := m*2 + 1
  4737. if frac != 0 {
  4738. if !sign {
  4739. val += 2
  4740. } else {
  4741. val -= 2
  4742. }
  4743. }
  4744. return newNumberFormulaArg(val)
  4745. }
  4746. // PI function returns the value of the mathematical constant π (pi), accurate
  4747. // to 15 digits (14 decimal places). The syntax of the function is:
  4748. //
  4749. // PI()
  4750. func (fn *formulaFuncs) PI(argsList *list.List) formulaArg {
  4751. if argsList.Len() != 0 {
  4752. return newErrorFormulaArg(formulaErrorVALUE, "PI accepts no arguments")
  4753. }
  4754. return newNumberFormulaArg(math.Pi)
  4755. }
  4756. // POWER function calculates a given number, raised to a supplied power.
  4757. // The syntax of the function is:
  4758. //
  4759. // POWER(number,power)
  4760. func (fn *formulaFuncs) POWER(argsList *list.List) formulaArg {
  4761. if argsList.Len() != 2 {
  4762. return newErrorFormulaArg(formulaErrorVALUE, "POWER requires 2 numeric arguments")
  4763. }
  4764. x := argsList.Front().Value.(formulaArg).ToNumber()
  4765. if x.Type == ArgError {
  4766. return x
  4767. }
  4768. y := argsList.Back().Value.(formulaArg).ToNumber()
  4769. if y.Type == ArgError {
  4770. return y
  4771. }
  4772. if x.Number == 0 && y.Number == 0 {
  4773. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  4774. }
  4775. if x.Number == 0 && y.Number < 0 {
  4776. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  4777. }
  4778. return newNumberFormulaArg(math.Pow(x.Number, y.Number))
  4779. }
  4780. // PRODUCT function returns the product (multiplication) of a supplied set of
  4781. // numerical values. The syntax of the function is:
  4782. //
  4783. // PRODUCT(number1,[number2],...)
  4784. func (fn *formulaFuncs) PRODUCT(argsList *list.List) formulaArg {
  4785. product := 1.0
  4786. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  4787. token := arg.Value.(formulaArg)
  4788. switch token.Type {
  4789. case ArgString:
  4790. num := token.ToNumber()
  4791. if num.Type != ArgNumber {
  4792. return num
  4793. }
  4794. product = product * num.Number
  4795. case ArgNumber:
  4796. product = product * token.Number
  4797. case ArgMatrix:
  4798. for _, row := range token.Matrix {
  4799. for _, cell := range row {
  4800. if cell.Type == ArgNumber {
  4801. product *= cell.Number
  4802. }
  4803. }
  4804. }
  4805. }
  4806. }
  4807. return newNumberFormulaArg(product)
  4808. }
  4809. // QUOTIENT function returns the integer portion of a division between two
  4810. // supplied numbers. The syntax of the function is:
  4811. //
  4812. // QUOTIENT(numerator,denominator)
  4813. func (fn *formulaFuncs) QUOTIENT(argsList *list.List) formulaArg {
  4814. if argsList.Len() != 2 {
  4815. return newErrorFormulaArg(formulaErrorVALUE, "QUOTIENT requires 2 numeric arguments")
  4816. }
  4817. x := argsList.Front().Value.(formulaArg).ToNumber()
  4818. if x.Type == ArgError {
  4819. return x
  4820. }
  4821. y := argsList.Back().Value.(formulaArg).ToNumber()
  4822. if y.Type == ArgError {
  4823. return y
  4824. }
  4825. if y.Number == 0 {
  4826. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  4827. }
  4828. return newNumberFormulaArg(math.Trunc(x.Number / y.Number))
  4829. }
  4830. // RADIANS function converts radians into degrees. The syntax of the function is:
  4831. //
  4832. // RADIANS(angle)
  4833. func (fn *formulaFuncs) RADIANS(argsList *list.List) formulaArg {
  4834. if argsList.Len() != 1 {
  4835. return newErrorFormulaArg(formulaErrorVALUE, "RADIANS requires 1 numeric argument")
  4836. }
  4837. angle := argsList.Front().Value.(formulaArg).ToNumber()
  4838. if angle.Type == ArgError {
  4839. return angle
  4840. }
  4841. return newNumberFormulaArg(math.Pi / 180.0 * angle.Number)
  4842. }
  4843. // RAND function generates a random real number between 0 and 1. The syntax of
  4844. // the function is:
  4845. //
  4846. // RAND()
  4847. func (fn *formulaFuncs) RAND(argsList *list.List) formulaArg {
  4848. if argsList.Len() != 0 {
  4849. return newErrorFormulaArg(formulaErrorVALUE, "RAND accepts no arguments")
  4850. }
  4851. return newNumberFormulaArg(rand.New(rand.NewSource(time.Now().UnixNano())).Float64())
  4852. }
  4853. // RANDBETWEEN function generates a random integer between two supplied
  4854. // integers. The syntax of the function is:
  4855. //
  4856. // RANDBETWEEN(bottom,top)
  4857. func (fn *formulaFuncs) RANDBETWEEN(argsList *list.List) formulaArg {
  4858. if argsList.Len() != 2 {
  4859. return newErrorFormulaArg(formulaErrorVALUE, "RANDBETWEEN requires 2 numeric arguments")
  4860. }
  4861. bottom := argsList.Front().Value.(formulaArg).ToNumber()
  4862. if bottom.Type == ArgError {
  4863. return bottom
  4864. }
  4865. top := argsList.Back().Value.(formulaArg).ToNumber()
  4866. if top.Type == ArgError {
  4867. return top
  4868. }
  4869. if top.Number < bottom.Number {
  4870. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  4871. }
  4872. num := rand.New(rand.NewSource(time.Now().UnixNano())).Int63n(int64(top.Number - bottom.Number + 1))
  4873. return newNumberFormulaArg(float64(num + int64(bottom.Number)))
  4874. }
  4875. // romanNumerals defined a numeral system that originated in ancient Rome and
  4876. // remained the usual way of writing numbers throughout Europe well into the
  4877. // Late Middle Ages.
  4878. type romanNumerals struct {
  4879. n float64
  4880. s string
  4881. }
  4882. var romanTable = [][]romanNumerals{
  4883. {
  4884. {1000, "M"},
  4885. {900, "CM"},
  4886. {500, "D"},
  4887. {400, "CD"},
  4888. {100, "C"},
  4889. {90, "XC"},
  4890. {50, "L"},
  4891. {40, "XL"},
  4892. {10, "X"},
  4893. {9, "IX"},
  4894. {5, "V"},
  4895. {4, "IV"},
  4896. {1, "I"},
  4897. },
  4898. {
  4899. {1000, "M"},
  4900. {950, "LM"},
  4901. {900, "CM"},
  4902. {500, "D"},
  4903. {450, "LD"},
  4904. {400, "CD"},
  4905. {100, "C"},
  4906. {95, "VC"},
  4907. {90, "XC"},
  4908. {50, "L"},
  4909. {45, "VL"},
  4910. {40, "XL"},
  4911. {10, "X"},
  4912. {9, "IX"},
  4913. {5, "V"},
  4914. {4, "IV"},
  4915. {1, "I"},
  4916. },
  4917. {
  4918. {1000, "M"},
  4919. {990, "XM"},
  4920. {950, "LM"},
  4921. {900, "CM"},
  4922. {500, "D"},
  4923. {490, "XD"},
  4924. {450, "LD"},
  4925. {400, "CD"},
  4926. {100, "C"},
  4927. {99, "IC"},
  4928. {90, "XC"},
  4929. {50, "L"},
  4930. {45, "VL"},
  4931. {40, "XL"},
  4932. {10, "X"},
  4933. {9, "IX"},
  4934. {5, "V"},
  4935. {4, "IV"},
  4936. {1, "I"},
  4937. },
  4938. {
  4939. {1000, "M"},
  4940. {995, "VM"},
  4941. {990, "XM"},
  4942. {950, "LM"},
  4943. {900, "CM"},
  4944. {500, "D"},
  4945. {495, "VD"},
  4946. {490, "XD"},
  4947. {450, "LD"},
  4948. {400, "CD"},
  4949. {100, "C"},
  4950. {99, "IC"},
  4951. {90, "XC"},
  4952. {50, "L"},
  4953. {45, "VL"},
  4954. {40, "XL"},
  4955. {10, "X"},
  4956. {9, "IX"},
  4957. {5, "V"},
  4958. {4, "IV"},
  4959. {1, "I"},
  4960. },
  4961. {
  4962. {1000, "M"},
  4963. {999, "IM"},
  4964. {995, "VM"},
  4965. {990, "XM"},
  4966. {950, "LM"},
  4967. {900, "CM"},
  4968. {500, "D"},
  4969. {499, "ID"},
  4970. {495, "VD"},
  4971. {490, "XD"},
  4972. {450, "LD"},
  4973. {400, "CD"},
  4974. {100, "C"},
  4975. {99, "IC"},
  4976. {90, "XC"},
  4977. {50, "L"},
  4978. {45, "VL"},
  4979. {40, "XL"},
  4980. {10, "X"},
  4981. {9, "IX"},
  4982. {5, "V"},
  4983. {4, "IV"},
  4984. {1, "I"},
  4985. },
  4986. }
  4987. // ROMAN function converts an arabic number to Roman. I.e. for a supplied
  4988. // integer, the function returns a text string depicting the roman numeral
  4989. // form of the number. The syntax of the function is:
  4990. //
  4991. // ROMAN(number,[form])
  4992. func (fn *formulaFuncs) ROMAN(argsList *list.List) formulaArg {
  4993. if argsList.Len() == 0 {
  4994. return newErrorFormulaArg(formulaErrorVALUE, "ROMAN requires at least 1 argument")
  4995. }
  4996. if argsList.Len() > 2 {
  4997. return newErrorFormulaArg(formulaErrorVALUE, "ROMAN allows at most 2 arguments")
  4998. }
  4999. var form int
  5000. number := argsList.Front().Value.(formulaArg).ToNumber()
  5001. if number.Type == ArgError {
  5002. return number
  5003. }
  5004. if argsList.Len() > 1 {
  5005. f := argsList.Back().Value.(formulaArg).ToNumber()
  5006. if f.Type == ArgError {
  5007. return f
  5008. }
  5009. form = int(f.Number)
  5010. if form < 0 {
  5011. form = 0
  5012. } else if form > 4 {
  5013. form = 4
  5014. }
  5015. }
  5016. decimalTable := romanTable[0]
  5017. switch form {
  5018. case 1:
  5019. decimalTable = romanTable[1]
  5020. case 2:
  5021. decimalTable = romanTable[2]
  5022. case 3:
  5023. decimalTable = romanTable[3]
  5024. case 4:
  5025. decimalTable = romanTable[4]
  5026. }
  5027. val := math.Trunc(number.Number)
  5028. buf := bytes.Buffer{}
  5029. for _, r := range decimalTable {
  5030. for val >= r.n {
  5031. buf.WriteString(r.s)
  5032. val -= r.n
  5033. }
  5034. }
  5035. return newStringFormulaArg(buf.String())
  5036. }
  5037. type roundMode byte
  5038. const (
  5039. closest roundMode = iota
  5040. down
  5041. up
  5042. )
  5043. // round rounds a supplied number up or down.
  5044. func (fn *formulaFuncs) round(number, digits float64, mode roundMode) float64 {
  5045. var significance float64
  5046. if digits > 0 {
  5047. significance = math.Pow(1/10.0, digits)
  5048. } else {
  5049. significance = math.Pow(10.0, -digits)
  5050. }
  5051. val, res := math.Modf(number / significance)
  5052. switch mode {
  5053. case closest:
  5054. const eps = 0.499999999
  5055. if res >= eps {
  5056. val++
  5057. } else if res <= -eps {
  5058. val--
  5059. }
  5060. case down:
  5061. case up:
  5062. if res > 0 {
  5063. val++
  5064. } else if res < 0 {
  5065. val--
  5066. }
  5067. }
  5068. return val * significance
  5069. }
  5070. // ROUND function rounds a supplied number up or down, to a specified number
  5071. // of decimal places. The syntax of the function is:
  5072. //
  5073. // ROUND(number,num_digits)
  5074. func (fn *formulaFuncs) ROUND(argsList *list.List) formulaArg {
  5075. if argsList.Len() != 2 {
  5076. return newErrorFormulaArg(formulaErrorVALUE, "ROUND requires 2 numeric arguments")
  5077. }
  5078. number := argsList.Front().Value.(formulaArg).ToNumber()
  5079. if number.Type == ArgError {
  5080. return number
  5081. }
  5082. digits := argsList.Back().Value.(formulaArg).ToNumber()
  5083. if digits.Type == ArgError {
  5084. return digits
  5085. }
  5086. return newNumberFormulaArg(fn.round(number.Number, digits.Number, closest))
  5087. }
  5088. // ROUNDDOWN function rounds a supplied number down towards zero, to a
  5089. // specified number of decimal places. The syntax of the function is:
  5090. //
  5091. // ROUNDDOWN(number,num_digits)
  5092. func (fn *formulaFuncs) ROUNDDOWN(argsList *list.List) formulaArg {
  5093. if argsList.Len() != 2 {
  5094. return newErrorFormulaArg(formulaErrorVALUE, "ROUNDDOWN requires 2 numeric arguments")
  5095. }
  5096. number := argsList.Front().Value.(formulaArg).ToNumber()
  5097. if number.Type == ArgError {
  5098. return number
  5099. }
  5100. digits := argsList.Back().Value.(formulaArg).ToNumber()
  5101. if digits.Type == ArgError {
  5102. return digits
  5103. }
  5104. return newNumberFormulaArg(fn.round(number.Number, digits.Number, down))
  5105. }
  5106. // ROUNDUP function rounds a supplied number up, away from zero, to a
  5107. // specified number of decimal places. The syntax of the function is:
  5108. //
  5109. // ROUNDUP(number,num_digits)
  5110. func (fn *formulaFuncs) ROUNDUP(argsList *list.List) formulaArg {
  5111. if argsList.Len() != 2 {
  5112. return newErrorFormulaArg(formulaErrorVALUE, "ROUNDUP requires 2 numeric arguments")
  5113. }
  5114. number := argsList.Front().Value.(formulaArg).ToNumber()
  5115. if number.Type == ArgError {
  5116. return number
  5117. }
  5118. digits := argsList.Back().Value.(formulaArg).ToNumber()
  5119. if digits.Type == ArgError {
  5120. return digits
  5121. }
  5122. return newNumberFormulaArg(fn.round(number.Number, digits.Number, up))
  5123. }
  5124. // SEC function calculates the secant of a given angle. The syntax of the
  5125. // function is:
  5126. //
  5127. // SEC(number)
  5128. func (fn *formulaFuncs) SEC(argsList *list.List) formulaArg {
  5129. if argsList.Len() != 1 {
  5130. return newErrorFormulaArg(formulaErrorVALUE, "SEC requires 1 numeric argument")
  5131. }
  5132. number := argsList.Front().Value.(formulaArg).ToNumber()
  5133. if number.Type == ArgError {
  5134. return number
  5135. }
  5136. return newNumberFormulaArg(math.Cos(number.Number))
  5137. }
  5138. // SECH function calculates the hyperbolic secant (sech) of a supplied angle.
  5139. // The syntax of the function is:
  5140. //
  5141. // SECH(number)
  5142. func (fn *formulaFuncs) SECH(argsList *list.List) formulaArg {
  5143. if argsList.Len() != 1 {
  5144. return newErrorFormulaArg(formulaErrorVALUE, "SECH requires 1 numeric argument")
  5145. }
  5146. number := argsList.Front().Value.(formulaArg).ToNumber()
  5147. if number.Type == ArgError {
  5148. return number
  5149. }
  5150. return newNumberFormulaArg(1 / math.Cosh(number.Number))
  5151. }
  5152. // SERIESSUM function returns the sum of a power series. The syntax of the
  5153. // function is:
  5154. //
  5155. // SERIESSUM(x,n,m,coefficients)
  5156. func (fn *formulaFuncs) SERIESSUM(argsList *list.List) formulaArg {
  5157. if argsList.Len() != 4 {
  5158. return newErrorFormulaArg(formulaErrorVALUE, "SERIESSUM requires 4 arguments")
  5159. }
  5160. var x, n, m formulaArg
  5161. if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
  5162. return x
  5163. }
  5164. if n = argsList.Front().Next().Value.(formulaArg).ToNumber(); n.Type != ArgNumber {
  5165. return n
  5166. }
  5167. if m = argsList.Front().Next().Next().Value.(formulaArg).ToNumber(); m.Type != ArgNumber {
  5168. return m
  5169. }
  5170. var result, i float64
  5171. for _, coefficient := range argsList.Back().Value.(formulaArg).ToList() {
  5172. if coefficient.Value() == "" {
  5173. continue
  5174. }
  5175. num := coefficient.ToNumber()
  5176. if num.Type != ArgNumber {
  5177. return num
  5178. }
  5179. result += num.Number * math.Pow(x.Number, n.Number+(m.Number*i))
  5180. i++
  5181. }
  5182. return newNumberFormulaArg(result)
  5183. }
  5184. // SIGN function returns the arithmetic sign (+1, -1 or 0) of a supplied
  5185. // number. I.e. if the number is positive, the Sign function returns +1, if
  5186. // the number is negative, the function returns -1 and if the number is 0
  5187. // (zero), the function returns 0. The syntax of the function is:
  5188. //
  5189. // SIGN(number)
  5190. func (fn *formulaFuncs) SIGN(argsList *list.List) formulaArg {
  5191. if argsList.Len() != 1 {
  5192. return newErrorFormulaArg(formulaErrorVALUE, "SIGN requires 1 numeric argument")
  5193. }
  5194. val := argsList.Front().Value.(formulaArg).ToNumber()
  5195. if val.Type == ArgError {
  5196. return val
  5197. }
  5198. if val.Number < 0 {
  5199. return newNumberFormulaArg(-1)
  5200. }
  5201. if val.Number > 0 {
  5202. return newNumberFormulaArg(1)
  5203. }
  5204. return newNumberFormulaArg(0)
  5205. }
  5206. // SIN function calculates the sine of a given angle. The syntax of the
  5207. // function is:
  5208. //
  5209. // SIN(number)
  5210. func (fn *formulaFuncs) SIN(argsList *list.List) formulaArg {
  5211. if argsList.Len() != 1 {
  5212. return newErrorFormulaArg(formulaErrorVALUE, "SIN requires 1 numeric argument")
  5213. }
  5214. number := argsList.Front().Value.(formulaArg).ToNumber()
  5215. if number.Type == ArgError {
  5216. return number
  5217. }
  5218. return newNumberFormulaArg(math.Sin(number.Number))
  5219. }
  5220. // SINH function calculates the hyperbolic sine (sinh) of a supplied number.
  5221. // The syntax of the function is:
  5222. //
  5223. // SINH(number)
  5224. func (fn *formulaFuncs) SINH(argsList *list.List) formulaArg {
  5225. if argsList.Len() != 1 {
  5226. return newErrorFormulaArg(formulaErrorVALUE, "SINH requires 1 numeric argument")
  5227. }
  5228. number := argsList.Front().Value.(formulaArg).ToNumber()
  5229. if number.Type == ArgError {
  5230. return number
  5231. }
  5232. return newNumberFormulaArg(math.Sinh(number.Number))
  5233. }
  5234. // SQRT function calculates the positive square root of a supplied number. The
  5235. // syntax of the function is:
  5236. //
  5237. // SQRT(number)
  5238. func (fn *formulaFuncs) SQRT(argsList *list.List) formulaArg {
  5239. if argsList.Len() != 1 {
  5240. return newErrorFormulaArg(formulaErrorVALUE, "SQRT requires 1 numeric argument")
  5241. }
  5242. value := argsList.Front().Value.(formulaArg).ToNumber()
  5243. if value.Type == ArgError {
  5244. return value
  5245. }
  5246. if value.Number < 0 {
  5247. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  5248. }
  5249. return newNumberFormulaArg(math.Sqrt(value.Number))
  5250. }
  5251. // SQRTPI function returns the square root of a supplied number multiplied by
  5252. // the mathematical constant, π. The syntax of the function is:
  5253. //
  5254. // SQRTPI(number)
  5255. func (fn *formulaFuncs) SQRTPI(argsList *list.List) formulaArg {
  5256. if argsList.Len() != 1 {
  5257. return newErrorFormulaArg(formulaErrorVALUE, "SQRTPI requires 1 numeric argument")
  5258. }
  5259. number := argsList.Front().Value.(formulaArg).ToNumber()
  5260. if number.Type == ArgError {
  5261. return number
  5262. }
  5263. return newNumberFormulaArg(math.Sqrt(number.Number * math.Pi))
  5264. }
  5265. // STDEV function calculates the sample standard deviation of a supplied set
  5266. // of values. The syntax of the function is:
  5267. //
  5268. // STDEV(number1,[number2],...)
  5269. func (fn *formulaFuncs) STDEV(argsList *list.List) formulaArg {
  5270. if argsList.Len() < 1 {
  5271. return newErrorFormulaArg(formulaErrorVALUE, "STDEV requires at least 1 argument")
  5272. }
  5273. return fn.stdev(false, argsList)
  5274. }
  5275. // STDEVdotS function calculates the sample standard deviation of a supplied
  5276. // set of values. The syntax of the function is:
  5277. //
  5278. // STDEV.S(number1,[number2],...)
  5279. func (fn *formulaFuncs) STDEVdotS(argsList *list.List) formulaArg {
  5280. if argsList.Len() < 1 {
  5281. return newErrorFormulaArg(formulaErrorVALUE, "STDEV.S requires at least 1 argument")
  5282. }
  5283. return fn.stdev(false, argsList)
  5284. }
  5285. // STDEVA function estimates standard deviation based on a sample. The
  5286. // standard deviation is a measure of how widely values are dispersed from
  5287. // the average value (the mean). The syntax of the function is:
  5288. //
  5289. // STDEVA(number1,[number2],...)
  5290. func (fn *formulaFuncs) STDEVA(argsList *list.List) formulaArg {
  5291. if argsList.Len() < 1 {
  5292. return newErrorFormulaArg(formulaErrorVALUE, "STDEVA requires at least 1 argument")
  5293. }
  5294. return fn.stdev(true, argsList)
  5295. }
  5296. // calcStdevPow is part of the implementation stdev.
  5297. func calcStdevPow(result, count float64, n, m formulaArg) (float64, float64) {
  5298. if result == -1 {
  5299. result = math.Pow(n.Number-m.Number, 2)
  5300. } else {
  5301. result += math.Pow(n.Number-m.Number, 2)
  5302. }
  5303. count++
  5304. return result, count
  5305. }
  5306. // calcStdev is part of the implementation stdev.
  5307. func calcStdev(stdeva bool, result, count float64, mean, token formulaArg) (float64, float64) {
  5308. for _, row := range token.ToList() {
  5309. if row.Type == ArgNumber || row.Type == ArgString {
  5310. if !stdeva && (row.Value() == "TRUE" || row.Value() == "FALSE") {
  5311. continue
  5312. } else if stdeva && (row.Value() == "TRUE" || row.Value() == "FALSE") {
  5313. num := row.ToBool()
  5314. if num.Type == ArgNumber {
  5315. result, count = calcStdevPow(result, count, num, mean)
  5316. continue
  5317. }
  5318. } else {
  5319. num := row.ToNumber()
  5320. if num.Type == ArgNumber {
  5321. result, count = calcStdevPow(result, count, num, mean)
  5322. }
  5323. }
  5324. }
  5325. }
  5326. return result, count
  5327. }
  5328. // stdev is an implementation of the formula functions STDEV and STDEVA.
  5329. func (fn *formulaFuncs) stdev(stdeva bool, argsList *list.List) formulaArg {
  5330. count, result := -1.0, -1.0
  5331. var mean formulaArg
  5332. if stdeva {
  5333. mean = fn.AVERAGEA(argsList)
  5334. } else {
  5335. mean = fn.AVERAGE(argsList)
  5336. }
  5337. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  5338. token := arg.Value.(formulaArg)
  5339. switch token.Type {
  5340. case ArgString, ArgNumber:
  5341. if !stdeva && (token.Value() == "TRUE" || token.Value() == "FALSE") {
  5342. continue
  5343. } else if stdeva && (token.Value() == "TRUE" || token.Value() == "FALSE") {
  5344. num := token.ToBool()
  5345. if num.Type == ArgNumber {
  5346. result, count = calcStdevPow(result, count, num, mean)
  5347. continue
  5348. }
  5349. } else {
  5350. num := token.ToNumber()
  5351. if num.Type == ArgNumber {
  5352. result, count = calcStdevPow(result, count, num, mean)
  5353. }
  5354. }
  5355. case ArgList, ArgMatrix:
  5356. result, count = calcStdev(stdeva, result, count, mean, token)
  5357. }
  5358. }
  5359. if count > 0 && result >= 0 {
  5360. return newNumberFormulaArg(math.Sqrt(result / count))
  5361. }
  5362. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  5363. }
  5364. // POISSONdotDIST function calculates the Poisson Probability Mass Function or
  5365. // the Cumulative Poisson Probability Function for a supplied set of
  5366. // parameters. The syntax of the function is:
  5367. //
  5368. // POISSON.DIST(x,mean,cumulative)
  5369. func (fn *formulaFuncs) POISSONdotDIST(argsList *list.List) formulaArg {
  5370. if argsList.Len() != 3 {
  5371. return newErrorFormulaArg(formulaErrorVALUE, "POISSON.DIST requires 3 arguments")
  5372. }
  5373. return fn.POISSON(argsList)
  5374. }
  5375. // POISSON function calculates the Poisson Probability Mass Function or the
  5376. // Cumulative Poisson Probability Function for a supplied set of parameters.
  5377. // The syntax of the function is:
  5378. //
  5379. // POISSON(x,mean,cumulative)
  5380. func (fn *formulaFuncs) POISSON(argsList *list.List) formulaArg {
  5381. if argsList.Len() != 3 {
  5382. return newErrorFormulaArg(formulaErrorVALUE, "POISSON requires 3 arguments")
  5383. }
  5384. var x, mean, cumulative formulaArg
  5385. if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
  5386. return x
  5387. }
  5388. if mean = argsList.Front().Next().Value.(formulaArg).ToNumber(); mean.Type != ArgNumber {
  5389. return mean
  5390. }
  5391. if cumulative = argsList.Back().Value.(formulaArg).ToBool(); cumulative.Type == ArgError {
  5392. return cumulative
  5393. }
  5394. if x.Number < 0 || mean.Number <= 0 {
  5395. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  5396. }
  5397. if cumulative.Number == 1 {
  5398. summer := 0.0
  5399. floor := math.Floor(x.Number)
  5400. for i := 0; i <= int(floor); i++ {
  5401. summer += math.Pow(mean.Number, float64(i)) / fact(float64(i))
  5402. }
  5403. return newNumberFormulaArg(math.Exp(0-mean.Number) * summer)
  5404. }
  5405. return newNumberFormulaArg(math.Exp(0-mean.Number) * math.Pow(mean.Number, x.Number) / fact(x.Number))
  5406. }
  5407. // SUBTOTAL function performs a specified calculation (e.g. the sum, product,
  5408. // average, etc.) for a supplied set of values. The syntax of the function is:
  5409. //
  5410. // SUBTOTAL(function_num,ref1,[ref2],...)
  5411. func (fn *formulaFuncs) SUBTOTAL(argsList *list.List) formulaArg {
  5412. if argsList.Len() < 2 {
  5413. return newErrorFormulaArg(formulaErrorVALUE, "SUBTOTAL requires at least 2 arguments")
  5414. }
  5415. var fnNum formulaArg
  5416. if fnNum = argsList.Front().Value.(formulaArg).ToNumber(); fnNum.Type != ArgNumber {
  5417. return fnNum
  5418. }
  5419. subFn, ok := map[int]func(argsList *list.List) formulaArg{
  5420. 1: fn.AVERAGE, 101: fn.AVERAGE,
  5421. 2: fn.COUNT, 102: fn.COUNT,
  5422. 3: fn.COUNTA, 103: fn.COUNTA,
  5423. 4: fn.MAX, 104: fn.MAX,
  5424. 5: fn.MIN, 105: fn.MIN,
  5425. 6: fn.PRODUCT, 106: fn.PRODUCT,
  5426. 7: fn.STDEV, 107: fn.STDEV,
  5427. 8: fn.STDEVP, 108: fn.STDEVP,
  5428. 9: fn.SUM, 109: fn.SUM,
  5429. 10: fn.VAR, 110: fn.VAR,
  5430. 11: fn.VARP, 111: fn.VARP,
  5431. }[int(fnNum.Number)]
  5432. if !ok {
  5433. return newErrorFormulaArg(formulaErrorVALUE, "SUBTOTAL has invalid function_num")
  5434. }
  5435. subArgList := list.New().Init()
  5436. for arg := argsList.Front().Next(); arg != nil; arg = arg.Next() {
  5437. subArgList.PushBack(arg.Value.(formulaArg))
  5438. }
  5439. return subFn(subArgList)
  5440. }
  5441. // SUM function adds together a supplied set of numbers and returns the sum of
  5442. // these values. The syntax of the function is:
  5443. //
  5444. // SUM(number1,[number2],...)
  5445. func (fn *formulaFuncs) SUM(argsList *list.List) formulaArg {
  5446. var sum float64
  5447. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  5448. token := arg.Value.(formulaArg)
  5449. switch token.Type {
  5450. case ArgError:
  5451. return token
  5452. case ArgString:
  5453. if num := token.ToNumber(); num.Type == ArgNumber {
  5454. sum += num.Number
  5455. }
  5456. case ArgNumber:
  5457. sum += token.Number
  5458. case ArgMatrix:
  5459. for _, row := range token.Matrix {
  5460. for _, value := range row {
  5461. if num := value.ToNumber(); num.Type == ArgNumber {
  5462. sum += num.Number
  5463. }
  5464. }
  5465. }
  5466. }
  5467. }
  5468. return newNumberFormulaArg(sum)
  5469. }
  5470. // SUMIF function finds the values in a supplied array, that satisfy a given
  5471. // criteria, and returns the sum of the corresponding values in a second
  5472. // supplied array. The syntax of the function is:
  5473. //
  5474. // SUMIF(range,criteria,[sum_range])
  5475. func (fn *formulaFuncs) SUMIF(argsList *list.List) formulaArg {
  5476. if argsList.Len() < 2 {
  5477. return newErrorFormulaArg(formulaErrorVALUE, "SUMIF requires at least 2 arguments")
  5478. }
  5479. criteria := formulaCriteriaParser(argsList.Front().Next().Value.(formulaArg).String)
  5480. rangeMtx := argsList.Front().Value.(formulaArg).Matrix
  5481. var sumRange [][]formulaArg
  5482. if argsList.Len() == 3 {
  5483. sumRange = argsList.Back().Value.(formulaArg).Matrix
  5484. }
  5485. var sum float64
  5486. var arg formulaArg
  5487. for rowIdx, row := range rangeMtx {
  5488. for colIdx, cell := range row {
  5489. arg = cell
  5490. if arg.Type == ArgEmpty {
  5491. continue
  5492. }
  5493. if ok, _ := formulaCriteriaEval(arg.Value(), criteria); ok {
  5494. if argsList.Len() == 3 {
  5495. if len(sumRange) > rowIdx && len(sumRange[rowIdx]) > colIdx {
  5496. arg = sumRange[rowIdx][colIdx]
  5497. }
  5498. }
  5499. if arg.Type == ArgNumber {
  5500. sum += arg.Number
  5501. }
  5502. }
  5503. }
  5504. }
  5505. return newNumberFormulaArg(sum)
  5506. }
  5507. // SUMIFS function finds values in one or more supplied arrays, that satisfy a
  5508. // set of criteria, and returns the sum of the corresponding values in a
  5509. // further supplied array. The syntax of the function is:
  5510. //
  5511. // SUMIFS(sum_range,criteria_range1,criteria1,[criteria_range2,criteria2],...)
  5512. func (fn *formulaFuncs) SUMIFS(argsList *list.List) formulaArg {
  5513. if argsList.Len() < 3 {
  5514. return newErrorFormulaArg(formulaErrorVALUE, "SUMIFS requires at least 3 arguments")
  5515. }
  5516. if argsList.Len()%2 != 1 {
  5517. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  5518. }
  5519. var args []formulaArg
  5520. sum, sumRange := 0.0, argsList.Front().Value.(formulaArg).Matrix
  5521. for arg := argsList.Front().Next(); arg != nil; arg = arg.Next() {
  5522. args = append(args, arg.Value.(formulaArg))
  5523. }
  5524. for _, ref := range formulaIfsMatch(args) {
  5525. if ref.Row >= len(sumRange) || ref.Col >= len(sumRange[ref.Row]) {
  5526. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  5527. }
  5528. if num := sumRange[ref.Row][ref.Col].ToNumber(); num.Type == ArgNumber {
  5529. sum += num.Number
  5530. }
  5531. }
  5532. return newNumberFormulaArg(sum)
  5533. }
  5534. // sumproduct is an implementation of the formula function SUMPRODUCT.
  5535. func (fn *formulaFuncs) sumproduct(argsList *list.List) formulaArg {
  5536. var (
  5537. argType ArgType
  5538. n int
  5539. res []float64
  5540. sum float64
  5541. )
  5542. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  5543. token := arg.Value.(formulaArg)
  5544. if argType == ArgUnknown {
  5545. argType = token.Type
  5546. }
  5547. if token.Type != argType {
  5548. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  5549. }
  5550. switch token.Type {
  5551. case ArgString, ArgNumber:
  5552. if num := token.ToNumber(); num.Type == ArgNumber {
  5553. sum = fn.PRODUCT(argsList).Number
  5554. continue
  5555. }
  5556. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  5557. case ArgMatrix:
  5558. args := token.ToList()
  5559. if res == nil {
  5560. n = len(args)
  5561. res = make([]float64, n)
  5562. for i := range res {
  5563. res[i] = 1.0
  5564. }
  5565. }
  5566. if len(args) != n {
  5567. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  5568. }
  5569. for i, value := range args {
  5570. num := value.ToNumber()
  5571. if num.Type != ArgNumber && value.Value() != "" {
  5572. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  5573. }
  5574. res[i] = res[i] * num.Number
  5575. }
  5576. }
  5577. }
  5578. for _, r := range res {
  5579. sum += r
  5580. }
  5581. return newNumberFormulaArg(sum)
  5582. }
  5583. // SUMPRODUCT function returns the sum of the products of the corresponding
  5584. // values in a set of supplied arrays. The syntax of the function is:
  5585. //
  5586. // SUMPRODUCT(array1,[array2],[array3],...)
  5587. func (fn *formulaFuncs) SUMPRODUCT(argsList *list.List) formulaArg {
  5588. if argsList.Len() < 1 {
  5589. return newErrorFormulaArg(formulaErrorVALUE, "SUMPRODUCT requires at least 1 argument")
  5590. }
  5591. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  5592. if token := arg.Value.(formulaArg); token.Type == ArgError {
  5593. return token
  5594. }
  5595. }
  5596. return fn.sumproduct(argsList)
  5597. }
  5598. // SUMSQ function returns the sum of squares of a supplied set of values. The
  5599. // syntax of the function is:
  5600. //
  5601. // SUMSQ(number1,[number2],...)
  5602. func (fn *formulaFuncs) SUMSQ(argsList *list.List) formulaArg {
  5603. var val, sq float64
  5604. var err error
  5605. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  5606. token := arg.Value.(formulaArg)
  5607. switch token.Type {
  5608. case ArgString:
  5609. if token.String == "" {
  5610. continue
  5611. }
  5612. if val, err = strconv.ParseFloat(token.String, 64); err != nil {
  5613. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  5614. }
  5615. sq += val * val
  5616. case ArgNumber:
  5617. sq += token.Number * token.Number
  5618. case ArgMatrix:
  5619. for _, row := range token.Matrix {
  5620. for _, value := range row {
  5621. if value.Value() == "" {
  5622. continue
  5623. }
  5624. if val, err = strconv.ParseFloat(value.Value(), 64); err != nil {
  5625. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  5626. }
  5627. sq += val * val
  5628. }
  5629. }
  5630. }
  5631. }
  5632. return newNumberFormulaArg(sq)
  5633. }
  5634. // sumx is an implementation of the formula functions SUMX2MY2, SUMX2PY2 and
  5635. // SUMXMY2.
  5636. func (fn *formulaFuncs) sumx(name string, argsList *list.List) formulaArg {
  5637. if argsList.Len() != 2 {
  5638. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 2 arguments", name))
  5639. }
  5640. array1 := argsList.Front().Value.(formulaArg)
  5641. array2 := argsList.Back().Value.(formulaArg)
  5642. left, right := array1.ToList(), array2.ToList()
  5643. n := len(left)
  5644. if n != len(right) {
  5645. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  5646. }
  5647. result := 0.0
  5648. for i := 0; i < n; i++ {
  5649. if lhs, rhs := left[i].ToNumber(), right[i].ToNumber(); lhs.Number != 0 && rhs.Number != 0 {
  5650. switch name {
  5651. case "SUMX2MY2":
  5652. result += lhs.Number*lhs.Number - rhs.Number*rhs.Number
  5653. case "SUMX2PY2":
  5654. result += lhs.Number*lhs.Number + rhs.Number*rhs.Number
  5655. default:
  5656. result += (lhs.Number - rhs.Number) * (lhs.Number - rhs.Number)
  5657. }
  5658. }
  5659. }
  5660. return newNumberFormulaArg(result)
  5661. }
  5662. // SUMX2MY2 function returns the sum of the differences of squares of two
  5663. // supplied sets of values. The syntax of the function is:
  5664. //
  5665. // SUMX2MY2(array_x,array_y)
  5666. func (fn *formulaFuncs) SUMX2MY2(argsList *list.List) formulaArg {
  5667. return fn.sumx("SUMX2MY2", argsList)
  5668. }
  5669. // SUMX2PY2 function returns the sum of the sum of squares of two supplied sets
  5670. // of values. The syntax of the function is:
  5671. //
  5672. // SUMX2PY2(array_x,array_y)
  5673. func (fn *formulaFuncs) SUMX2PY2(argsList *list.List) formulaArg {
  5674. return fn.sumx("SUMX2PY2", argsList)
  5675. }
  5676. // SUMXMY2 function returns the sum of the squares of differences between
  5677. // corresponding values in two supplied arrays. The syntax of the function
  5678. // is:
  5679. //
  5680. // SUMXMY2(array_x,array_y)
  5681. func (fn *formulaFuncs) SUMXMY2(argsList *list.List) formulaArg {
  5682. return fn.sumx("SUMXMY2", argsList)
  5683. }
  5684. // TAN function calculates the tangent of a given angle. The syntax of the
  5685. // function is:
  5686. //
  5687. // TAN(number)
  5688. func (fn *formulaFuncs) TAN(argsList *list.List) formulaArg {
  5689. if argsList.Len() != 1 {
  5690. return newErrorFormulaArg(formulaErrorVALUE, "TAN requires 1 numeric argument")
  5691. }
  5692. number := argsList.Front().Value.(formulaArg).ToNumber()
  5693. if number.Type == ArgError {
  5694. return number
  5695. }
  5696. return newNumberFormulaArg(math.Tan(number.Number))
  5697. }
  5698. // TANH function calculates the hyperbolic tangent (tanh) of a supplied
  5699. // number. The syntax of the function is:
  5700. //
  5701. // TANH(number)
  5702. func (fn *formulaFuncs) TANH(argsList *list.List) formulaArg {
  5703. if argsList.Len() != 1 {
  5704. return newErrorFormulaArg(formulaErrorVALUE, "TANH requires 1 numeric argument")
  5705. }
  5706. number := argsList.Front().Value.(formulaArg).ToNumber()
  5707. if number.Type == ArgError {
  5708. return number
  5709. }
  5710. return newNumberFormulaArg(math.Tanh(number.Number))
  5711. }
  5712. // TRUNC function truncates a supplied number to a specified number of decimal
  5713. // places. The syntax of the function is:
  5714. //
  5715. // TRUNC(number,[number_digits])
  5716. func (fn *formulaFuncs) TRUNC(argsList *list.List) formulaArg {
  5717. if argsList.Len() == 0 {
  5718. return newErrorFormulaArg(formulaErrorVALUE, "TRUNC requires at least 1 argument")
  5719. }
  5720. var digits, adjust, rtrim float64
  5721. var err error
  5722. number := argsList.Front().Value.(formulaArg).ToNumber()
  5723. if number.Type == ArgError {
  5724. return number
  5725. }
  5726. if argsList.Len() > 1 {
  5727. d := argsList.Back().Value.(formulaArg).ToNumber()
  5728. if d.Type == ArgError {
  5729. return d
  5730. }
  5731. digits = d.Number
  5732. digits = math.Floor(digits)
  5733. }
  5734. adjust = math.Pow(10, digits)
  5735. x := int((math.Abs(number.Number) - math.Abs(float64(int(number.Number)))) * adjust)
  5736. if x != 0 {
  5737. if rtrim, err = strconv.ParseFloat(strings.TrimRight(strconv.Itoa(x), "0"), 64); err != nil {
  5738. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  5739. }
  5740. }
  5741. if (digits > 0) && (rtrim < adjust/10) {
  5742. return newNumberFormulaArg(number.Number)
  5743. }
  5744. return newNumberFormulaArg(float64(int(number.Number*adjust)) / adjust)
  5745. }
  5746. // Statistical Functions
  5747. // AVEDEV function calculates the average deviation of a supplied set of
  5748. // values. The syntax of the function is:
  5749. //
  5750. // AVEDEV(number1,[number2],...)
  5751. func (fn *formulaFuncs) AVEDEV(argsList *list.List) formulaArg {
  5752. if argsList.Len() == 0 {
  5753. return newErrorFormulaArg(formulaErrorVALUE, "AVEDEV requires at least 1 argument")
  5754. }
  5755. average := fn.AVERAGE(argsList)
  5756. if average.Type != ArgNumber {
  5757. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  5758. }
  5759. result, count := 0.0, 0.0
  5760. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  5761. num := arg.Value.(formulaArg).ToNumber()
  5762. if num.Type != ArgNumber {
  5763. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  5764. }
  5765. result += math.Abs(num.Number - average.Number)
  5766. count++
  5767. }
  5768. return newNumberFormulaArg(result / count)
  5769. }
  5770. // AVERAGE function returns the arithmetic mean of a list of supplied numbers.
  5771. // The syntax of the function is:
  5772. //
  5773. // AVERAGE(number1,[number2],...)
  5774. func (fn *formulaFuncs) AVERAGE(argsList *list.List) formulaArg {
  5775. var args []formulaArg
  5776. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  5777. args = append(args, arg.Value.(formulaArg))
  5778. }
  5779. count, sum := fn.countSum(false, args)
  5780. if count == 0 {
  5781. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  5782. }
  5783. return newNumberFormulaArg(sum / count)
  5784. }
  5785. // AVERAGEA function returns the arithmetic mean of a list of supplied numbers
  5786. // with text cell and zero values. The syntax of the function is:
  5787. //
  5788. // AVERAGEA(number1,[number2],...)
  5789. func (fn *formulaFuncs) AVERAGEA(argsList *list.List) formulaArg {
  5790. var args []formulaArg
  5791. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  5792. args = append(args, arg.Value.(formulaArg))
  5793. }
  5794. count, sum := fn.countSum(true, args)
  5795. if count == 0 {
  5796. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  5797. }
  5798. return newNumberFormulaArg(sum / count)
  5799. }
  5800. // AVERAGEIF function finds the values in a supplied array that satisfy a
  5801. // specified criteria, and returns the average (i.e. the statistical mean) of
  5802. // the corresponding values in a second supplied array. The syntax of the
  5803. // function is:
  5804. //
  5805. // AVERAGEIF(range,criteria,[average_range])
  5806. func (fn *formulaFuncs) AVERAGEIF(argsList *list.List) formulaArg {
  5807. if argsList.Len() < 2 {
  5808. return newErrorFormulaArg(formulaErrorVALUE, "AVERAGEIF requires at least 2 arguments")
  5809. }
  5810. var (
  5811. criteria = formulaCriteriaParser(argsList.Front().Next().Value.(formulaArg).Value())
  5812. rangeMtx = argsList.Front().Value.(formulaArg).Matrix
  5813. cellRange [][]formulaArg
  5814. args []formulaArg
  5815. val float64
  5816. err error
  5817. ok bool
  5818. )
  5819. if argsList.Len() == 3 {
  5820. cellRange = argsList.Back().Value.(formulaArg).Matrix
  5821. }
  5822. for rowIdx, row := range rangeMtx {
  5823. for colIdx, col := range row {
  5824. fromVal := col.Value()
  5825. if col.Value() == "" {
  5826. continue
  5827. }
  5828. ok, _ = formulaCriteriaEval(fromVal, criteria)
  5829. if ok {
  5830. if argsList.Len() == 3 {
  5831. if len(cellRange) > rowIdx && len(cellRange[rowIdx]) > colIdx {
  5832. fromVal = cellRange[rowIdx][colIdx].Value()
  5833. }
  5834. }
  5835. if val, err = strconv.ParseFloat(fromVal, 64); err != nil {
  5836. continue
  5837. }
  5838. args = append(args, newNumberFormulaArg(val))
  5839. }
  5840. }
  5841. }
  5842. count, sum := fn.countSum(false, args)
  5843. if count == 0 {
  5844. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  5845. }
  5846. return newNumberFormulaArg(sum / count)
  5847. }
  5848. // AVERAGEIFS function finds entries in one or more arrays, that satisfy a set
  5849. // of supplied criteria, and returns the average (i.e. the statistical mean)
  5850. // of the corresponding values in a further supplied array. The syntax of the
  5851. // function is:
  5852. //
  5853. // AVERAGEIFS(average_range,criteria_range1,criteria1,[criteria_range2,criteria2],...)
  5854. func (fn *formulaFuncs) AVERAGEIFS(argsList *list.List) formulaArg {
  5855. if argsList.Len() < 3 {
  5856. return newErrorFormulaArg(formulaErrorVALUE, "AVERAGEIFS requires at least 3 arguments")
  5857. }
  5858. if argsList.Len()%2 != 1 {
  5859. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  5860. }
  5861. var args []formulaArg
  5862. sum, sumRange := 0.0, argsList.Front().Value.(formulaArg).Matrix
  5863. for arg := argsList.Front().Next(); arg != nil; arg = arg.Next() {
  5864. args = append(args, arg.Value.(formulaArg))
  5865. }
  5866. count := 0.0
  5867. for _, ref := range formulaIfsMatch(args) {
  5868. if num := sumRange[ref.Row][ref.Col].ToNumber(); num.Type == ArgNumber {
  5869. sum += num.Number
  5870. count++
  5871. }
  5872. }
  5873. if count == 0 {
  5874. return newErrorFormulaArg(formulaErrorDIV, "AVERAGEIF divide by zero")
  5875. }
  5876. return newNumberFormulaArg(sum / count)
  5877. }
  5878. // getBetaHelperContFrac continued fractions for the beta function.
  5879. func getBetaHelperContFrac(fX, fA, fB float64) float64 {
  5880. var a1, b1, a2, b2, fnorm, cfnew, cf, rm float64
  5881. a1, b1, b2 = 1, 1, 1-(fA+fB)/(fA+1)*fX
  5882. if b2 == 0 {
  5883. a2, fnorm, cf = 0, 1, 1
  5884. } else {
  5885. a2, fnorm = 1, 1/b2
  5886. cf = a2 * fnorm
  5887. }
  5888. cfnew, rm = 1, 1
  5889. fMaxIter, fMachEps := 50000.0, 2.22045e-016
  5890. bfinished := false
  5891. for rm < fMaxIter && !bfinished {
  5892. apl2m := fA + 2*rm
  5893. d2m := rm * (fB - rm) * fX / ((apl2m - 1) * apl2m)
  5894. d2m1 := -(fA + rm) * (fA + fB + rm) * fX / (apl2m * (apl2m + 1))
  5895. a1 = (a2 + d2m*a1) * fnorm
  5896. b1 = (b2 + d2m*b1) * fnorm
  5897. a2 = a1 + d2m1*a2*fnorm
  5898. b2 = b1 + d2m1*b2*fnorm
  5899. if b2 != 0 {
  5900. fnorm = 1 / b2
  5901. cfnew = a2 * fnorm
  5902. bfinished = math.Abs(cf-cfnew) < math.Abs(cf)*fMachEps
  5903. }
  5904. cf = cfnew
  5905. rm++
  5906. }
  5907. return cf
  5908. }
  5909. // getLanczosSum uses a variant of the Lanczos sum with a rational function.
  5910. func getLanczosSum(fZ float64) float64 {
  5911. num := []float64{
  5912. 23531376880.41075968857200767445163675473,
  5913. 42919803642.64909876895789904700198885093,
  5914. 35711959237.35566804944018545154716670596,
  5915. 17921034426.03720969991975575445893111267,
  5916. 6039542586.35202800506429164430729792107,
  5917. 1439720407.311721673663223072794912393972,
  5918. 248874557.8620541565114603864132294232163,
  5919. 31426415.58540019438061423162831820536287,
  5920. 2876370.628935372441225409051620849613599,
  5921. 186056.2653952234950402949897160456992822,
  5922. 8071.672002365816210638002902272250613822,
  5923. 210.8242777515793458725097339207133627117,
  5924. 2.506628274631000270164908177133837338626,
  5925. }
  5926. denom := []float64{
  5927. 0,
  5928. 39916800,
  5929. 120543840,
  5930. 150917976,
  5931. 105258076,
  5932. 45995730,
  5933. 13339535,
  5934. 2637558,
  5935. 357423,
  5936. 32670,
  5937. 1925,
  5938. 66,
  5939. 1,
  5940. }
  5941. var sumNum, sumDenom, zInv float64
  5942. if fZ <= 1 {
  5943. sumNum = num[12]
  5944. sumDenom = denom[12]
  5945. for i := 11; i >= 0; i-- {
  5946. sumNum *= fZ
  5947. sumNum += num[i]
  5948. sumDenom *= fZ
  5949. sumDenom += denom[i]
  5950. }
  5951. } else {
  5952. zInv = 1 / fZ
  5953. sumNum = num[0]
  5954. sumDenom = denom[0]
  5955. for i := 1; i <= 12; i++ {
  5956. sumNum *= zInv
  5957. sumNum += num[i]
  5958. sumDenom *= zInv
  5959. sumDenom += denom[i]
  5960. }
  5961. }
  5962. return sumNum / sumDenom
  5963. }
  5964. // getBeta return beta distribution.
  5965. func getBeta(fAlpha, fBeta float64) float64 {
  5966. var fA, fB float64
  5967. if fAlpha > fBeta {
  5968. fA = fAlpha
  5969. fB = fBeta
  5970. } else {
  5971. fA = fBeta
  5972. fB = fAlpha
  5973. }
  5974. const maxGammaArgument = 171.624376956302
  5975. if fA+fB < maxGammaArgument {
  5976. return math.Gamma(fA) / math.Gamma(fA+fB) * math.Gamma(fB)
  5977. }
  5978. fg := 6.024680040776729583740234375
  5979. fgm := fg - 0.5
  5980. fLanczos := getLanczosSum(fA)
  5981. fLanczos /= getLanczosSum(fA + fB)
  5982. fLanczos *= getLanczosSum(fB)
  5983. fABgm := fA + fB + fgm
  5984. fLanczos *= math.Sqrt((fABgm / (fA + fgm)) / (fB + fgm))
  5985. fTempA := fB / (fA + fgm)
  5986. fTempB := fA / (fB + fgm)
  5987. fResult := math.Exp(-fA*math.Log1p(fTempA) - fB*math.Log1p(fTempB) - fgm)
  5988. fResult *= fLanczos
  5989. return fResult
  5990. }
  5991. // getBetaDistPDF is an implementation for the Beta probability density
  5992. // function.
  5993. func getBetaDistPDF(fX, fA, fB float64) float64 {
  5994. if fX <= 0 || fX >= 1 {
  5995. return 0
  5996. }
  5997. fLogDblMax, fLogDblMin := math.Log(1.79769e+308), math.Log(2.22507e-308)
  5998. fLogY := math.Log(0.5 - fX + 0.5)
  5999. if fX < 0.1 {
  6000. fLogY = math.Log1p(-fX)
  6001. }
  6002. fLogX := math.Log(fX)
  6003. fAm1LogX := (fA - 1) * fLogX
  6004. fBm1LogY := (fB - 1) * fLogY
  6005. fLogBeta := getLogBeta(fA, fB)
  6006. if fAm1LogX < fLogDblMax && fAm1LogX > fLogDblMin && fBm1LogY < fLogDblMax &&
  6007. fBm1LogY > fLogDblMin && fLogBeta < fLogDblMax && fLogBeta > fLogDblMin &&
  6008. fAm1LogX+fBm1LogY < fLogDblMax && fAm1LogX+fBm1LogY > fLogDblMin {
  6009. return math.Pow(fX, fA-1) * math.Pow(0.5-fX+0.5, fB-1) / getBeta(fA, fB)
  6010. }
  6011. return math.Exp(fAm1LogX + fBm1LogY - fLogBeta)
  6012. }
  6013. // getLogBeta return beta with logarithm.
  6014. func getLogBeta(fAlpha, fBeta float64) float64 {
  6015. var fA, fB float64
  6016. if fAlpha > fBeta {
  6017. fA, fB = fAlpha, fBeta
  6018. } else {
  6019. fA, fB = fBeta, fAlpha
  6020. }
  6021. fg := 6.024680040776729583740234375
  6022. fgm := fg - 0.5
  6023. fLanczos := getLanczosSum(fA)
  6024. fLanczos /= getLanczosSum(fA + fB)
  6025. fLanczos *= getLanczosSum(fB)
  6026. fLogLanczos := math.Log(fLanczos)
  6027. fABgm := fA + fB + fgm
  6028. fLogLanczos += 0.5 * (math.Log(fABgm) - math.Log(fA+fgm) - math.Log(fB+fgm))
  6029. fTempA := fB / (fA + fgm)
  6030. fTempB := fA / (fB + fgm)
  6031. fResult := -fA*math.Log1p(fTempA) - fB*math.Log1p(fTempB) - fgm
  6032. fResult += fLogLanczos
  6033. return fResult
  6034. }
  6035. // getBetaDist is an implementation for the beta distribution function.
  6036. func getBetaDist(fXin, fAlpha, fBeta float64) float64 {
  6037. if fXin <= 0 {
  6038. return 0
  6039. }
  6040. if fXin >= 1 {
  6041. return 1
  6042. }
  6043. if fBeta == 1 {
  6044. return math.Pow(fXin, fAlpha)
  6045. }
  6046. if fAlpha == 1 {
  6047. return -math.Expm1(fBeta * math.Log1p(-fXin))
  6048. }
  6049. var fResult float64
  6050. fY, flnY := (0.5-fXin)+0.5, math.Log1p(-fXin)
  6051. fX, flnX := fXin, math.Log(fXin)
  6052. fA, fB := fAlpha, fBeta
  6053. bReflect := fXin > fAlpha/(fAlpha+fBeta)
  6054. if bReflect {
  6055. fA = fBeta
  6056. fB = fAlpha
  6057. fX = fY
  6058. fY = fXin
  6059. flnX = flnY
  6060. flnY = math.Log(fXin)
  6061. }
  6062. fResult = getBetaHelperContFrac(fX, fA, fB) / fA
  6063. fP, fQ := fA/(fA+fB), fB/(fA+fB)
  6064. var fTemp float64
  6065. if fA > 1 && fB > 1 && fP < 0.97 && fQ < 0.97 {
  6066. fTemp = getBetaDistPDF(fX, fA, fB) * fX * fY
  6067. } else {
  6068. fTemp = math.Exp(fA*flnX + fB*flnY - getLogBeta(fA, fB))
  6069. }
  6070. fResult *= fTemp
  6071. if bReflect {
  6072. fResult = 0.5 - fResult + 0.5
  6073. }
  6074. return fResult
  6075. }
  6076. // prepareBETAdotDISTArgs checking and prepare arguments for the formula
  6077. // function BETA.DIST.
  6078. func (fn *formulaFuncs) prepareBETAdotDISTArgs(argsList *list.List) formulaArg {
  6079. if argsList.Len() < 4 {
  6080. return newErrorFormulaArg(formulaErrorVALUE, "BETA.DIST requires at least 4 arguments")
  6081. }
  6082. if argsList.Len() > 6 {
  6083. return newErrorFormulaArg(formulaErrorVALUE, "BETA.DIST requires at most 6 arguments")
  6084. }
  6085. x := argsList.Front().Value.(formulaArg).ToNumber()
  6086. if x.Type != ArgNumber {
  6087. return x
  6088. }
  6089. alpha := argsList.Front().Next().Value.(formulaArg).ToNumber()
  6090. if alpha.Type != ArgNumber {
  6091. return alpha
  6092. }
  6093. beta := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  6094. if beta.Type != ArgNumber {
  6095. return beta
  6096. }
  6097. if alpha.Number <= 0 || beta.Number <= 0 {
  6098. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6099. }
  6100. cumulative := argsList.Front().Next().Next().Next().Value.(formulaArg).ToBool()
  6101. if cumulative.Type != ArgNumber {
  6102. return cumulative
  6103. }
  6104. a, b := newNumberFormulaArg(0), newNumberFormulaArg(1)
  6105. if argsList.Len() > 4 {
  6106. if a = argsList.Front().Next().Next().Next().Next().Value.(formulaArg).ToNumber(); a.Type != ArgNumber {
  6107. return a
  6108. }
  6109. }
  6110. if argsList.Len() == 6 {
  6111. if b = argsList.Back().Value.(formulaArg).ToNumber(); b.Type != ArgNumber {
  6112. return b
  6113. }
  6114. }
  6115. return newListFormulaArg([]formulaArg{x, alpha, beta, cumulative, a, b})
  6116. }
  6117. // BETAdotDIST function calculates the cumulative beta distribution function
  6118. // or the probability density function of the Beta distribution, for a
  6119. // supplied set of parameters. The syntax of the function is:
  6120. //
  6121. // BETA.DIST(x,alpha,beta,cumulative,[A],[B])
  6122. func (fn *formulaFuncs) BETAdotDIST(argsList *list.List) formulaArg {
  6123. args := fn.prepareBETAdotDISTArgs(argsList)
  6124. if args.Type != ArgList {
  6125. return args
  6126. }
  6127. x, alpha, beta, cumulative, a, b := args.List[0], args.List[1], args.List[2], args.List[3], args.List[4], args.List[5]
  6128. if x.Number < a.Number || x.Number > b.Number {
  6129. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6130. }
  6131. if a.Number == b.Number {
  6132. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6133. }
  6134. scale := b.Number - a.Number
  6135. x.Number = (x.Number - a.Number) / scale
  6136. if cumulative.Number == 1 {
  6137. return newNumberFormulaArg(getBetaDist(x.Number, alpha.Number, beta.Number))
  6138. }
  6139. return newNumberFormulaArg(getBetaDistPDF(x.Number, alpha.Number, beta.Number) / scale)
  6140. }
  6141. // BETADIST function calculates the cumulative beta probability density
  6142. // function for a supplied set of parameters. The syntax of the function is:
  6143. //
  6144. // BETADIST(x,alpha,beta,[A],[B])
  6145. func (fn *formulaFuncs) BETADIST(argsList *list.List) formulaArg {
  6146. if argsList.Len() < 3 {
  6147. return newErrorFormulaArg(formulaErrorVALUE, "BETADIST requires at least 3 arguments")
  6148. }
  6149. if argsList.Len() > 5 {
  6150. return newErrorFormulaArg(formulaErrorVALUE, "BETADIST requires at most 5 arguments")
  6151. }
  6152. x := argsList.Front().Value.(formulaArg).ToNumber()
  6153. if x.Type != ArgNumber {
  6154. return x
  6155. }
  6156. alpha := argsList.Front().Next().Value.(formulaArg).ToNumber()
  6157. if alpha.Type != ArgNumber {
  6158. return alpha
  6159. }
  6160. beta := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  6161. if beta.Type != ArgNumber {
  6162. return beta
  6163. }
  6164. if alpha.Number <= 0 || beta.Number <= 0 {
  6165. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6166. }
  6167. a, b := newNumberFormulaArg(0), newNumberFormulaArg(1)
  6168. if argsList.Len() > 3 {
  6169. if a = argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber(); a.Type != ArgNumber {
  6170. return a
  6171. }
  6172. }
  6173. if argsList.Len() == 5 {
  6174. if b = argsList.Back().Value.(formulaArg).ToNumber(); b.Type != ArgNumber {
  6175. return b
  6176. }
  6177. }
  6178. if x.Number < a.Number || x.Number > b.Number {
  6179. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6180. }
  6181. if a.Number == b.Number {
  6182. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6183. }
  6184. return newNumberFormulaArg(getBetaDist((x.Number-a.Number)/(b.Number-a.Number), alpha.Number, beta.Number))
  6185. }
  6186. // d1mach returns double precision real machine constants.
  6187. func d1mach(i int) float64 {
  6188. arr := []float64{
  6189. 2.2250738585072014e-308,
  6190. 1.7976931348623158e+308,
  6191. 1.1102230246251565e-16,
  6192. 2.2204460492503131e-16,
  6193. 0.301029995663981195,
  6194. }
  6195. if i > len(arr) {
  6196. return 0
  6197. }
  6198. return arr[i-1]
  6199. }
  6200. // chebyshevInit determines the number of terms for the double precision
  6201. // orthogonal series "dos" needed to insure the error is no larger
  6202. // than "eta". Ordinarily eta will be chosen to be one-tenth machine
  6203. // precision.
  6204. func chebyshevInit(nos int, eta float64, dos []float64) int {
  6205. i, e := 0, 0.0
  6206. if nos < 1 {
  6207. return 0
  6208. }
  6209. for ii := 1; ii <= nos; ii++ {
  6210. i = nos - ii
  6211. e += math.Abs(dos[i])
  6212. if e > eta {
  6213. return i
  6214. }
  6215. }
  6216. return i
  6217. }
  6218. // chebyshevEval evaluates the n-term Chebyshev series "a" at "x".
  6219. func chebyshevEval(n int, x float64, a []float64) float64 {
  6220. if n < 1 || n > 1000 || x < -1.1 || x > 1.1 {
  6221. return math.NaN()
  6222. }
  6223. twox, b0, b1, b2 := x*2, 0.0, 0.0, 0.0
  6224. for i := 1; i <= n; i++ {
  6225. b2 = b1
  6226. b1 = b0
  6227. b0 = twox*b1 - b2 + a[n-i]
  6228. }
  6229. return (b0 - b2) * 0.5
  6230. }
  6231. // lgammacor is an implementation for the log(gamma) correction.
  6232. func lgammacor(x float64) float64 {
  6233. algmcs := []float64{
  6234. 0.1666389480451863247205729650822, -0.1384948176067563840732986059135e-4,
  6235. 0.9810825646924729426157171547487e-8, -0.1809129475572494194263306266719e-10,
  6236. 0.6221098041892605227126015543416e-13, -0.3399615005417721944303330599666e-15,
  6237. 0.2683181998482698748957538846666e-17, -0.2868042435334643284144622399999e-19,
  6238. 0.3962837061046434803679306666666e-21, -0.6831888753985766870111999999999e-23,
  6239. 0.1429227355942498147573333333333e-24, -0.3547598158101070547199999999999e-26,
  6240. 0.1025680058010470912000000000000e-27, -0.3401102254316748799999999999999e-29,
  6241. 0.1276642195630062933333333333333e-30,
  6242. }
  6243. nalgm := chebyshevInit(15, d1mach(3), algmcs)
  6244. xbig := 1.0 / math.Sqrt(d1mach(3))
  6245. xmax := math.Exp(math.Min(math.Log(d1mach(2)/12.0), -math.Log(12.0*d1mach(1))))
  6246. if x < 10.0 {
  6247. return math.NaN()
  6248. } else if x >= xmax {
  6249. return 4.930380657631324e-32
  6250. } else if x < xbig {
  6251. tmp := 10.0 / x
  6252. return chebyshevEval(nalgm, tmp*tmp*2.0-1.0, algmcs) / x
  6253. }
  6254. return 1.0 / (x * 12.0)
  6255. }
  6256. // logrelerr compute the relative error logarithm.
  6257. func logrelerr(x float64) float64 {
  6258. alnrcs := []float64{
  6259. 0.10378693562743769800686267719098e+1, -0.13364301504908918098766041553133,
  6260. 0.19408249135520563357926199374750e-1, -0.30107551127535777690376537776592e-2,
  6261. 0.48694614797154850090456366509137e-3, -0.81054881893175356066809943008622e-4,
  6262. 0.13778847799559524782938251496059e-4, -0.23802210894358970251369992914935e-5,
  6263. 0.41640416213865183476391859901989e-6, -0.73595828378075994984266837031998e-7,
  6264. 0.13117611876241674949152294345011e-7, -0.23546709317742425136696092330175e-8,
  6265. 0.42522773276034997775638052962567e-9, -0.77190894134840796826108107493300e-10,
  6266. 0.14075746481359069909215356472191e-10, -0.25769072058024680627537078627584e-11,
  6267. 0.47342406666294421849154395005938e-12, -0.87249012674742641745301263292675e-13,
  6268. 0.16124614902740551465739833119115e-13, -0.29875652015665773006710792416815e-14,
  6269. 0.55480701209082887983041321697279e-15, -0.10324619158271569595141333961932e-15,
  6270. 0.19250239203049851177878503244868e-16, -0.35955073465265150011189707844266e-17,
  6271. 0.67264542537876857892194574226773e-18, -0.12602624168735219252082425637546e-18,
  6272. 0.23644884408606210044916158955519e-19, -0.44419377050807936898878389179733e-20,
  6273. 0.83546594464034259016241293994666e-21, -0.15731559416479562574899253521066e-21,
  6274. 0.29653128740247422686154369706666e-22, -0.55949583481815947292156013226666e-23,
  6275. 0.10566354268835681048187284138666e-23, -0.19972483680670204548314999466666e-24,
  6276. 0.37782977818839361421049855999999e-25, -0.71531586889081740345038165333333e-26,
  6277. 0.13552488463674213646502024533333e-26, -0.25694673048487567430079829333333e-27,
  6278. 0.48747756066216949076459519999999e-28, -0.92542112530849715321132373333333e-29,
  6279. 0.17578597841760239233269760000000e-29, -0.33410026677731010351377066666666e-30,
  6280. 0.63533936180236187354180266666666e-31,
  6281. }
  6282. nlnrel := chebyshevInit(43, 0.1*d1mach(3), alnrcs)
  6283. if x <= -1 {
  6284. return math.NaN()
  6285. }
  6286. if math.Abs(x) <= 0.375 {
  6287. return x * (1.0 - x*chebyshevEval(nlnrel, x/0.375, alnrcs))
  6288. }
  6289. return math.Log(x + 1.0)
  6290. }
  6291. // logBeta is an implementation for the log of the beta distribution
  6292. // function.
  6293. func logBeta(a, b float64) float64 {
  6294. corr, p, q := 0.0, a, a
  6295. if b < p {
  6296. p = b
  6297. }
  6298. if b > q {
  6299. q = b
  6300. }
  6301. if p < 0 {
  6302. return math.NaN()
  6303. }
  6304. if p == 0 {
  6305. return math.MaxFloat64
  6306. }
  6307. if p >= 10.0 {
  6308. corr = lgammacor(p) + lgammacor(q) - lgammacor(p+q)
  6309. f1 := q * logrelerr(-p/(p+q))
  6310. return math.Log(q)*-0.5 + 0.918938533204672741780329736406 + corr + (p-0.5)*math.Log(p/(p+q)) + math.Nextafter(f1, f1)
  6311. }
  6312. if q >= 10 {
  6313. corr = lgammacor(q) - lgammacor(p+q)
  6314. val, _ := math.Lgamma(p)
  6315. return val + corr + p - p*math.Log(p+q) + (q-0.5)*logrelerr(-p/(p+q))
  6316. }
  6317. return math.Log(math.Gamma(p) * (math.Gamma(q) / math.Gamma(p+q)))
  6318. }
  6319. // pbetaRaw is a part of pbeta for the beta distribution.
  6320. func pbetaRaw(alnsml, ans, eps, p, pin, q, sml, x, y float64) float64 {
  6321. if q > 1.0 {
  6322. xb := p*math.Log(y) + q*math.Log(1.0-y) - logBeta(p, q) - math.Log(q)
  6323. ib := int(math.Max(xb/alnsml, 0.0))
  6324. term := math.Exp(xb - float64(ib)*alnsml)
  6325. c := 1.0 / (1.0 - y)
  6326. p1 := q * c / (p + q - 1.0)
  6327. finsum := 0.0
  6328. n := int(q)
  6329. if q == float64(n) {
  6330. n = n - 1
  6331. }
  6332. for i := 1; i <= n; i++ {
  6333. if p1 <= 1 && term/eps <= finsum {
  6334. break
  6335. }
  6336. xi := float64(i)
  6337. term = (q - xi + 1.0) * c * term / (p + q - xi)
  6338. if term > 1.0 {
  6339. ib = ib - 1
  6340. term = term * sml
  6341. }
  6342. if ib == 0 {
  6343. finsum = finsum + term
  6344. }
  6345. }
  6346. ans = ans + finsum
  6347. }
  6348. if y != x || p != pin {
  6349. ans = 1.0 - ans
  6350. }
  6351. ans = math.Max(math.Min(ans, 1.0), 0.0)
  6352. return ans
  6353. }
  6354. // pbeta returns distribution function of the beta distribution.
  6355. func pbeta(x, pin, qin float64) (ans float64) {
  6356. eps := d1mach(3)
  6357. alneps := math.Log(eps)
  6358. sml := d1mach(1)
  6359. alnsml := math.Log(sml)
  6360. y := x
  6361. p := pin
  6362. q := qin
  6363. if p/(p+q) < x {
  6364. y = 1.0 - y
  6365. p = qin
  6366. q = pin
  6367. }
  6368. if (p+q)*y/(p+1.0) < eps {
  6369. xb := p*math.Log(math.Max(y, sml)) - math.Log(p) - logBeta(p, q)
  6370. if xb > alnsml && y != 0.0 {
  6371. ans = math.Exp(xb)
  6372. }
  6373. if y != x || p != pin {
  6374. ans = 1.0 - ans
  6375. }
  6376. } else {
  6377. ps := q - math.Floor(q)
  6378. if ps == 0.0 {
  6379. ps = 1.0
  6380. }
  6381. xb := p*math.Log(y) - logBeta(ps, p) - math.Log(p)
  6382. if xb >= alnsml {
  6383. ans = math.Exp(xb)
  6384. term := ans * p
  6385. if ps != 1.0 {
  6386. n := int(math.Max(alneps/math.Log(y), 4.0))
  6387. for i := 1; i <= n; i++ {
  6388. xi := float64(i)
  6389. term = term * (xi - ps) * y / xi
  6390. ans = ans + term/(p+xi)
  6391. }
  6392. }
  6393. }
  6394. ans = pbetaRaw(alnsml, ans, eps, p, pin, q, sml, x, y)
  6395. }
  6396. return ans
  6397. }
  6398. // betainvProbIterator is a part of betainv for the inverse of the beta
  6399. // function.
  6400. func betainvProbIterator(alpha1, alpha3, beta1, beta2, beta3, logBeta, maxCumulative, prob1, prob2 float64) float64 {
  6401. var i, j, prev, prop4 float64
  6402. j = 1
  6403. for prob := 0; prob < 1000; prob++ {
  6404. prop3 := pbeta(beta3, alpha1, beta1)
  6405. prop3 = (prop3 - prob1) * math.Exp(logBeta+prob2*math.Log(beta3)+beta2*math.Log(1.0-beta3))
  6406. if prop3*prop4 <= 0 {
  6407. prev = math.Max(math.Abs(j), maxCumulative)
  6408. }
  6409. h := 1.0
  6410. for iteratorCount := 0; iteratorCount < 1000; iteratorCount++ {
  6411. j = h * prop3
  6412. if math.Abs(j) < prev {
  6413. i = beta3 - j
  6414. if i >= 0 && i <= 1.0 {
  6415. if prev <= alpha3 {
  6416. return beta3
  6417. }
  6418. if math.Abs(prop3) <= alpha3 {
  6419. return beta3
  6420. }
  6421. if i != 0 && i != 1.0 {
  6422. break
  6423. }
  6424. }
  6425. }
  6426. h /= 3.0
  6427. }
  6428. if i == beta3 {
  6429. return beta3
  6430. }
  6431. beta3, prop4 = i, prop3
  6432. }
  6433. return beta3
  6434. }
  6435. // calcBetainv is an implementation for the quantile of the beta
  6436. // distribution.
  6437. func calcBetainv(probability, alpha, beta, lower, upper float64) float64 {
  6438. minCumulative, maxCumulative := 1.0e-300, 3.0e-308
  6439. lowerBound, upperBound := maxCumulative, 1.0-2.22e-16
  6440. needSwap := false
  6441. var alpha1, alpha2, beta1, beta2, beta3, prob1, x, y float64
  6442. if probability <= 0.5 {
  6443. prob1, alpha1, beta1 = probability, alpha, beta
  6444. } else {
  6445. prob1, alpha1, beta1, needSwap = 1.0-probability, beta, alpha, true
  6446. }
  6447. logBetaNum := logBeta(alpha, beta)
  6448. prob2 := math.Sqrt(-math.Log(prob1 * prob1))
  6449. prob3 := prob2 - (prob2*0.27061+2.3075)/(prob2*(prob2*0.04481+0.99229)+1)
  6450. if alpha1 > 1 && beta1 > 1 {
  6451. alpha2, beta2, prob2 = 1/(alpha1+alpha1-1), 1/(beta1+beta1-1), (prob3*prob3-3)/6
  6452. x = 2 / (alpha2 + beta2)
  6453. y = prob3*math.Sqrt(x+prob2)/x - (beta2-alpha2)*(prob2+5/6.0-2/(x*3))
  6454. beta3 = alpha1 / (alpha1 + beta1*math.Exp(y+y))
  6455. } else {
  6456. beta2, prob2 = 1/(beta1*9), beta1+beta1
  6457. beta2 = prob2 * math.Pow(1-beta2+prob3*math.Sqrt(beta2), 3)
  6458. if beta2 <= 0 {
  6459. beta3 = 1 - math.Exp((math.Log((1-prob1)*beta1)+logBetaNum)/beta1)
  6460. } else {
  6461. beta2 = (prob2 + alpha1*4 - 2) / beta2
  6462. if beta2 <= 1 {
  6463. beta3 = math.Exp((logBetaNum + math.Log(alpha1*prob1)) / alpha1)
  6464. } else {
  6465. beta3 = 1 - 2/(beta2+1)
  6466. }
  6467. }
  6468. }
  6469. beta2, prob2 = 1-beta1, 1-alpha1
  6470. if beta3 < lowerBound {
  6471. beta3 = lowerBound
  6472. } else if beta3 > upperBound {
  6473. beta3 = upperBound
  6474. }
  6475. alpha3 := math.Max(minCumulative, math.Pow(10.0, -13.0-2.5/(alpha1*alpha1)-0.5/(prob1*prob1)))
  6476. beta3 = betainvProbIterator(alpha1, alpha3, beta1, beta2, beta3, logBetaNum, maxCumulative, prob1, prob2)
  6477. if needSwap {
  6478. beta3 = 1.0 - beta3
  6479. }
  6480. return (upper-lower)*beta3 + lower
  6481. }
  6482. // betainv is an implementation of the formula functions BETAINV and
  6483. // BETA.INV.
  6484. func (fn *formulaFuncs) betainv(name string, argsList *list.List) formulaArg {
  6485. if argsList.Len() < 3 {
  6486. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at least 3 arguments", name))
  6487. }
  6488. if argsList.Len() > 5 {
  6489. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at most 5 arguments", name))
  6490. }
  6491. probability := argsList.Front().Value.(formulaArg).ToNumber()
  6492. if probability.Type != ArgNumber {
  6493. return probability
  6494. }
  6495. if probability.Number <= 0 || probability.Number >= 1 {
  6496. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6497. }
  6498. alpha := argsList.Front().Next().Value.(formulaArg).ToNumber()
  6499. if alpha.Type != ArgNumber {
  6500. return alpha
  6501. }
  6502. beta := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  6503. if beta.Type != ArgNumber {
  6504. return beta
  6505. }
  6506. if alpha.Number <= 0 || beta.Number <= 0 {
  6507. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6508. }
  6509. a, b := newNumberFormulaArg(0), newNumberFormulaArg(1)
  6510. if argsList.Len() > 3 {
  6511. if a = argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber(); a.Type != ArgNumber {
  6512. return a
  6513. }
  6514. }
  6515. if argsList.Len() == 5 {
  6516. if b = argsList.Back().Value.(formulaArg).ToNumber(); b.Type != ArgNumber {
  6517. return b
  6518. }
  6519. }
  6520. if a.Number == b.Number {
  6521. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6522. }
  6523. return newNumberFormulaArg(calcBetainv(probability.Number, alpha.Number, beta.Number, a.Number, b.Number))
  6524. }
  6525. // BETAINV function uses an iterative procedure to calculate the inverse of
  6526. // the cumulative beta probability density function for a supplied
  6527. // probability. The syntax of the function is:
  6528. //
  6529. // BETAINV(probability,alpha,beta,[A],[B])
  6530. func (fn *formulaFuncs) BETAINV(argsList *list.List) formulaArg {
  6531. return fn.betainv("BETAINV", argsList)
  6532. }
  6533. // BETAdotINV function uses an iterative procedure to calculate the inverse of
  6534. // the cumulative beta probability density function for a supplied
  6535. // probability. The syntax of the function is:
  6536. //
  6537. // BETA.INV(probability,alpha,beta,[A],[B])
  6538. func (fn *formulaFuncs) BETAdotINV(argsList *list.List) formulaArg {
  6539. return fn.betainv("BETA.INV", argsList)
  6540. }
  6541. // incompleteGamma is an implementation of the incomplete gamma function.
  6542. func incompleteGamma(a, x float64) float64 {
  6543. max := 32
  6544. summer := 0.0
  6545. for n := 0; n <= max; n++ {
  6546. divisor := a
  6547. for i := 1; i <= n; i++ {
  6548. divisor *= a + float64(i)
  6549. }
  6550. summer += math.Pow(x, float64(n)) / divisor
  6551. }
  6552. return math.Pow(x, a) * math.Exp(0-x) * summer
  6553. }
  6554. // binomCoeff implement binomial coefficient calculation.
  6555. func binomCoeff(n, k float64) float64 {
  6556. return fact(n) / (fact(k) * fact(n-k))
  6557. }
  6558. // binomdist implement binomial distribution calculation.
  6559. func binomdist(x, n, p float64) float64 {
  6560. return binomCoeff(n, x) * math.Pow(p, x) * math.Pow(1-p, n-x)
  6561. }
  6562. // BINOMdotDIST function returns the Binomial Distribution probability for a
  6563. // given number of successes from a specified number of trials. The syntax of
  6564. // the function is:
  6565. //
  6566. // BINOM.DIST(number_s,trials,probability_s,cumulative)
  6567. func (fn *formulaFuncs) BINOMdotDIST(argsList *list.List) formulaArg {
  6568. if argsList.Len() != 4 {
  6569. return newErrorFormulaArg(formulaErrorVALUE, "BINOM.DIST requires 4 arguments")
  6570. }
  6571. return fn.BINOMDIST(argsList)
  6572. }
  6573. // BINOMDIST function returns the Binomial Distribution probability of a
  6574. // specified number of successes out of a specified number of trials. The
  6575. // syntax of the function is:
  6576. //
  6577. // BINOMDIST(number_s,trials,probability_s,cumulative)
  6578. func (fn *formulaFuncs) BINOMDIST(argsList *list.List) formulaArg {
  6579. if argsList.Len() != 4 {
  6580. return newErrorFormulaArg(formulaErrorVALUE, "BINOMDIST requires 4 arguments")
  6581. }
  6582. var s, trials, probability, cumulative formulaArg
  6583. if s = argsList.Front().Value.(formulaArg).ToNumber(); s.Type != ArgNumber {
  6584. return s
  6585. }
  6586. if trials = argsList.Front().Next().Value.(formulaArg).ToNumber(); trials.Type != ArgNumber {
  6587. return trials
  6588. }
  6589. if s.Number < 0 || s.Number > trials.Number {
  6590. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6591. }
  6592. if probability = argsList.Back().Prev().Value.(formulaArg).ToNumber(); probability.Type != ArgNumber {
  6593. return probability
  6594. }
  6595. if probability.Number < 0 || probability.Number > 1 {
  6596. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6597. }
  6598. if cumulative = argsList.Back().Value.(formulaArg).ToBool(); cumulative.Type == ArgError {
  6599. return cumulative
  6600. }
  6601. if cumulative.Number == 1 {
  6602. bm := 0.0
  6603. for i := 0; i <= int(s.Number); i++ {
  6604. bm += binomdist(float64(i), trials.Number, probability.Number)
  6605. }
  6606. return newNumberFormulaArg(bm)
  6607. }
  6608. return newNumberFormulaArg(binomdist(s.Number, trials.Number, probability.Number))
  6609. }
  6610. // BINOMdotDISTdotRANGE function returns the Binomial Distribution probability
  6611. // for the number of successes from a specified number of trials falling into
  6612. // a specified range.
  6613. //
  6614. // BINOM.DIST.RANGE(trials,probability_s,number_s,[number_s2])
  6615. func (fn *formulaFuncs) BINOMdotDISTdotRANGE(argsList *list.List) formulaArg {
  6616. if argsList.Len() < 3 {
  6617. return newErrorFormulaArg(formulaErrorVALUE, "BINOM.DIST.RANGE requires at least 3 arguments")
  6618. }
  6619. if argsList.Len() > 4 {
  6620. return newErrorFormulaArg(formulaErrorVALUE, "BINOM.DIST.RANGE requires at most 4 arguments")
  6621. }
  6622. trials := argsList.Front().Value.(formulaArg).ToNumber()
  6623. if trials.Type != ArgNumber {
  6624. return trials
  6625. }
  6626. probability := argsList.Front().Next().Value.(formulaArg).ToNumber()
  6627. if probability.Type != ArgNumber {
  6628. return probability
  6629. }
  6630. if probability.Number < 0 || probability.Number > 1 {
  6631. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6632. }
  6633. num1 := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  6634. if num1.Type != ArgNumber {
  6635. return num1
  6636. }
  6637. if num1.Number < 0 || num1.Number > trials.Number {
  6638. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6639. }
  6640. num2 := num1
  6641. if argsList.Len() > 3 {
  6642. if num2 = argsList.Back().Value.(formulaArg).ToNumber(); num2.Type != ArgNumber {
  6643. return num2
  6644. }
  6645. }
  6646. if num2.Number < 0 || num2.Number > trials.Number {
  6647. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6648. }
  6649. sum := 0.0
  6650. for i := num1.Number; i <= num2.Number; i++ {
  6651. sum += binomdist(i, trials.Number, probability.Number)
  6652. }
  6653. return newNumberFormulaArg(sum)
  6654. }
  6655. // binominv implement inverse of the binomial distribution calculation.
  6656. func binominv(n, p, alpha float64) float64 {
  6657. q, i, sum, max := 1-p, 0.0, 0.0, 0.0
  6658. n = math.Floor(n)
  6659. if q > p {
  6660. factor := math.Pow(q, n)
  6661. sum = factor
  6662. for i = 0; i < n && sum < alpha; i++ {
  6663. factor *= (n - i) / (i + 1) * p / q
  6664. sum += factor
  6665. }
  6666. return i
  6667. }
  6668. factor := math.Pow(p, n)
  6669. sum, max = 1-factor, n
  6670. for i = 0; i < max && sum >= alpha; i++ {
  6671. factor *= (n - i) / (i + 1) * q / p
  6672. sum -= factor
  6673. }
  6674. return n - i
  6675. }
  6676. // BINOMdotINV function returns the inverse of the Cumulative Binomial
  6677. // Distribution. The syntax of the function is:
  6678. //
  6679. // BINOM.INV(trials,probability_s,alpha)
  6680. func (fn *formulaFuncs) BINOMdotINV(argsList *list.List) formulaArg {
  6681. if argsList.Len() != 3 {
  6682. return newErrorFormulaArg(formulaErrorVALUE, "BINOM.INV requires 3 numeric arguments")
  6683. }
  6684. trials := argsList.Front().Value.(formulaArg).ToNumber()
  6685. if trials.Type != ArgNumber {
  6686. return trials
  6687. }
  6688. if trials.Number < 0 {
  6689. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6690. }
  6691. probability := argsList.Front().Next().Value.(formulaArg).ToNumber()
  6692. if probability.Type != ArgNumber {
  6693. return probability
  6694. }
  6695. if probability.Number <= 0 || probability.Number >= 1 {
  6696. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6697. }
  6698. alpha := argsList.Back().Value.(formulaArg).ToNumber()
  6699. if alpha.Type != ArgNumber {
  6700. return alpha
  6701. }
  6702. if alpha.Number <= 0 || alpha.Number >= 1 {
  6703. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6704. }
  6705. return newNumberFormulaArg(binominv(trials.Number, probability.Number, alpha.Number))
  6706. }
  6707. // CHIDIST function calculates the right-tailed probability of the chi-square
  6708. // distribution. The syntax of the function is:
  6709. //
  6710. // CHIDIST(x,degrees_freedom)
  6711. func (fn *formulaFuncs) CHIDIST(argsList *list.List) formulaArg {
  6712. if argsList.Len() != 2 {
  6713. return newErrorFormulaArg(formulaErrorVALUE, "CHIDIST requires 2 numeric arguments")
  6714. }
  6715. x := argsList.Front().Value.(formulaArg).ToNumber()
  6716. if x.Type != ArgNumber {
  6717. return x
  6718. }
  6719. degrees := argsList.Back().Value.(formulaArg).ToNumber()
  6720. if degrees.Type != ArgNumber {
  6721. return degrees
  6722. }
  6723. logSqrtPi, sqrtPi := math.Log(math.Sqrt(math.Pi)), 1/math.Sqrt(math.Pi)
  6724. var e, s, z, c, y float64
  6725. a, x1, even := x.Number/2, x.Number, int(degrees.Number)%2 == 0
  6726. if degrees.Number > 1 {
  6727. y = math.Exp(-a)
  6728. }
  6729. args := list.New()
  6730. args.PushBack(newNumberFormulaArg(-math.Sqrt(x1)))
  6731. o := fn.NORMSDIST(args)
  6732. s = 2 * o.Number
  6733. if even {
  6734. s = y
  6735. }
  6736. if degrees.Number > 2 {
  6737. x1 = (degrees.Number - 1) / 2
  6738. z = 0.5
  6739. if even {
  6740. z = 1
  6741. }
  6742. if a > 20 {
  6743. e = logSqrtPi
  6744. if even {
  6745. e = 0
  6746. }
  6747. c = math.Log(a)
  6748. for z <= x1 {
  6749. e = math.Log(z) + e
  6750. s += math.Exp(c*z - a - e)
  6751. z++
  6752. }
  6753. return newNumberFormulaArg(s)
  6754. }
  6755. e = sqrtPi / math.Sqrt(a)
  6756. if even {
  6757. e = 1
  6758. }
  6759. c = 0
  6760. for z <= x1 {
  6761. e = e * (a / z)
  6762. c = c + e
  6763. z++
  6764. }
  6765. return newNumberFormulaArg(c*y + s)
  6766. }
  6767. return newNumberFormulaArg(s)
  6768. }
  6769. // CHIINV function calculates the inverse of the right-tailed probability of
  6770. // the Chi-Square Distribution. The syntax of the function is:
  6771. //
  6772. // CHIINV(probability,deg_freedom)
  6773. func (fn *formulaFuncs) CHIINV(argsList *list.List) formulaArg {
  6774. if argsList.Len() != 2 {
  6775. return newErrorFormulaArg(formulaErrorVALUE, "CHIINV requires 2 numeric arguments")
  6776. }
  6777. probability := argsList.Front().Value.(formulaArg).ToNumber()
  6778. if probability.Type != ArgNumber {
  6779. return probability
  6780. }
  6781. if probability.Number <= 0 || probability.Number > 1 {
  6782. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6783. }
  6784. deg := argsList.Back().Value.(formulaArg).ToNumber()
  6785. if deg.Type != ArgNumber {
  6786. return deg
  6787. }
  6788. if deg.Number < 1 {
  6789. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6790. }
  6791. return newNumberFormulaArg(gammainv(1-probability.Number, 0.5*deg.Number, 2.0))
  6792. }
  6793. // CHITEST function uses the chi-square test to calculate the probability that
  6794. // the differences between two supplied data sets (of observed and expected
  6795. // frequencies), are likely to be simply due to sampling error, or if they are
  6796. // likely to be real. The syntax of the function is:
  6797. //
  6798. // CHITEST(actual_range,expected_range)
  6799. func (fn *formulaFuncs) CHITEST(argsList *list.List) formulaArg {
  6800. if argsList.Len() != 2 {
  6801. return newErrorFormulaArg(formulaErrorVALUE, "CHITEST requires 2 arguments")
  6802. }
  6803. actual, expected := argsList.Front().Value.(formulaArg), argsList.Back().Value.(formulaArg)
  6804. actualList, expectedList := actual.ToList(), expected.ToList()
  6805. rows := len(actual.Matrix)
  6806. columns := len(actualList) / rows
  6807. if len(actualList) != len(expectedList) || len(actualList) == 1 {
  6808. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  6809. }
  6810. var result float64
  6811. var degrees int
  6812. for i := 0; i < len(actualList); i++ {
  6813. a, e := actualList[i].ToNumber(), expectedList[i].ToNumber()
  6814. if a.Type == ArgNumber && e.Type == ArgNumber {
  6815. if e.Number == 0 {
  6816. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  6817. }
  6818. if e.Number < 0 {
  6819. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6820. }
  6821. result += (a.Number - e.Number) * (a.Number - e.Number) / e.Number
  6822. }
  6823. }
  6824. if rows == 1 {
  6825. degrees = columns - 1
  6826. } else if columns == 1 {
  6827. degrees = rows - 1
  6828. } else {
  6829. degrees = (columns - 1) * (rows - 1)
  6830. }
  6831. args := list.New()
  6832. args.PushBack(newNumberFormulaArg(result))
  6833. args.PushBack(newNumberFormulaArg(float64(degrees)))
  6834. return fn.CHIDIST(args)
  6835. }
  6836. // getGammaSeries calculates a power-series of the gamma function.
  6837. func getGammaSeries(fA, fX float64) float64 {
  6838. var (
  6839. fHalfMachEps = 2.22045e-016 / 2
  6840. fDenomfactor = fA
  6841. fSummand = 1 / fA
  6842. fSum = fSummand
  6843. nCount = 1
  6844. )
  6845. for fSummand/fSum > fHalfMachEps && nCount <= 10000 {
  6846. fDenomfactor = fDenomfactor + 1
  6847. fSummand = fSummand * fX / fDenomfactor
  6848. fSum = fSum + fSummand
  6849. nCount = nCount + 1
  6850. }
  6851. return fSum
  6852. }
  6853. // getGammaContFraction returns continued fraction with odd items of the gamma
  6854. // function.
  6855. func getGammaContFraction(fA, fX float64) float64 {
  6856. var (
  6857. fBigInv = 2.22045e-016
  6858. fHalfMachEps = fBigInv / 2
  6859. fBig = 1 / fBigInv
  6860. fCount = 0.0
  6861. fY = 1 - fA
  6862. fDenom = fX + 2 - fA
  6863. fPkm1 = fX + 1
  6864. fPkm2 = 1.0
  6865. fQkm1 = fDenom * fX
  6866. fQkm2 = fX
  6867. fApprox = fPkm1 / fQkm1
  6868. bFinished = false
  6869. )
  6870. for !bFinished && fCount < 10000 {
  6871. fCount = fCount + 1
  6872. fY = fY + 1
  6873. fDenom = fDenom + 2
  6874. var (
  6875. fNum = fY * fCount
  6876. f1 = fPkm1 * fDenom
  6877. f2 = fPkm2 * fNum
  6878. fPk = math.Nextafter(f1, f1) - math.Nextafter(f2, f2)
  6879. f3 = fQkm1 * fDenom
  6880. f4 = fQkm2 * fNum
  6881. fQk = math.Nextafter(f3, f3) - math.Nextafter(f4, f4)
  6882. )
  6883. if fQk != 0 {
  6884. fR := fPk / fQk
  6885. bFinished = math.Abs((fApprox-fR)/fR) <= fHalfMachEps
  6886. fApprox = fR
  6887. }
  6888. fPkm2, fPkm1, fQkm2, fQkm1 = fPkm1, fPk, fQkm1, fQk
  6889. if math.Abs(fPk) > fBig {
  6890. // reduce a fraction does not change the value
  6891. fPkm2 = fPkm2 * fBigInv
  6892. fPkm1 = fPkm1 * fBigInv
  6893. fQkm2 = fQkm2 * fBigInv
  6894. fQkm1 = fQkm1 * fBigInv
  6895. }
  6896. }
  6897. return fApprox
  6898. }
  6899. // getLogGammaHelper is a part of implementation of the function getLogGamma.
  6900. func getLogGammaHelper(fZ float64) float64 {
  6901. _fg := 6.024680040776729583740234375
  6902. zgHelp := fZ + _fg - 0.5
  6903. return math.Log(getLanczosSum(fZ)) + (fZ-0.5)*math.Log(zgHelp) - zgHelp
  6904. }
  6905. // getGammaHelper is a part of implementation of the function getLogGamma.
  6906. func getGammaHelper(fZ float64) float64 {
  6907. var (
  6908. gamma = getLanczosSum(fZ)
  6909. fg = 6.024680040776729583740234375
  6910. zgHelp = fZ + fg - 0.5
  6911. // avoid intermediate overflow
  6912. halfpower = math.Pow(zgHelp, fZ/2-0.25)
  6913. )
  6914. gamma *= halfpower
  6915. gamma /= math.Exp(zgHelp)
  6916. gamma *= halfpower
  6917. if fZ <= 20 && fZ == math.Floor(fZ) {
  6918. gamma = math.Round(gamma)
  6919. }
  6920. return gamma
  6921. }
  6922. // getLogGamma calculates the natural logarithm of the gamma function.
  6923. func getLogGamma(fZ float64) float64 {
  6924. fMaxGammaArgument := 171.624376956302
  6925. if fZ >= fMaxGammaArgument {
  6926. return getLogGammaHelper(fZ)
  6927. }
  6928. if fZ >= 1.0 {
  6929. return math.Log(getGammaHelper(fZ))
  6930. }
  6931. if fZ >= 0.5 {
  6932. return math.Log(getGammaHelper(fZ+1) / fZ)
  6933. }
  6934. return getLogGammaHelper(fZ+2) - math.Log(fZ+1) - math.Log(fZ)
  6935. }
  6936. // getLowRegIGamma returns lower regularized incomplete gamma function.
  6937. func getLowRegIGamma(fA, fX float64) float64 {
  6938. lnFactor := fA*math.Log(fX) - fX - getLogGamma(fA)
  6939. factor := math.Exp(lnFactor)
  6940. if fX > fA+1 {
  6941. return 1 - factor*getGammaContFraction(fA, fX)
  6942. }
  6943. return factor * getGammaSeries(fA, fX)
  6944. }
  6945. // getChiSqDistCDF returns left tail for the Chi-Square distribution.
  6946. func getChiSqDistCDF(fX, fDF float64) float64 {
  6947. if fX <= 0 {
  6948. return 0
  6949. }
  6950. return getLowRegIGamma(fDF/2, fX/2)
  6951. }
  6952. // getChiSqDistPDF calculates the probability density function for the
  6953. // Chi-Square distribution.
  6954. func getChiSqDistPDF(fX, fDF float64) float64 {
  6955. if fDF*fX > 1391000 {
  6956. return math.Exp((0.5*fDF-1)*math.Log(fX*0.5) - 0.5*fX - math.Log(2) - getLogGamma(0.5*fDF))
  6957. }
  6958. var fCount, fValue float64
  6959. if math.Mod(fDF, 2) < 0.5 {
  6960. fValue = 0.5
  6961. fCount = 2
  6962. } else {
  6963. fValue = 1 / math.Sqrt(fX*2*math.Pi)
  6964. fCount = 1
  6965. }
  6966. for fCount < fDF {
  6967. fValue *= fX / fCount
  6968. fCount += 2
  6969. }
  6970. if fX >= 1425 {
  6971. fValue = math.Exp(math.Log(fValue) - fX/2)
  6972. } else {
  6973. fValue *= math.Exp(-fX / 2)
  6974. }
  6975. return fValue
  6976. }
  6977. // CHISQdotDIST function calculates the Probability Density Function or the
  6978. // Cumulative Distribution Function for the Chi-Square Distribution. The
  6979. // syntax of the function is:
  6980. //
  6981. // CHISQ.DIST(x,degrees_freedom,cumulative)
  6982. func (fn *formulaFuncs) CHISQdotDIST(argsList *list.List) formulaArg {
  6983. if argsList.Len() != 3 {
  6984. return newErrorFormulaArg(formulaErrorVALUE, "CHISQ.DIST requires 3 arguments")
  6985. }
  6986. var x, degrees, cumulative formulaArg
  6987. if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
  6988. return x
  6989. }
  6990. if degrees = argsList.Front().Next().Value.(formulaArg).ToNumber(); degrees.Type != ArgNumber {
  6991. return degrees
  6992. }
  6993. if cumulative = argsList.Back().Value.(formulaArg).ToBool(); cumulative.Type == ArgError {
  6994. return cumulative
  6995. }
  6996. if x.Number < 0 {
  6997. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  6998. }
  6999. maxDeg := math.Pow10(10)
  7000. if degrees.Number < 1 || degrees.Number >= maxDeg {
  7001. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7002. }
  7003. if cumulative.Number == 1 {
  7004. return newNumberFormulaArg(getChiSqDistCDF(x.Number, degrees.Number))
  7005. }
  7006. return newNumberFormulaArg(getChiSqDistPDF(x.Number, degrees.Number))
  7007. }
  7008. // CHISQdotDISTdotRT function calculates the right-tailed probability of the
  7009. // Chi-Square Distribution. The syntax of the function is:
  7010. //
  7011. // CHISQ.DIST.RT(x,degrees_freedom)
  7012. func (fn *formulaFuncs) CHISQdotDISTdotRT(argsList *list.List) formulaArg {
  7013. if argsList.Len() != 2 {
  7014. return newErrorFormulaArg(formulaErrorVALUE, "CHISQ.DIST.RT requires 2 numeric arguments")
  7015. }
  7016. return fn.CHIDIST(argsList)
  7017. }
  7018. // CHISQdotTEST function performs the chi-square test on two supplied data sets
  7019. // (of observed and expected frequencies), and returns the probability that
  7020. // the differences between the sets are simply due to sampling error. The
  7021. // syntax of the function is:
  7022. //
  7023. // CHISQ.TEST(actual_range,expected_range)
  7024. func (fn *formulaFuncs) CHISQdotTEST(argsList *list.List) formulaArg {
  7025. if argsList.Len() != 2 {
  7026. return newErrorFormulaArg(formulaErrorVALUE, "CHISQ.TEST requires 2 arguments")
  7027. }
  7028. return fn.CHITEST(argsList)
  7029. }
  7030. // hasChangeOfSign check if the sign has been changed.
  7031. func hasChangeOfSign(u, w float64) bool {
  7032. return (u < 0 && w > 0) || (u > 0 && w < 0)
  7033. }
  7034. // calcInverseIterator directly maps the required parameters for inverse
  7035. // distribution functions.
  7036. type calcInverseIterator struct {
  7037. name string
  7038. fp, fDF, nT float64
  7039. }
  7040. // callBack implements the callback function for the inverse iterator.
  7041. func (iterator *calcInverseIterator) callBack(x float64) float64 {
  7042. if iterator.name == "CHISQ.INV" {
  7043. return iterator.fp - getChiSqDistCDF(x, iterator.fDF)
  7044. }
  7045. return iterator.fp - getTDist(x, iterator.fDF, iterator.nT)
  7046. }
  7047. // inverseQuadraticInterpolation inverse quadratic interpolation with
  7048. // additional brackets.
  7049. func inverseQuadraticInterpolation(iterator calcInverseIterator, fAx, fAy, fBx, fBy float64) float64 {
  7050. fYEps := 1.0e-307
  7051. fXEps := 2.22045e-016
  7052. fPx, fPy, fQx, fQy, fRx, fRy := fAx, fAy, fBx, fBy, fAx, fAy
  7053. fSx := 0.5 * (fAx + fBx)
  7054. bHasToInterpolate := true
  7055. nCount := 0
  7056. for nCount < 500 && math.Abs(fRy) > fYEps && (fBx-fAx) > math.Max(math.Abs(fAx), math.Abs(fBx))*fXEps {
  7057. if bHasToInterpolate {
  7058. if fPy != fQy && fQy != fRy && fRy != fPy {
  7059. fSx = fPx*fRy*fQy/(fRy-fPy)/(fQy-fPy) + fRx*fQy*fPy/(fQy-fRy)/(fPy-fRy) +
  7060. fQx*fPy*fRy/(fPy-fQy)/(fRy-fQy)
  7061. bHasToInterpolate = (fAx < fSx) && (fSx < fBx)
  7062. } else {
  7063. bHasToInterpolate = false
  7064. }
  7065. }
  7066. if !bHasToInterpolate {
  7067. fSx = 0.5 * (fAx + fBx)
  7068. fQx, fQy = fBx, fBy
  7069. bHasToInterpolate = true
  7070. }
  7071. fPx, fQx, fRx, fPy, fQy = fQx, fRx, fSx, fQy, fRy
  7072. fRy = iterator.callBack(fSx)
  7073. if hasChangeOfSign(fAy, fRy) {
  7074. fBx, fBy = fRx, fRy
  7075. } else {
  7076. fAx, fAy = fRx, fRy
  7077. }
  7078. bHasToInterpolate = bHasToInterpolate && (math.Abs(fRy)*2 <= math.Abs(fQy))
  7079. nCount++
  7080. }
  7081. return fRx
  7082. }
  7083. // calcIterateInverse function calculates the iteration for inverse
  7084. // distributions.
  7085. func calcIterateInverse(iterator calcInverseIterator, fAx, fBx float64) float64 {
  7086. fAy, fBy := iterator.callBack(fAx), iterator.callBack(fBx)
  7087. var fTemp float64
  7088. var nCount int
  7089. for nCount = 0; nCount < 1000 && !hasChangeOfSign(fAy, fBy); nCount++ {
  7090. if math.Abs(fAy) <= math.Abs(fBy) {
  7091. fTemp = fAx
  7092. fAx += 2 * (fAx - fBx)
  7093. if fAx < 0 {
  7094. fAx = 0
  7095. }
  7096. fBx = fTemp
  7097. fBy = fAy
  7098. fAy = iterator.callBack(fAx)
  7099. } else {
  7100. fTemp = fBx
  7101. fBx += 2 * (fBx - fAx)
  7102. fAx = fTemp
  7103. fAy = fBy
  7104. fBy = iterator.callBack(fBx)
  7105. }
  7106. }
  7107. if fAy == 0 || fBy == 0 {
  7108. return 0
  7109. }
  7110. return inverseQuadraticInterpolation(iterator, fAx, fAy, fBx, fBy)
  7111. }
  7112. // CHISQdotINV function calculates the inverse of the left-tailed probability
  7113. // of the Chi-Square Distribution. The syntax of the function is:
  7114. //
  7115. // CHISQ.INV(probability,degrees_freedom)
  7116. func (fn *formulaFuncs) CHISQdotINV(argsList *list.List) formulaArg {
  7117. if argsList.Len() != 2 {
  7118. return newErrorFormulaArg(formulaErrorVALUE, "CHISQ.INV requires 2 numeric arguments")
  7119. }
  7120. var probability, degrees formulaArg
  7121. if probability = argsList.Front().Value.(formulaArg).ToNumber(); probability.Type != ArgNumber {
  7122. return probability
  7123. }
  7124. if degrees = argsList.Back().Value.(formulaArg).ToNumber(); degrees.Type != ArgNumber {
  7125. return degrees
  7126. }
  7127. if probability.Number < 0 || probability.Number >= 1 {
  7128. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7129. }
  7130. if degrees.Number < 1 || degrees.Number > math.Pow10(10) {
  7131. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7132. }
  7133. return newNumberFormulaArg(calcIterateInverse(calcInverseIterator{
  7134. name: "CHISQ.INV",
  7135. fp: probability.Number,
  7136. fDF: degrees.Number,
  7137. }, degrees.Number/2, degrees.Number))
  7138. }
  7139. // CHISQdotINVdotRT function calculates the inverse of the right-tailed
  7140. // probability of the Chi-Square Distribution. The syntax of the function is:
  7141. //
  7142. // CHISQ.INV.RT(probability,degrees_freedom)
  7143. func (fn *formulaFuncs) CHISQdotINVdotRT(argsList *list.List) formulaArg {
  7144. if argsList.Len() != 2 {
  7145. return newErrorFormulaArg(formulaErrorVALUE, "CHISQ.INV.RT requires 2 numeric arguments")
  7146. }
  7147. return fn.CHIINV(argsList)
  7148. }
  7149. // confidence is an implementation of the formula functions CONFIDENCE and
  7150. // CONFIDENCE.NORM.
  7151. func (fn *formulaFuncs) confidence(name string, argsList *list.List) formulaArg {
  7152. if argsList.Len() != 3 {
  7153. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 3 numeric arguments", name))
  7154. }
  7155. alpha := argsList.Front().Value.(formulaArg).ToNumber()
  7156. if alpha.Type != ArgNumber {
  7157. return alpha
  7158. }
  7159. if alpha.Number <= 0 || alpha.Number >= 1 {
  7160. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7161. }
  7162. stdDev := argsList.Front().Next().Value.(formulaArg).ToNumber()
  7163. if stdDev.Type != ArgNumber {
  7164. return stdDev
  7165. }
  7166. if stdDev.Number <= 0 {
  7167. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7168. }
  7169. size := argsList.Back().Value.(formulaArg).ToNumber()
  7170. if size.Type != ArgNumber {
  7171. return size
  7172. }
  7173. if size.Number < 1 {
  7174. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7175. }
  7176. args := list.New()
  7177. args.Init()
  7178. args.PushBack(newNumberFormulaArg(alpha.Number / 2))
  7179. args.PushBack(newNumberFormulaArg(0))
  7180. args.PushBack(newNumberFormulaArg(1))
  7181. return newNumberFormulaArg(-fn.NORMINV(args).Number * (stdDev.Number / math.Sqrt(size.Number)))
  7182. }
  7183. // CONFIDENCE function uses a Normal Distribution to calculate a confidence
  7184. // value that can be used to construct the Confidence Interval for a
  7185. // population mean, for a supplied probability and sample size. It is assumed
  7186. // that the standard deviation of the population is known. The syntax of the
  7187. // function is:
  7188. //
  7189. // CONFIDENCE(alpha,standard_dev,size)
  7190. func (fn *formulaFuncs) CONFIDENCE(argsList *list.List) formulaArg {
  7191. return fn.confidence("CONFIDENCE", argsList)
  7192. }
  7193. // CONFIDENCEdotNORM function uses a Normal Distribution to calculate a
  7194. // confidence value that can be used to construct the confidence interval for
  7195. // a population mean, for a supplied probability and sample size. It is
  7196. // assumed that the standard deviation of the population is known. The syntax
  7197. // of the function is:
  7198. //
  7199. // CONFIDENCE.NORM(alpha,standard_dev,size)
  7200. func (fn *formulaFuncs) CONFIDENCEdotNORM(argsList *list.List) formulaArg {
  7201. return fn.confidence("CONFIDENCE.NORM", argsList)
  7202. }
  7203. // CONFIDENCEdotT function uses a Student's T-Distribution to calculate a
  7204. // confidence value that can be used to construct the confidence interval for
  7205. // a population mean, for a supplied probablity and supplied sample size. It
  7206. // is assumed that the standard deviation of the population is known. The
  7207. // syntax of the function is:
  7208. //
  7209. // CONFIDENCE.T(alpha,standard_dev,size)
  7210. func (fn *formulaFuncs) CONFIDENCEdotT(argsList *list.List) formulaArg {
  7211. if argsList.Len() != 3 {
  7212. return newErrorFormulaArg(formulaErrorVALUE, "CONFIDENCE.T requires 3 arguments")
  7213. }
  7214. var alpha, standardDev, size formulaArg
  7215. if alpha = argsList.Front().Value.(formulaArg).ToNumber(); alpha.Type != ArgNumber {
  7216. return alpha
  7217. }
  7218. if standardDev = argsList.Front().Next().Value.(formulaArg).ToNumber(); standardDev.Type != ArgNumber {
  7219. return standardDev
  7220. }
  7221. if size = argsList.Back().Value.(formulaArg).ToNumber(); size.Type != ArgNumber {
  7222. return size
  7223. }
  7224. if alpha.Number <= 0 || alpha.Number >= 1 || standardDev.Number <= 0 || size.Number < 1 {
  7225. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7226. }
  7227. if size.Number == 1 {
  7228. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  7229. }
  7230. return newNumberFormulaArg(standardDev.Number * calcIterateInverse(calcInverseIterator{
  7231. name: "CONFIDENCE.T",
  7232. fp: alpha.Number,
  7233. fDF: size.Number - 1,
  7234. nT: 2,
  7235. }, size.Number/2, size.Number) / math.Sqrt(size.Number))
  7236. }
  7237. // covar is an implementation of the formula functions COVAR, COVARIANCE.P and
  7238. // COVARIANCE.S.
  7239. func (fn *formulaFuncs) covar(name string, argsList *list.List) formulaArg {
  7240. if argsList.Len() != 2 {
  7241. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 2 arguments", name))
  7242. }
  7243. array1 := argsList.Front().Value.(formulaArg)
  7244. array2 := argsList.Back().Value.(formulaArg)
  7245. left, right := array1.ToList(), array2.ToList()
  7246. n := len(left)
  7247. if n != len(right) {
  7248. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  7249. }
  7250. l1, l2 := list.New(), list.New()
  7251. l1.PushBack(array1)
  7252. l2.PushBack(array2)
  7253. result, skip := 0.0, 0
  7254. mean1, mean2 := fn.AVERAGE(l1), fn.AVERAGE(l2)
  7255. for i := 0; i < n; i++ {
  7256. arg1 := left[i].ToNumber()
  7257. arg2 := right[i].ToNumber()
  7258. if arg1.Type == ArgError || arg2.Type == ArgError {
  7259. skip++
  7260. continue
  7261. }
  7262. result += (arg1.Number - mean1.Number) * (arg2.Number - mean2.Number)
  7263. }
  7264. if name == "COVARIANCE.S" {
  7265. return newNumberFormulaArg(result / float64(n-skip-1))
  7266. }
  7267. return newNumberFormulaArg(result / float64(n-skip))
  7268. }
  7269. // COVAR function calculates the covariance of two supplied sets of values. The
  7270. // syntax of the function is:
  7271. //
  7272. // COVAR(array1,array2)
  7273. func (fn *formulaFuncs) COVAR(argsList *list.List) formulaArg {
  7274. return fn.covar("COVAR", argsList)
  7275. }
  7276. // COVARIANCEdotP function calculates the population covariance of two supplied
  7277. // sets of values. The syntax of the function is:
  7278. //
  7279. // COVARIANCE.P(array1,array2)
  7280. func (fn *formulaFuncs) COVARIANCEdotP(argsList *list.List) formulaArg {
  7281. return fn.covar("COVARIANCE.P", argsList)
  7282. }
  7283. // COVARIANCEdotS function calculates the sample covariance of two supplied
  7284. // sets of values. The syntax of the function is:
  7285. //
  7286. // COVARIANCE.S(array1,array2)
  7287. func (fn *formulaFuncs) COVARIANCEdotS(argsList *list.List) formulaArg {
  7288. return fn.covar("COVARIANCE.S", argsList)
  7289. }
  7290. // calcStringCountSum is part of the implementation countSum.
  7291. func calcStringCountSum(countText bool, count, sum float64, num, arg formulaArg) (float64, float64) {
  7292. if countText && num.Type == ArgError && arg.String != "" {
  7293. count++
  7294. }
  7295. if num.Type == ArgNumber {
  7296. sum += num.Number
  7297. count++
  7298. }
  7299. return count, sum
  7300. }
  7301. // countSum get count and sum for a formula arguments array.
  7302. func (fn *formulaFuncs) countSum(countText bool, args []formulaArg) (count, sum float64) {
  7303. for _, arg := range args {
  7304. switch arg.Type {
  7305. case ArgNumber:
  7306. if countText || !arg.Boolean {
  7307. sum += arg.Number
  7308. count++
  7309. }
  7310. case ArgString:
  7311. if !countText && (arg.Value() == "TRUE" || arg.Value() == "FALSE") {
  7312. continue
  7313. } else if countText && (arg.Value() == "TRUE" || arg.Value() == "FALSE") {
  7314. num := arg.ToBool()
  7315. if num.Type == ArgNumber {
  7316. count++
  7317. sum += num.Number
  7318. continue
  7319. }
  7320. }
  7321. num := arg.ToNumber()
  7322. count, sum = calcStringCountSum(countText, count, sum, num, arg)
  7323. case ArgList, ArgMatrix:
  7324. cnt, summary := fn.countSum(countText, arg.ToList())
  7325. sum += summary
  7326. count += cnt
  7327. }
  7328. }
  7329. return
  7330. }
  7331. // CORREL function calculates the Pearson Product-Moment Correlation
  7332. // Coefficient for two sets of values. The syntax of the function is:
  7333. //
  7334. // CORREL(array1,array2)
  7335. func (fn *formulaFuncs) CORREL(argsList *list.List) formulaArg {
  7336. if argsList.Len() != 2 {
  7337. return newErrorFormulaArg(formulaErrorVALUE, "CORREL requires 2 arguments")
  7338. }
  7339. array1 := argsList.Front().Value.(formulaArg)
  7340. array2 := argsList.Back().Value.(formulaArg)
  7341. left, right := array1.ToList(), array2.ToList()
  7342. n := len(left)
  7343. if n != len(right) {
  7344. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  7345. }
  7346. l1, l2, l3 := list.New(), list.New(), list.New()
  7347. for i := 0; i < n; i++ {
  7348. if lhs, rhs := left[i].ToNumber(), right[i].ToNumber(); lhs.Number != 0 && rhs.Number != 0 {
  7349. l1.PushBack(lhs)
  7350. l2.PushBack(rhs)
  7351. }
  7352. }
  7353. stdev1, stdev2 := fn.STDEV(l1), fn.STDEV(l2)
  7354. if stdev1.Number == 0 || stdev2.Number == 0 {
  7355. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  7356. }
  7357. mean1, mean2, skip := fn.AVERAGE(l1), fn.AVERAGE(l2), 0
  7358. for i := 0; i < n; i++ {
  7359. lhs, rhs := left[i].ToNumber(), right[i].ToNumber()
  7360. if lhs.Number == 0 || rhs.Number == 0 {
  7361. skip++
  7362. continue
  7363. }
  7364. l3.PushBack(newNumberFormulaArg((lhs.Number - mean1.Number) * (rhs.Number - mean2.Number)))
  7365. }
  7366. return newNumberFormulaArg(fn.SUM(l3).Number / float64(n-skip-1) / stdev1.Number / stdev2.Number)
  7367. }
  7368. // COUNT function returns the count of numeric values in a supplied set of
  7369. // cells or values. This count includes both numbers and dates. The syntax of
  7370. // the function is:
  7371. //
  7372. // COUNT(value1,[value2],...)
  7373. func (fn *formulaFuncs) COUNT(argsList *list.List) formulaArg {
  7374. var count int
  7375. for token := argsList.Front(); token != nil; token = token.Next() {
  7376. arg := token.Value.(formulaArg)
  7377. switch arg.Type {
  7378. case ArgString:
  7379. if num := arg.ToNumber(); num.Type == ArgNumber {
  7380. count++
  7381. }
  7382. case ArgNumber:
  7383. count++
  7384. case ArgMatrix:
  7385. for _, row := range arg.Matrix {
  7386. for _, cell := range row {
  7387. if cell.Type == ArgNumber {
  7388. count++
  7389. }
  7390. }
  7391. }
  7392. }
  7393. }
  7394. return newNumberFormulaArg(float64(count))
  7395. }
  7396. // COUNTA function returns the number of non-blanks within a supplied set of
  7397. // cells or values. The syntax of the function is:
  7398. //
  7399. // COUNTA(value1,[value2],...)
  7400. func (fn *formulaFuncs) COUNTA(argsList *list.List) formulaArg {
  7401. var count int
  7402. for token := argsList.Front(); token != nil; token = token.Next() {
  7403. arg := token.Value.(formulaArg)
  7404. switch arg.Type {
  7405. case ArgString:
  7406. if arg.String != "" {
  7407. count++
  7408. }
  7409. case ArgNumber:
  7410. count++
  7411. case ArgMatrix:
  7412. for _, row := range arg.ToList() {
  7413. switch row.Type {
  7414. case ArgString:
  7415. if row.String != "" {
  7416. count++
  7417. }
  7418. case ArgNumber:
  7419. count++
  7420. }
  7421. }
  7422. }
  7423. }
  7424. return newNumberFormulaArg(float64(count))
  7425. }
  7426. // COUNTBLANK function returns the number of blank cells in a supplied range.
  7427. // The syntax of the function is:
  7428. //
  7429. // COUNTBLANK(range)
  7430. func (fn *formulaFuncs) COUNTBLANK(argsList *list.List) formulaArg {
  7431. if argsList.Len() != 1 {
  7432. return newErrorFormulaArg(formulaErrorVALUE, "COUNTBLANK requires 1 argument")
  7433. }
  7434. var count float64
  7435. for _, cell := range argsList.Front().Value.(formulaArg).ToList() {
  7436. if cell.Type == ArgEmpty {
  7437. count++
  7438. }
  7439. }
  7440. return newNumberFormulaArg(count)
  7441. }
  7442. // COUNTIF function returns the number of cells within a supplied range, that
  7443. // satisfy a given criteria. The syntax of the function is:
  7444. //
  7445. // COUNTIF(range,criteria)
  7446. func (fn *formulaFuncs) COUNTIF(argsList *list.List) formulaArg {
  7447. if argsList.Len() != 2 {
  7448. return newErrorFormulaArg(formulaErrorVALUE, "COUNTIF requires 2 arguments")
  7449. }
  7450. var (
  7451. criteria = formulaCriteriaParser(argsList.Front().Next().Value.(formulaArg).String)
  7452. count float64
  7453. )
  7454. for _, cell := range argsList.Front().Value.(formulaArg).ToList() {
  7455. if ok, _ := formulaCriteriaEval(cell.Value(), criteria); ok {
  7456. count++
  7457. }
  7458. }
  7459. return newNumberFormulaArg(count)
  7460. }
  7461. // formulaIfsMatch function returns cells reference array which match criteria.
  7462. func formulaIfsMatch(args []formulaArg) (cellRefs []cellRef) {
  7463. for i := 0; i < len(args)-1; i += 2 {
  7464. var match []cellRef
  7465. matrix, criteria := args[i].Matrix, formulaCriteriaParser(args[i+1].Value())
  7466. if i == 0 {
  7467. for rowIdx, row := range matrix {
  7468. for colIdx, col := range row {
  7469. if ok, _ := formulaCriteriaEval(col.Value(), criteria); ok {
  7470. match = append(match, cellRef{Col: colIdx, Row: rowIdx})
  7471. }
  7472. }
  7473. }
  7474. } else {
  7475. for _, ref := range cellRefs {
  7476. value := matrix[ref.Row][ref.Col]
  7477. if ok, _ := formulaCriteriaEval(value.Value(), criteria); ok {
  7478. match = append(match, ref)
  7479. }
  7480. }
  7481. }
  7482. if len(match) == 0 {
  7483. return
  7484. }
  7485. cellRefs = match[:]
  7486. }
  7487. return
  7488. }
  7489. // COUNTIFS function returns the number of rows within a table, that satisfy a
  7490. // set of given criteria. The syntax of the function is:
  7491. //
  7492. // COUNTIFS(criteria_range1,criteria1,[criteria_range2,criteria2],...)
  7493. func (fn *formulaFuncs) COUNTIFS(argsList *list.List) formulaArg {
  7494. if argsList.Len() < 2 {
  7495. return newErrorFormulaArg(formulaErrorVALUE, "COUNTIFS requires at least 2 arguments")
  7496. }
  7497. if argsList.Len()%2 != 0 {
  7498. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  7499. }
  7500. var args []formulaArg
  7501. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  7502. args = append(args, arg.Value.(formulaArg))
  7503. }
  7504. return newNumberFormulaArg(float64(len(formulaIfsMatch(args))))
  7505. }
  7506. // CRITBINOM function returns the inverse of the Cumulative Binomial
  7507. // Distribution. I.e. for a specific number of independent trials, the
  7508. // function returns the smallest value (number of successes) for which the
  7509. // cumulative binomial distribution is greater than or equal to a specified
  7510. // value. The syntax of the function is:
  7511. //
  7512. // CRITBINOM(trials,probability_s,alpha)
  7513. func (fn *formulaFuncs) CRITBINOM(argsList *list.List) formulaArg {
  7514. if argsList.Len() != 3 {
  7515. return newErrorFormulaArg(formulaErrorVALUE, "CRITBINOM requires 3 numeric arguments")
  7516. }
  7517. return fn.BINOMdotINV(argsList)
  7518. }
  7519. // DEVSQ function calculates the sum of the squared deviations from the sample
  7520. // mean. The syntax of the function is:
  7521. //
  7522. // DEVSQ(number1,[number2],...)
  7523. func (fn *formulaFuncs) DEVSQ(argsList *list.List) formulaArg {
  7524. if argsList.Len() < 1 {
  7525. return newErrorFormulaArg(formulaErrorVALUE, "DEVSQ requires at least 1 numeric argument")
  7526. }
  7527. avg, count, result := fn.AVERAGE(argsList), -1, 0.0
  7528. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  7529. for _, cell := range arg.Value.(formulaArg).ToList() {
  7530. if cell.Type != ArgNumber {
  7531. continue
  7532. }
  7533. count++
  7534. if count == 0 {
  7535. result = math.Pow(cell.Number-avg.Number, 2)
  7536. continue
  7537. }
  7538. result += math.Pow(cell.Number-avg.Number, 2)
  7539. }
  7540. }
  7541. if count == -1 {
  7542. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  7543. }
  7544. return newNumberFormulaArg(result)
  7545. }
  7546. // FISHER function calculates the Fisher Transformation for a supplied value.
  7547. // The syntax of the function is:
  7548. //
  7549. // FISHER(x)
  7550. func (fn *formulaFuncs) FISHER(argsList *list.List) formulaArg {
  7551. if argsList.Len() != 1 {
  7552. return newErrorFormulaArg(formulaErrorVALUE, "FISHER requires 1 numeric argument")
  7553. }
  7554. token := argsList.Front().Value.(formulaArg)
  7555. switch token.Type {
  7556. case ArgString:
  7557. arg := token.ToNumber()
  7558. if arg.Type == ArgNumber {
  7559. if arg.Number <= -1 || arg.Number >= 1 {
  7560. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  7561. }
  7562. return newNumberFormulaArg(0.5 * math.Log((1+arg.Number)/(1-arg.Number)))
  7563. }
  7564. case ArgNumber:
  7565. if token.Number <= -1 || token.Number >= 1 {
  7566. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  7567. }
  7568. return newNumberFormulaArg(0.5 * math.Log((1+token.Number)/(1-token.Number)))
  7569. }
  7570. return newErrorFormulaArg(formulaErrorVALUE, "FISHER requires 1 numeric argument")
  7571. }
  7572. // FISHERINV function calculates the inverse of the Fisher Transformation and
  7573. // returns a value between -1 and +1. The syntax of the function is:
  7574. //
  7575. // FISHERINV(y)
  7576. func (fn *formulaFuncs) FISHERINV(argsList *list.List) formulaArg {
  7577. if argsList.Len() != 1 {
  7578. return newErrorFormulaArg(formulaErrorVALUE, "FISHERINV requires 1 numeric argument")
  7579. }
  7580. token := argsList.Front().Value.(formulaArg)
  7581. switch token.Type {
  7582. case ArgString:
  7583. arg := token.ToNumber()
  7584. if arg.Type == ArgNumber {
  7585. return newNumberFormulaArg((math.Exp(2*arg.Number) - 1) / (math.Exp(2*arg.Number) + 1))
  7586. }
  7587. case ArgNumber:
  7588. return newNumberFormulaArg((math.Exp(2*token.Number) - 1) / (math.Exp(2*token.Number) + 1))
  7589. }
  7590. return newErrorFormulaArg(formulaErrorVALUE, "FISHERINV requires 1 numeric argument")
  7591. }
  7592. // GAMMA function returns the value of the Gamma Function, Γ(n), for a
  7593. // specified number, n. The syntax of the function is:
  7594. //
  7595. // GAMMA(number)
  7596. func (fn *formulaFuncs) GAMMA(argsList *list.List) formulaArg {
  7597. if argsList.Len() != 1 {
  7598. return newErrorFormulaArg(formulaErrorVALUE, "GAMMA requires 1 numeric argument")
  7599. }
  7600. number := argsList.Front().Value.(formulaArg).ToNumber()
  7601. if number.Type != ArgNumber {
  7602. return newErrorFormulaArg(formulaErrorVALUE, "GAMMA requires 1 numeric argument")
  7603. }
  7604. if number.Number <= 0 {
  7605. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  7606. }
  7607. return newNumberFormulaArg(math.Gamma(number.Number))
  7608. }
  7609. // GAMMAdotDIST function returns the Gamma Distribution, which is frequently
  7610. // used to provide probabilities for values that may have a skewed
  7611. // distribution, such as queuing analysis.
  7612. //
  7613. // GAMMA.DIST(x,alpha,beta,cumulative)
  7614. func (fn *formulaFuncs) GAMMAdotDIST(argsList *list.List) formulaArg {
  7615. if argsList.Len() != 4 {
  7616. return newErrorFormulaArg(formulaErrorVALUE, "GAMMA.DIST requires 4 arguments")
  7617. }
  7618. return fn.GAMMADIST(argsList)
  7619. }
  7620. // GAMMADIST function returns the Gamma Distribution, which is frequently used
  7621. // to provide probabilities for values that may have a skewed distribution,
  7622. // such as queuing analysis.
  7623. //
  7624. // GAMMADIST(x,alpha,beta,cumulative)
  7625. func (fn *formulaFuncs) GAMMADIST(argsList *list.List) formulaArg {
  7626. if argsList.Len() != 4 {
  7627. return newErrorFormulaArg(formulaErrorVALUE, "GAMMADIST requires 4 arguments")
  7628. }
  7629. var x, alpha, beta, cumulative formulaArg
  7630. if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
  7631. return x
  7632. }
  7633. if x.Number < 0 {
  7634. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7635. }
  7636. if alpha = argsList.Front().Next().Value.(formulaArg).ToNumber(); alpha.Type != ArgNumber {
  7637. return alpha
  7638. }
  7639. if beta = argsList.Back().Prev().Value.(formulaArg).ToNumber(); beta.Type != ArgNumber {
  7640. return beta
  7641. }
  7642. if alpha.Number <= 0 || beta.Number <= 0 {
  7643. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7644. }
  7645. if cumulative = argsList.Back().Value.(formulaArg).ToBool(); cumulative.Type == ArgError {
  7646. return cumulative
  7647. }
  7648. if cumulative.Number == 1 {
  7649. return newNumberFormulaArg(incompleteGamma(alpha.Number, x.Number/beta.Number) / math.Gamma(alpha.Number))
  7650. }
  7651. return newNumberFormulaArg((1 / (math.Pow(beta.Number, alpha.Number) * math.Gamma(alpha.Number))) * math.Pow(x.Number, alpha.Number-1) * math.Exp(0-(x.Number/beta.Number)))
  7652. }
  7653. // gammainv returns the inverse of the Gamma distribution for the specified
  7654. // value.
  7655. func gammainv(probability, alpha, beta float64) float64 {
  7656. xLo, xHi := 0.0, alpha*beta*5
  7657. dx, x, xNew, result := 1024.0, 1.0, 1.0, 0.0
  7658. for i := 0; math.Abs(dx) > 8.88e-016 && i <= 256; i++ {
  7659. result = incompleteGamma(alpha, x/beta) / math.Gamma(alpha)
  7660. e := result - probability
  7661. if e == 0 {
  7662. dx = 0
  7663. } else if e < 0 {
  7664. xLo = x
  7665. } else {
  7666. xHi = x
  7667. }
  7668. pdf := (1 / (math.Pow(beta, alpha) * math.Gamma(alpha))) * math.Pow(x, alpha-1) * math.Exp(0-(x/beta))
  7669. if pdf != 0 {
  7670. dx = e / pdf
  7671. xNew = x - dx
  7672. }
  7673. if xNew < xLo || xNew > xHi || pdf == 0 {
  7674. xNew = (xLo + xHi) / 2
  7675. dx = xNew - x
  7676. }
  7677. x = xNew
  7678. }
  7679. return x
  7680. }
  7681. // GAMMAdotINV function returns the inverse of the Gamma Cumulative
  7682. // Distribution. The syntax of the function is:
  7683. //
  7684. // GAMMA.INV(probability,alpha,beta)
  7685. func (fn *formulaFuncs) GAMMAdotINV(argsList *list.List) formulaArg {
  7686. if argsList.Len() != 3 {
  7687. return newErrorFormulaArg(formulaErrorVALUE, "GAMMA.INV requires 3 arguments")
  7688. }
  7689. return fn.GAMMAINV(argsList)
  7690. }
  7691. // GAMMAINV function returns the inverse of the Gamma Cumulative Distribution.
  7692. // The syntax of the function is:
  7693. //
  7694. // GAMMAINV(probability,alpha,beta)
  7695. func (fn *formulaFuncs) GAMMAINV(argsList *list.List) formulaArg {
  7696. if argsList.Len() != 3 {
  7697. return newErrorFormulaArg(formulaErrorVALUE, "GAMMAINV requires 3 arguments")
  7698. }
  7699. var probability, alpha, beta formulaArg
  7700. if probability = argsList.Front().Value.(formulaArg).ToNumber(); probability.Type != ArgNumber {
  7701. return probability
  7702. }
  7703. if probability.Number < 0 || probability.Number >= 1 {
  7704. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7705. }
  7706. if alpha = argsList.Front().Next().Value.(formulaArg).ToNumber(); alpha.Type != ArgNumber {
  7707. return alpha
  7708. }
  7709. if beta = argsList.Back().Value.(formulaArg).ToNumber(); beta.Type != ArgNumber {
  7710. return beta
  7711. }
  7712. if alpha.Number <= 0 || beta.Number <= 0 {
  7713. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7714. }
  7715. return newNumberFormulaArg(gammainv(probability.Number, alpha.Number, beta.Number))
  7716. }
  7717. // GAMMALN function returns the natural logarithm of the Gamma Function, Γ
  7718. // (n). The syntax of the function is:
  7719. //
  7720. // GAMMALN(x)
  7721. func (fn *formulaFuncs) GAMMALN(argsList *list.List) formulaArg {
  7722. if argsList.Len() != 1 {
  7723. return newErrorFormulaArg(formulaErrorVALUE, "GAMMALN requires 1 numeric argument")
  7724. }
  7725. x := argsList.Front().Value.(formulaArg).ToNumber()
  7726. if x.Type != ArgNumber {
  7727. return newErrorFormulaArg(formulaErrorVALUE, "GAMMALN requires 1 numeric argument")
  7728. }
  7729. if x.Number <= 0 {
  7730. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  7731. }
  7732. return newNumberFormulaArg(math.Log(math.Gamma(x.Number)))
  7733. }
  7734. // GAMMALNdotPRECISE function returns the natural logarithm of the Gamma
  7735. // Function, Γ(n). The syntax of the function is:
  7736. //
  7737. // GAMMALN.PRECISE(x)
  7738. func (fn *formulaFuncs) GAMMALNdotPRECISE(argsList *list.List) formulaArg {
  7739. if argsList.Len() != 1 {
  7740. return newErrorFormulaArg(formulaErrorVALUE, "GAMMALN.PRECISE requires 1 numeric argument")
  7741. }
  7742. x := argsList.Front().Value.(formulaArg).ToNumber()
  7743. if x.Type != ArgNumber {
  7744. return x
  7745. }
  7746. if x.Number <= 0 {
  7747. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7748. }
  7749. return newNumberFormulaArg(getLogGamma(x.Number))
  7750. }
  7751. // GAUSS function returns the probability that a member of a standard normal
  7752. // population will fall between the mean and a specified number of standard
  7753. // deviations from the mean. The syntax of the function is:
  7754. //
  7755. // GAUSS(z)
  7756. func (fn *formulaFuncs) GAUSS(argsList *list.List) formulaArg {
  7757. if argsList.Len() != 1 {
  7758. return newErrorFormulaArg(formulaErrorVALUE, "GAUSS requires 1 numeric argument")
  7759. }
  7760. args := list.New().Init()
  7761. args.PushBack(argsList.Front().Value.(formulaArg))
  7762. args.PushBack(formulaArg{Type: ArgNumber, Number: 0})
  7763. args.PushBack(formulaArg{Type: ArgNumber, Number: 1})
  7764. args.PushBack(newBoolFormulaArg(true))
  7765. normdist := fn.NORMDIST(args)
  7766. if normdist.Type != ArgNumber {
  7767. return normdist
  7768. }
  7769. return newNumberFormulaArg(normdist.Number - 0.5)
  7770. }
  7771. // GEOMEAN function calculates the geometric mean of a supplied set of values.
  7772. // The syntax of the function is:
  7773. //
  7774. // GEOMEAN(number1,[number2],...)
  7775. func (fn *formulaFuncs) GEOMEAN(argsList *list.List) formulaArg {
  7776. if argsList.Len() < 1 {
  7777. return newErrorFormulaArg(formulaErrorVALUE, "GEOMEAN requires at least 1 numeric argument")
  7778. }
  7779. product := fn.PRODUCT(argsList)
  7780. if product.Type != ArgNumber {
  7781. return product
  7782. }
  7783. count := fn.COUNT(argsList)
  7784. min := fn.MIN(argsList)
  7785. if product.Number > 0 && min.Number > 0 {
  7786. return newNumberFormulaArg(math.Pow(product.Number, 1/count.Number))
  7787. }
  7788. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7789. }
  7790. // getNewMatrix create matrix by given columns and rows.
  7791. func getNewMatrix(c, r int) (matrix [][]float64) {
  7792. for i := 0; i < c; i++ {
  7793. for j := 0; j < r; j++ {
  7794. for x := len(matrix); x <= i; x++ {
  7795. matrix = append(matrix, []float64{})
  7796. }
  7797. for y := len(matrix[i]); y <= j; y++ {
  7798. matrix[i] = append(matrix[i], 0)
  7799. }
  7800. matrix[i][j] = 0
  7801. }
  7802. }
  7803. return
  7804. }
  7805. // approxSub subtract two values, if signs are identical and the values are
  7806. // equal, will be returns 0 instead of calculating the subtraction.
  7807. func approxSub(a, b float64) float64 {
  7808. if ((a < 0 && b < 0) || (a > 0 && b > 0)) && math.Abs(a-b) < 2.22045e-016 {
  7809. return 0
  7810. }
  7811. return a - b
  7812. }
  7813. // matrixClone return a copy of all elements of the original matrix.
  7814. func matrixClone(matrix [][]float64) (cloneMatrix [][]float64) {
  7815. for i := 0; i < len(matrix); i++ {
  7816. for j := 0; j < len(matrix[i]); j++ {
  7817. for x := len(cloneMatrix); x <= i; x++ {
  7818. cloneMatrix = append(cloneMatrix, []float64{})
  7819. }
  7820. for k := len(cloneMatrix[i]); k <= j; k++ {
  7821. cloneMatrix[i] = append(cloneMatrix[i], 0)
  7822. }
  7823. cloneMatrix[i][j] = matrix[i][j]
  7824. }
  7825. }
  7826. return
  7827. }
  7828. // trendGrowthMatrixInfo defined matrix checking result.
  7829. type trendGrowthMatrixInfo struct {
  7830. trendType, nCX, nCY, nRX, nRY, M, N int
  7831. mtxX, mtxY [][]float64
  7832. }
  7833. // prepareTrendGrowthMtxX is a part of implementation of the trend growth prepare.
  7834. func prepareTrendGrowthMtxX(mtxX [][]float64) [][]float64 {
  7835. var mtx [][]float64
  7836. for i := 0; i < len(mtxX); i++ {
  7837. for j := 0; j < len(mtxX[i]); j++ {
  7838. if mtxX[i][j] == 0 {
  7839. return nil
  7840. }
  7841. for x := len(mtx); x <= j; x++ {
  7842. mtx = append(mtx, []float64{})
  7843. }
  7844. for y := len(mtx[j]); y <= i; y++ {
  7845. mtx[j] = append(mtx[j], 0)
  7846. }
  7847. mtx[j][i] = mtxX[i][j]
  7848. }
  7849. }
  7850. return mtx
  7851. }
  7852. // prepareTrendGrowthMtxY is a part of implementation of the trend growth prepare.
  7853. func prepareTrendGrowthMtxY(bLOG bool, mtxY [][]float64) [][]float64 {
  7854. var mtx [][]float64
  7855. for i := 0; i < len(mtxY); i++ {
  7856. for j := 0; j < len(mtxY[i]); j++ {
  7857. if mtxY[i][j] == 0 {
  7858. return nil
  7859. }
  7860. for x := len(mtx); x <= j; x++ {
  7861. mtx = append(mtx, []float64{})
  7862. }
  7863. for y := len(mtx[j]); y <= i; y++ {
  7864. mtx[j] = append(mtx[j], 0)
  7865. }
  7866. mtx[j][i] = mtxY[i][j]
  7867. }
  7868. }
  7869. if bLOG {
  7870. var pNewY [][]float64
  7871. for i := 0; i < len(mtxY); i++ {
  7872. for j := 0; j < len(mtxY[i]); j++ {
  7873. fVal := mtxY[i][j]
  7874. if fVal <= 0 {
  7875. return nil
  7876. }
  7877. for x := len(pNewY); x <= j; x++ {
  7878. pNewY = append(pNewY, []float64{})
  7879. }
  7880. for y := len(pNewY[j]); y <= i; y++ {
  7881. pNewY[j] = append(pNewY[j], 0)
  7882. }
  7883. pNewY[j][i] = math.Log(fVal)
  7884. }
  7885. }
  7886. mtx = pNewY
  7887. }
  7888. return mtx
  7889. }
  7890. // prepareTrendGrowth check and return the result.
  7891. func prepareTrendGrowth(bLOG bool, mtxX, mtxY [][]float64) (*trendGrowthMatrixInfo, formulaArg) {
  7892. var nCX, nRX, M, N, trendType int
  7893. nRY, nCY := len(mtxY), len(mtxY[0])
  7894. cntY := nCY * nRY
  7895. newY := prepareTrendGrowthMtxY(bLOG, mtxY)
  7896. if newY == nil {
  7897. return nil, newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7898. }
  7899. var newX [][]float64
  7900. if len(mtxX) != 0 {
  7901. nRX, nCX = len(mtxX), len(mtxX[0])
  7902. if newX = prepareTrendGrowthMtxX(mtxX); newX == nil {
  7903. return nil, newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  7904. }
  7905. if nCX == nCY && nRX == nRY {
  7906. trendType, M, N = 1, 1, cntY // simple regression
  7907. } else if nCY != 1 && nRY != 1 {
  7908. return nil, newErrorFormulaArg(formulaErrorREF, formulaErrorREF)
  7909. } else if nCY == 1 {
  7910. if nRX != nRY {
  7911. return nil, newErrorFormulaArg(formulaErrorREF, formulaErrorREF)
  7912. }
  7913. trendType, M, N = 2, nCX, nRY
  7914. } else if nCX != nCY {
  7915. return nil, newErrorFormulaArg(formulaErrorREF, formulaErrorREF)
  7916. } else {
  7917. trendType, M, N = 3, nRX, nCY
  7918. }
  7919. } else {
  7920. newX = getNewMatrix(nCY, nRY)
  7921. nCX, nRX = nCY, nRY
  7922. num := 1.0
  7923. for i := 0; i < nRY; i++ {
  7924. for j := 0; j < nCY; j++ {
  7925. newX[j][i] = num
  7926. num++
  7927. }
  7928. }
  7929. trendType, M, N = 1, 1, cntY
  7930. }
  7931. return &trendGrowthMatrixInfo{
  7932. trendType: trendType,
  7933. nCX: nCX,
  7934. nCY: nCY,
  7935. nRX: nRX,
  7936. nRY: nRY,
  7937. M: M,
  7938. N: N,
  7939. mtxX: newX,
  7940. mtxY: newY,
  7941. }, newEmptyFormulaArg()
  7942. }
  7943. // calcPosition calculate position for matrix by given index.
  7944. func calcPosition(mtx [][]float64, idx int) (row, col int) {
  7945. rowSize := len(mtx[0])
  7946. col = idx
  7947. if rowSize > 1 {
  7948. col = idx / rowSize
  7949. }
  7950. row = idx - col*rowSize
  7951. return
  7952. }
  7953. // getDouble returns float64 data type value in the matrix by given index.
  7954. func getDouble(mtx [][]float64, idx int) float64 {
  7955. row, col := calcPosition(mtx, idx)
  7956. return mtx[col][row]
  7957. }
  7958. // putDouble set a float64 data type value in the matrix by given index.
  7959. func putDouble(mtx [][]float64, idx int, val float64) {
  7960. row, col := calcPosition(mtx, idx)
  7961. mtx[col][row] = val
  7962. }
  7963. // calcMeanOverAll returns mean of the given matrix by over all element.
  7964. func calcMeanOverAll(mtx [][]float64, n int) float64 {
  7965. var sum float64
  7966. for i := 0; i < len(mtx); i++ {
  7967. for j := 0; j < len(mtx[i]); j++ {
  7968. sum += mtx[i][j]
  7969. }
  7970. }
  7971. return sum / float64(n)
  7972. }
  7973. // calcSumProduct returns uses the matrices as vectors of length M over all
  7974. // element.
  7975. func calcSumProduct(mtxA, mtxB [][]float64, m int) float64 {
  7976. sum := 0.0
  7977. for i := 0; i < m; i++ {
  7978. sum += getDouble(mtxA, i) * getDouble(mtxB, i)
  7979. }
  7980. return sum
  7981. }
  7982. // calcColumnMeans calculates means of the columns of matrix.
  7983. func calcColumnMeans(mtxX, mtxRes [][]float64, c, r int) {
  7984. for i := 0; i < c; i++ {
  7985. var sum float64
  7986. for k := 0; k < r; k++ {
  7987. sum += mtxX[i][k]
  7988. }
  7989. putDouble(mtxRes, i, sum/float64(r))
  7990. }
  7991. }
  7992. // calcColumnsDelta calculates subtract of the columns of matrix.
  7993. func calcColumnsDelta(mtx, columnMeans [][]float64, c, r int) {
  7994. for i := 0; i < c; i++ {
  7995. for k := 0; k < r; k++ {
  7996. mtx[i][k] = approxSub(mtx[i][k], getDouble(columnMeans, i))
  7997. }
  7998. }
  7999. }
  8000. // calcSign returns sign by given value, no mathematical signum, but used to
  8001. // switch between adding and subtracting.
  8002. func calcSign(val float64) float64 {
  8003. if val > 0 {
  8004. return 1
  8005. }
  8006. return -1
  8007. }
  8008. // calcColsMaximumNorm is a special version for use within QR
  8009. // decomposition. Maximum norm of column index c starting in row index r;
  8010. // matrix A has count n rows.
  8011. func calcColsMaximumNorm(mtxA [][]float64, c, r, n int) float64 {
  8012. var norm float64
  8013. for row := r; row < n; row++ {
  8014. if norm < math.Abs(mtxA[c][row]) {
  8015. norm = math.Abs(mtxA[c][row])
  8016. }
  8017. }
  8018. return norm
  8019. }
  8020. // calcFastMult returns multiply n x m matrix A with m x l matrix B to n x l matrix R.
  8021. func calcFastMult(mtxA, mtxB, mtxR [][]float64, n, m, l int) {
  8022. var sum float64
  8023. for row := 0; row < n; row++ {
  8024. for col := 0; col < l; col++ {
  8025. sum = 0.0
  8026. for k := 0; k < m; k++ {
  8027. sum += mtxA[k][row] * mtxB[col][k]
  8028. }
  8029. mtxR[col][row] = sum
  8030. }
  8031. }
  8032. }
  8033. // calcRowsEuclideanNorm is a special version for use within QR
  8034. // decomposition. Euclidean norm of column index c starting in row index r;
  8035. // matrix a has count n rows.
  8036. func calcRowsEuclideanNorm(mtxA [][]float64, c, r, n int) float64 {
  8037. var norm float64
  8038. for row := r; row < n; row++ {
  8039. norm += mtxA[c][row] * mtxA[c][row]
  8040. }
  8041. return math.Sqrt(norm)
  8042. }
  8043. // calcRowsSumProduct is a special version for use within QR decomposition.
  8044. // <A(a);B(b)> starting in row index r;
  8045. // a and b are indices of columns, matrices A and B have count n rows.
  8046. func calcRowsSumProduct(mtxA [][]float64, a int, mtxB [][]float64, b, r, n int) float64 {
  8047. var result float64
  8048. for row := r; row < n; row++ {
  8049. result += mtxA[a][row] * mtxB[b][row]
  8050. }
  8051. return result
  8052. }
  8053. // calcSolveWithUpperRightTriangle solve for X in R*X=S using back substitution.
  8054. func calcSolveWithUpperRightTriangle(mtxA [][]float64, vecR []float64, mtxS [][]float64, k int, bIsTransposed bool) {
  8055. var row int
  8056. for rowp1 := k; rowp1 > 0; rowp1-- {
  8057. row = rowp1 - 1
  8058. sum := getDouble(mtxS, row)
  8059. for col := rowp1; col < k; col++ {
  8060. if bIsTransposed {
  8061. sum -= mtxA[row][col] * getDouble(mtxS, col)
  8062. } else {
  8063. sum -= mtxA[col][row] * getDouble(mtxS, col)
  8064. }
  8065. }
  8066. putDouble(mtxS, row, sum/vecR[row])
  8067. }
  8068. }
  8069. // calcRowQRDecomposition calculates a QR decomposition with Householder
  8070. // reflection.
  8071. func calcRowQRDecomposition(mtxA [][]float64, vecR []float64, k, n int) bool {
  8072. for col := 0; col < k; col++ {
  8073. scale := calcColsMaximumNorm(mtxA, col, col, n)
  8074. if scale == 0 {
  8075. return false
  8076. }
  8077. for row := col; row < n; row++ {
  8078. mtxA[col][row] = mtxA[col][row] / scale
  8079. }
  8080. euclid := calcRowsEuclideanNorm(mtxA, col, col, n)
  8081. factor := 1.0 / euclid / (euclid + math.Abs(mtxA[col][col]))
  8082. signum := calcSign(mtxA[col][col])
  8083. mtxA[col][col] = mtxA[col][col] + signum*euclid
  8084. vecR[col] = -signum * scale * euclid
  8085. // apply Householder transformation to A
  8086. for c := col + 1; c < k; c++ {
  8087. sum := calcRowsSumProduct(mtxA, col, mtxA, c, col, n)
  8088. for row := col; row < n; row++ {
  8089. mtxA[c][row] = mtxA[c][row] - sum*factor*mtxA[col][row]
  8090. }
  8091. }
  8092. }
  8093. return true
  8094. }
  8095. // calcApplyColsHouseholderTransformation transposed matrices A and Y.
  8096. func calcApplyColsHouseholderTransformation(mtxA [][]float64, r int, mtxY [][]float64, n int) {
  8097. denominator := calcColsSumProduct(mtxA, r, mtxA, r, r, n)
  8098. numerator := calcColsSumProduct(mtxA, r, mtxY, 0, r, n)
  8099. factor := 2 * (numerator / denominator)
  8100. for col := r; col < n; col++ {
  8101. putDouble(mtxY, col, getDouble(mtxY, col)-factor*mtxA[col][r])
  8102. }
  8103. }
  8104. // calcRowMeans calculates means of the rows of matrix.
  8105. func calcRowMeans(mtxX, mtxRes [][]float64, c, r int) {
  8106. for k := 0; k < r; k++ {
  8107. var fSum float64
  8108. for i := 0; i < c; i++ {
  8109. fSum += mtxX[i][k]
  8110. }
  8111. mtxRes[k][0] = fSum / float64(c)
  8112. }
  8113. }
  8114. // calcRowsDelta calculates subtract of the rows of matrix.
  8115. func calcRowsDelta(mtx, rowMeans [][]float64, c, r int) {
  8116. for k := 0; k < r; k++ {
  8117. for i := 0; i < c; i++ {
  8118. mtx[i][k] = approxSub(mtx[i][k], rowMeans[k][0])
  8119. }
  8120. }
  8121. }
  8122. // calcColumnMaximumNorm returns maximum norm of row index R starting in col
  8123. // index C; matrix A has count N columns.
  8124. func calcColumnMaximumNorm(mtxA [][]float64, r, c, n int) float64 {
  8125. var norm float64
  8126. for col := c; col < n; col++ {
  8127. if norm < math.Abs(mtxA[col][r]) {
  8128. norm = math.Abs(mtxA[col][r])
  8129. }
  8130. }
  8131. return norm
  8132. }
  8133. // calcColsEuclideanNorm returns euclidean norm of row index R starting in
  8134. // column index C; matrix A has count N columns.
  8135. func calcColsEuclideanNorm(mtxA [][]float64, r, c, n int) float64 {
  8136. var norm float64
  8137. for col := c; col < n; col++ {
  8138. norm += (mtxA[col][r]) * (mtxA[col][r])
  8139. }
  8140. return math.Sqrt(norm)
  8141. }
  8142. // calcColsSumProduct returns sum product for given matrix.
  8143. func calcColsSumProduct(mtxA [][]float64, a int, mtxB [][]float64, b, c, n int) float64 {
  8144. var result float64
  8145. for col := c; col < n; col++ {
  8146. result += mtxA[col][a] * mtxB[col][b]
  8147. }
  8148. return result
  8149. }
  8150. // calcColQRDecomposition same with transposed matrix A, N is count of
  8151. // columns, k count of rows.
  8152. func calcColQRDecomposition(mtxA [][]float64, vecR []float64, k, n int) bool {
  8153. var sum float64
  8154. for row := 0; row < k; row++ {
  8155. // calculate vector u of the householder transformation
  8156. scale := calcColumnMaximumNorm(mtxA, row, row, n)
  8157. if scale == 0 {
  8158. return false
  8159. }
  8160. for col := row; col < n; col++ {
  8161. mtxA[col][row] = mtxA[col][row] / scale
  8162. }
  8163. euclid := calcColsEuclideanNorm(mtxA, row, row, n)
  8164. factor := 1 / euclid / (euclid + math.Abs(mtxA[row][row]))
  8165. signum := calcSign(mtxA[row][row])
  8166. mtxA[row][row] = mtxA[row][row] + signum*euclid
  8167. vecR[row] = -signum * scale * euclid
  8168. // apply Householder transformation to A
  8169. for r := row + 1; r < k; r++ {
  8170. sum = calcColsSumProduct(mtxA, row, mtxA, r, row, n)
  8171. for col := row; col < n; col++ {
  8172. mtxA[col][r] = mtxA[col][r] - sum*factor*mtxA[col][row]
  8173. }
  8174. }
  8175. }
  8176. return true
  8177. }
  8178. // calcApplyRowsHouseholderTransformation applies a Householder transformation to a
  8179. // column vector Y with is given as Nx1 Matrix. The vector u, from which the
  8180. // Householder transformation is built, is the column part in matrix A, with
  8181. // column index c, starting with row index c. A is the result of the QR
  8182. // decomposition as obtained from calcRowQRDecomposition.
  8183. func calcApplyRowsHouseholderTransformation(mtxA [][]float64, c int, mtxY [][]float64, n int) {
  8184. denominator := calcRowsSumProduct(mtxA, c, mtxA, c, c, n)
  8185. numerator := calcRowsSumProduct(mtxA, c, mtxY, 0, c, n)
  8186. factor := 2 * (numerator / denominator)
  8187. for row := c; row < n; row++ {
  8188. putDouble(mtxY, row, getDouble(mtxY, row)-factor*mtxA[c][row])
  8189. }
  8190. }
  8191. // calcTrendGrowthSimpleRegression calculate simple regression for the calcTrendGrowth.
  8192. func calcTrendGrowthSimpleRegression(bConstant, bGrowth bool, mtxY, mtxX, newX, mtxRes [][]float64, meanY float64, N int) {
  8193. var meanX float64
  8194. if bConstant {
  8195. meanX = calcMeanOverAll(mtxX, N)
  8196. for i := 0; i < len(mtxX); i++ {
  8197. for j := 0; j < len(mtxX[i]); j++ {
  8198. mtxX[i][j] = approxSub(mtxX[i][j], meanX)
  8199. }
  8200. }
  8201. }
  8202. sumXY := calcSumProduct(mtxX, mtxY, N)
  8203. sumX2 := calcSumProduct(mtxX, mtxX, N)
  8204. slope := sumXY / sumX2
  8205. var help float64
  8206. var intercept float64
  8207. if bConstant {
  8208. intercept = meanY - slope*meanX
  8209. for i := 0; i < len(mtxRes); i++ {
  8210. for j := 0; j < len(mtxRes[i]); j++ {
  8211. help = newX[i][j]*slope + intercept
  8212. if bGrowth {
  8213. mtxRes[i][j] = math.Exp(help)
  8214. } else {
  8215. mtxRes[i][j] = help
  8216. }
  8217. }
  8218. }
  8219. } else {
  8220. for i := 0; i < len(mtxRes); i++ {
  8221. for j := 0; j < len(mtxRes[i]); j++ {
  8222. help = newX[i][j] * slope
  8223. if bGrowth {
  8224. mtxRes[i][j] = math.Exp(help)
  8225. } else {
  8226. mtxRes[i][j] = help
  8227. }
  8228. }
  8229. }
  8230. }
  8231. }
  8232. // calcTrendGrowthMultipleRegressionPart1 calculate multiple regression for the
  8233. // calcTrendGrowth.
  8234. func calcTrendGrowthMultipleRegressionPart1(bConstant, bGrowth bool, mtxY, mtxX, newX, mtxRes [][]float64, meanY float64, RXN, K, N int) {
  8235. vecR := make([]float64, N) // for QR decomposition
  8236. means := getNewMatrix(K, 1) // mean of each column
  8237. slopes := getNewMatrix(1, K) // from b1 to bK
  8238. if len(means) == 0 || len(slopes) == 0 {
  8239. return
  8240. }
  8241. if bConstant {
  8242. calcColumnMeans(mtxX, means, K, N)
  8243. calcColumnsDelta(mtxX, means, K, N)
  8244. }
  8245. if !calcRowQRDecomposition(mtxX, vecR, K, N) {
  8246. return
  8247. }
  8248. // Later on we will divide by elements of vecR, so make sure that they aren't zero.
  8249. bIsSingular := false
  8250. for row := 0; row < K && !bIsSingular; row++ {
  8251. bIsSingular = bIsSingular || vecR[row] == 0
  8252. }
  8253. if bIsSingular {
  8254. return
  8255. }
  8256. for col := 0; col < K; col++ {
  8257. calcApplyRowsHouseholderTransformation(mtxX, col, mtxY, N)
  8258. }
  8259. for col := 0; col < K; col++ {
  8260. putDouble(slopes, col, getDouble(mtxY, col))
  8261. }
  8262. calcSolveWithUpperRightTriangle(mtxX, vecR, slopes, K, false)
  8263. // Fill result matrix
  8264. calcFastMult(newX, slopes, mtxRes, RXN, K, 1)
  8265. if bConstant {
  8266. intercept := meanY - calcSumProduct(means, slopes, K)
  8267. for row := 0; row < RXN; row++ {
  8268. mtxRes[0][row] = mtxRes[0][row] + intercept
  8269. }
  8270. }
  8271. if bGrowth {
  8272. for i := 0; i < RXN; i++ {
  8273. putDouble(mtxRes, i, math.Exp(getDouble(mtxRes, i)))
  8274. }
  8275. }
  8276. }
  8277. // calcTrendGrowthMultipleRegressionPart2 calculate multiple regression for the
  8278. // calcTrendGrowth.
  8279. func calcTrendGrowthMultipleRegressionPart2(bConstant, bGrowth bool, mtxY, mtxX, newX, mtxRes [][]float64, meanY float64, nCXN, K, N int) {
  8280. vecR := make([]float64, N) // for QR decomposition
  8281. means := getNewMatrix(K, 1) // mean of each row
  8282. slopes := getNewMatrix(K, 1) // row from b1 to bK
  8283. if len(means) == 0 || len(slopes) == 0 {
  8284. return
  8285. }
  8286. if bConstant {
  8287. calcRowMeans(mtxX, means, N, K)
  8288. calcRowsDelta(mtxX, means, N, K)
  8289. }
  8290. if !calcColQRDecomposition(mtxX, vecR, K, N) {
  8291. return
  8292. }
  8293. // later on we will divide by elements of vecR, so make sure that they aren't zero
  8294. bIsSingular := false
  8295. for row := 0; row < K && !bIsSingular; row++ {
  8296. bIsSingular = bIsSingular || vecR[row] == 0
  8297. }
  8298. if bIsSingular {
  8299. return
  8300. }
  8301. for row := 0; row < K; row++ {
  8302. calcApplyColsHouseholderTransformation(mtxX, row, mtxY, N)
  8303. }
  8304. for col := 0; col < K; col++ {
  8305. putDouble(slopes, col, getDouble(mtxY, col))
  8306. }
  8307. calcSolveWithUpperRightTriangle(mtxX, vecR, slopes, K, true)
  8308. // fill result matrix
  8309. calcFastMult(slopes, newX, mtxRes, 1, K, nCXN)
  8310. if bConstant {
  8311. fIntercept := meanY - calcSumProduct(means, slopes, K)
  8312. for col := 0; col < nCXN; col++ {
  8313. mtxRes[col][0] = mtxRes[col][0] + fIntercept
  8314. }
  8315. }
  8316. if bGrowth {
  8317. for i := 0; i < nCXN; i++ {
  8318. putDouble(mtxRes, i, math.Exp(getDouble(mtxRes, i)))
  8319. }
  8320. }
  8321. }
  8322. // calcTrendGrowthRegression is a part of implementation of the calcTrendGrowth.
  8323. func calcTrendGrowthRegression(bConstant, bGrowth bool, trendType, nCXN, nRXN, K, N int, mtxY, mtxX, newX, mtxRes [][]float64) {
  8324. if len(mtxRes) == 0 {
  8325. return
  8326. }
  8327. var meanY float64
  8328. if bConstant {
  8329. copyX, copyY := matrixClone(mtxX), matrixClone(mtxY)
  8330. mtxX, mtxY = copyX, copyY
  8331. meanY = calcMeanOverAll(mtxY, N)
  8332. for i := 0; i < len(mtxY); i++ {
  8333. for j := 0; j < len(mtxY[i]); j++ {
  8334. mtxY[i][j] = approxSub(mtxY[i][j], meanY)
  8335. }
  8336. }
  8337. }
  8338. switch trendType {
  8339. case 1:
  8340. calcTrendGrowthSimpleRegression(bConstant, bGrowth, mtxY, mtxX, newX, mtxRes, meanY, N)
  8341. case 2:
  8342. calcTrendGrowthMultipleRegressionPart1(bConstant, bGrowth, mtxY, mtxX, newX, mtxRes, meanY, nRXN, K, N)
  8343. default:
  8344. calcTrendGrowthMultipleRegressionPart2(bConstant, bGrowth, mtxY, mtxX, newX, mtxRes, meanY, nCXN, K, N)
  8345. }
  8346. }
  8347. // calcTrendGrowth returns values along a predicted exponential trend.
  8348. func calcTrendGrowth(mtxY, mtxX, newX [][]float64, bConstant, bGrowth bool) ([][]float64, formulaArg) {
  8349. getMatrixParams, errArg := prepareTrendGrowth(bGrowth, mtxX, mtxY)
  8350. if errArg.Type != ArgEmpty {
  8351. return nil, errArg
  8352. }
  8353. trendType := getMatrixParams.trendType
  8354. nCX := getMatrixParams.nCX
  8355. nRX := getMatrixParams.nRX
  8356. K := getMatrixParams.M
  8357. N := getMatrixParams.N
  8358. mtxX = getMatrixParams.mtxX
  8359. mtxY = getMatrixParams.mtxY
  8360. // checking if data samples are enough
  8361. if (bConstant && (N < K+1)) || (!bConstant && (N < K)) || (N < 1) || (K < 1) {
  8362. return nil, errArg
  8363. }
  8364. // set the default newX if necessary
  8365. nCXN, nRXN := nCX, nRX
  8366. if len(newX) == 0 {
  8367. newX = matrixClone(mtxX) // mtxX will be changed to X-meanX
  8368. } else {
  8369. nRXN, nCXN = len(newX[0]), len(newX)
  8370. if (trendType == 2 && K != nCXN) || (trendType == 3 && K != nRXN) {
  8371. return nil, errArg
  8372. }
  8373. }
  8374. var mtxRes [][]float64
  8375. switch trendType {
  8376. case 1:
  8377. mtxRes = getNewMatrix(nCXN, nRXN)
  8378. case 2:
  8379. mtxRes = getNewMatrix(1, nRXN)
  8380. default:
  8381. mtxRes = getNewMatrix(nCXN, 1)
  8382. }
  8383. calcTrendGrowthRegression(bConstant, bGrowth, trendType, nCXN, nRXN, K, N, mtxY, mtxX, newX, mtxRes)
  8384. return mtxRes, errArg
  8385. }
  8386. // trendGrowth is an implementation of the formula functions GROWTH and TREND.
  8387. func (fn *formulaFuncs) trendGrowth(name string, argsList *list.List) formulaArg {
  8388. if argsList.Len() < 1 {
  8389. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at least 1 argument", name))
  8390. }
  8391. if argsList.Len() > 4 {
  8392. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s allows at most 4 arguments", name))
  8393. }
  8394. var knowY, knowX, newX [][]float64
  8395. var errArg formulaArg
  8396. constArg := newBoolFormulaArg(true)
  8397. knowY, errArg = newNumberMatrix(argsList.Front().Value.(formulaArg), false)
  8398. if errArg.Type == ArgError {
  8399. return errArg
  8400. }
  8401. if argsList.Len() > 1 {
  8402. knowX, errArg = newNumberMatrix(argsList.Front().Next().Value.(formulaArg), false)
  8403. if errArg.Type == ArgError {
  8404. return errArg
  8405. }
  8406. }
  8407. if argsList.Len() > 2 {
  8408. newX, errArg = newNumberMatrix(argsList.Front().Next().Next().Value.(formulaArg), false)
  8409. if errArg.Type == ArgError {
  8410. return errArg
  8411. }
  8412. }
  8413. if argsList.Len() > 3 {
  8414. if constArg = argsList.Back().Value.(formulaArg).ToBool(); constArg.Type != ArgNumber {
  8415. return constArg
  8416. }
  8417. }
  8418. var mtxNewX [][]float64
  8419. for i := 0; i < len(newX); i++ {
  8420. for j := 0; j < len(newX[i]); j++ {
  8421. for x := len(mtxNewX); x <= j; x++ {
  8422. mtxNewX = append(mtxNewX, []float64{})
  8423. }
  8424. for k := len(mtxNewX[j]); k <= i; k++ {
  8425. mtxNewX[j] = append(mtxNewX[j], 0)
  8426. }
  8427. mtxNewX[j][i] = newX[i][j]
  8428. }
  8429. }
  8430. mtx, errArg := calcTrendGrowth(knowY, knowX, mtxNewX, constArg.Number == 1, name == "GROWTH")
  8431. if errArg.Type != ArgEmpty {
  8432. return errArg
  8433. }
  8434. return newMatrixFormulaArg(newFormulaArgMatrix(mtx))
  8435. }
  8436. // GROWTH function calculates the exponential growth curve through a given set
  8437. // of y-values and (optionally), one or more sets of x-values. The function
  8438. // then extends the curve to calculate additional y-values for a further
  8439. // supplied set of new x-values. The syntax of the function is:
  8440. //
  8441. // GROWTH(known_y's,[known_x's],[new_x's],[const])
  8442. func (fn *formulaFuncs) GROWTH(argsList *list.List) formulaArg {
  8443. return fn.trendGrowth("GROWTH", argsList)
  8444. }
  8445. // HARMEAN function calculates the harmonic mean of a supplied set of values.
  8446. // The syntax of the function is:
  8447. //
  8448. // HARMEAN(number1,[number2],...)
  8449. func (fn *formulaFuncs) HARMEAN(argsList *list.List) formulaArg {
  8450. if argsList.Len() < 1 {
  8451. return newErrorFormulaArg(formulaErrorVALUE, "HARMEAN requires at least 1 argument")
  8452. }
  8453. if min := fn.MIN(argsList); min.Number < 0 {
  8454. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  8455. }
  8456. number, val, cnt := 0.0, 0.0, 0.0
  8457. for token := argsList.Front(); token != nil; token = token.Next() {
  8458. arg := token.Value.(formulaArg)
  8459. switch arg.Type {
  8460. case ArgString:
  8461. num := arg.ToNumber()
  8462. if num.Type != ArgNumber {
  8463. continue
  8464. }
  8465. number = num.Number
  8466. case ArgNumber:
  8467. number = arg.Number
  8468. }
  8469. if number <= 0 {
  8470. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  8471. }
  8472. val += 1 / number
  8473. cnt++
  8474. }
  8475. return newNumberFormulaArg(1 / (val / cnt))
  8476. }
  8477. // checkHYPGEOMDISTArgs checking arguments for the formula function HYPGEOMDIST
  8478. // and HYPGEOM.DIST.
  8479. func checkHYPGEOMDISTArgs(sampleS, numberSample, populationS, numberPop formulaArg) bool {
  8480. return sampleS.Number < 0 ||
  8481. sampleS.Number > math.Min(numberSample.Number, populationS.Number) ||
  8482. sampleS.Number < math.Max(0, numberSample.Number-numberPop.Number+populationS.Number) ||
  8483. numberSample.Number <= 0 ||
  8484. numberSample.Number > numberPop.Number ||
  8485. populationS.Number <= 0 ||
  8486. populationS.Number > numberPop.Number ||
  8487. numberPop.Number <= 0
  8488. }
  8489. // prepareHYPGEOMDISTArgs prepare arguments for the formula function
  8490. // HYPGEOMDIST and HYPGEOM.DIST.
  8491. func (fn *formulaFuncs) prepareHYPGEOMDISTArgs(name string, argsList *list.List) formulaArg {
  8492. if name == "HYPGEOMDIST" && argsList.Len() != 4 {
  8493. return newErrorFormulaArg(formulaErrorVALUE, "HYPGEOMDIST requires 4 numeric arguments")
  8494. }
  8495. if name == "HYPGEOM.DIST" && argsList.Len() != 5 {
  8496. return newErrorFormulaArg(formulaErrorVALUE, "HYPGEOM.DIST requires 5 arguments")
  8497. }
  8498. var sampleS, numberSample, populationS, numberPop, cumulative formulaArg
  8499. if sampleS = argsList.Front().Value.(formulaArg).ToNumber(); sampleS.Type != ArgNumber {
  8500. return sampleS
  8501. }
  8502. if numberSample = argsList.Front().Next().Value.(formulaArg).ToNumber(); numberSample.Type != ArgNumber {
  8503. return numberSample
  8504. }
  8505. if populationS = argsList.Front().Next().Next().Value.(formulaArg).ToNumber(); populationS.Type != ArgNumber {
  8506. return populationS
  8507. }
  8508. if numberPop = argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber(); numberPop.Type != ArgNumber {
  8509. return numberPop
  8510. }
  8511. if checkHYPGEOMDISTArgs(sampleS, numberSample, populationS, numberPop) {
  8512. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8513. }
  8514. if name == "HYPGEOM.DIST" {
  8515. if cumulative = argsList.Back().Value.(formulaArg).ToBool(); cumulative.Type != ArgNumber {
  8516. return cumulative
  8517. }
  8518. }
  8519. return newListFormulaArg([]formulaArg{sampleS, numberSample, populationS, numberPop, cumulative})
  8520. }
  8521. // HYPGEOMdotDIST function returns the value of the hypergeometric distribution
  8522. // for a specified number of successes from a population sample. The function
  8523. // can calculate the cumulative distribution or the probability density
  8524. // function. The syntax of the function is:
  8525. //
  8526. // HYPGEOM.DIST(sample_s,number_sample,population_s,number_pop,cumulative)
  8527. func (fn *formulaFuncs) HYPGEOMdotDIST(argsList *list.List) formulaArg {
  8528. args := fn.prepareHYPGEOMDISTArgs("HYPGEOM.DIST", argsList)
  8529. if args.Type != ArgList {
  8530. return args
  8531. }
  8532. sampleS, numberSample, populationS, numberPop, cumulative := args.List[0], args.List[1], args.List[2], args.List[3], args.List[4]
  8533. if cumulative.Number == 1 {
  8534. var res float64
  8535. for i := 0; i <= int(sampleS.Number); i++ {
  8536. res += binomCoeff(populationS.Number, float64(i)) *
  8537. binomCoeff(numberPop.Number-populationS.Number, numberSample.Number-float64(i)) /
  8538. binomCoeff(numberPop.Number, numberSample.Number)
  8539. }
  8540. return newNumberFormulaArg(res)
  8541. }
  8542. return newNumberFormulaArg(binomCoeff(populationS.Number, sampleS.Number) *
  8543. binomCoeff(numberPop.Number-populationS.Number, numberSample.Number-sampleS.Number) /
  8544. binomCoeff(numberPop.Number, numberSample.Number))
  8545. }
  8546. // HYPGEOMDIST function returns the value of the hypergeometric distribution
  8547. // for a given number of successes from a sample of a population. The syntax
  8548. // of the function is:
  8549. //
  8550. // HYPGEOMDIST(sample_s,number_sample,population_s,number_pop)
  8551. func (fn *formulaFuncs) HYPGEOMDIST(argsList *list.List) formulaArg {
  8552. args := fn.prepareHYPGEOMDISTArgs("HYPGEOMDIST", argsList)
  8553. if args.Type != ArgList {
  8554. return args
  8555. }
  8556. sampleS, numberSample, populationS, numberPop := args.List[0], args.List[1], args.List[2], args.List[3]
  8557. return newNumberFormulaArg(binomCoeff(populationS.Number, sampleS.Number) *
  8558. binomCoeff(numberPop.Number-populationS.Number, numberSample.Number-sampleS.Number) /
  8559. binomCoeff(numberPop.Number, numberSample.Number))
  8560. }
  8561. // KURT function calculates the kurtosis of a supplied set of values. The
  8562. // syntax of the function is:
  8563. //
  8564. // KURT(number1,[number2],...)
  8565. func (fn *formulaFuncs) KURT(argsList *list.List) formulaArg {
  8566. if argsList.Len() < 1 {
  8567. return newErrorFormulaArg(formulaErrorVALUE, "KURT requires at least 1 argument")
  8568. }
  8569. mean, stdev := fn.AVERAGE(argsList), fn.STDEV(argsList)
  8570. if stdev.Number > 0 {
  8571. count, summer := 0.0, 0.0
  8572. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  8573. token := arg.Value.(formulaArg)
  8574. switch token.Type {
  8575. case ArgString, ArgNumber:
  8576. num := token.ToNumber()
  8577. if num.Type == ArgError {
  8578. continue
  8579. }
  8580. summer += math.Pow((num.Number-mean.Number)/stdev.Number, 4)
  8581. count++
  8582. case ArgList, ArgMatrix:
  8583. for _, row := range token.ToList() {
  8584. if row.Type == ArgNumber || row.Type == ArgString {
  8585. num := row.ToNumber()
  8586. if num.Type == ArgError {
  8587. continue
  8588. }
  8589. summer += math.Pow((num.Number-mean.Number)/stdev.Number, 4)
  8590. count++
  8591. }
  8592. }
  8593. }
  8594. }
  8595. if count > 3 {
  8596. return newNumberFormulaArg(summer*(count*(count+1)/((count-1)*(count-2)*(count-3))) - (3 * math.Pow(count-1, 2) / ((count - 2) * (count - 3))))
  8597. }
  8598. }
  8599. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  8600. }
  8601. // EXPONdotDIST function returns the value of the exponential distribution for
  8602. // a give value of x. The user can specify whether the probability density
  8603. // function or the cumulative distribution function is used. The syntax of the
  8604. // Expondist function is:
  8605. //
  8606. // EXPON.DIST(x,lambda,cumulative)
  8607. func (fn *formulaFuncs) EXPONdotDIST(argsList *list.List) formulaArg {
  8608. if argsList.Len() != 3 {
  8609. return newErrorFormulaArg(formulaErrorVALUE, "EXPON.DIST requires 3 arguments")
  8610. }
  8611. return fn.EXPONDIST(argsList)
  8612. }
  8613. // EXPONDIST function returns the value of the exponential distribution for a
  8614. // give value of x. The user can specify whether the probability density
  8615. // function or the cumulative distribution function is used. The syntax of the
  8616. // Expondist function is:
  8617. //
  8618. // EXPONDIST(x,lambda,cumulative)
  8619. func (fn *formulaFuncs) EXPONDIST(argsList *list.List) formulaArg {
  8620. if argsList.Len() != 3 {
  8621. return newErrorFormulaArg(formulaErrorVALUE, "EXPONDIST requires 3 arguments")
  8622. }
  8623. var x, lambda, cumulative formulaArg
  8624. if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
  8625. return x
  8626. }
  8627. if lambda = argsList.Front().Next().Value.(formulaArg).ToNumber(); lambda.Type != ArgNumber {
  8628. return lambda
  8629. }
  8630. if cumulative = argsList.Back().Value.(formulaArg).ToBool(); cumulative.Type == ArgError {
  8631. return cumulative
  8632. }
  8633. if x.Number < 0 {
  8634. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8635. }
  8636. if lambda.Number <= 0 {
  8637. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8638. }
  8639. if cumulative.Number == 1 {
  8640. return newNumberFormulaArg(1 - math.Exp(-lambda.Number*x.Number))
  8641. }
  8642. return newNumberFormulaArg(lambda.Number * math.Exp(-lambda.Number*x.Number))
  8643. }
  8644. // FdotDIST function calculates the Probability Density Function or the
  8645. // Cumulative Distribution Function for the F Distribution. This function is
  8646. // frequently used to measure the degree of diversity between two data
  8647. // sets. The syntax of the function is:
  8648. //
  8649. // F.DIST(x,deg_freedom1,deg_freedom2,cumulative)
  8650. func (fn *formulaFuncs) FdotDIST(argsList *list.List) formulaArg {
  8651. if argsList.Len() != 4 {
  8652. return newErrorFormulaArg(formulaErrorVALUE, "F.DIST requires 4 arguments")
  8653. }
  8654. var x, deg1, deg2, cumulative formulaArg
  8655. if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
  8656. return x
  8657. }
  8658. if deg1 = argsList.Front().Next().Value.(formulaArg).ToNumber(); deg1.Type != ArgNumber {
  8659. return deg1
  8660. }
  8661. if deg2 = argsList.Front().Next().Next().Value.(formulaArg).ToNumber(); deg2.Type != ArgNumber {
  8662. return deg2
  8663. }
  8664. if cumulative = argsList.Back().Value.(formulaArg).ToBool(); cumulative.Type == ArgError {
  8665. return cumulative
  8666. }
  8667. if x.Number < 0 {
  8668. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8669. }
  8670. maxDeg := math.Pow10(10)
  8671. if deg1.Number < 1 || deg1.Number >= maxDeg {
  8672. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8673. }
  8674. if deg2.Number < 1 || deg2.Number >= maxDeg {
  8675. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8676. }
  8677. if cumulative.Number == 1 {
  8678. return newNumberFormulaArg(1 - getBetaDist(deg2.Number/(deg2.Number+deg1.Number*x.Number), deg2.Number/2, deg1.Number/2))
  8679. }
  8680. return newNumberFormulaArg(math.Gamma((deg2.Number+deg1.Number)/2) / (math.Gamma(deg1.Number/2) * math.Gamma(deg2.Number/2)) * math.Pow(deg1.Number/deg2.Number, deg1.Number/2) * (math.Pow(x.Number, (deg1.Number-2)/2) / math.Pow(1+(deg1.Number/deg2.Number)*x.Number, (deg1.Number+deg2.Number)/2)))
  8681. }
  8682. // FDIST function calculates the (right-tailed) F Probability Distribution,
  8683. // which measures the degree of diversity between two data sets. The syntax
  8684. // of the function is:
  8685. //
  8686. // FDIST(x,deg_freedom1,deg_freedom2)
  8687. func (fn *formulaFuncs) FDIST(argsList *list.List) formulaArg {
  8688. if argsList.Len() != 3 {
  8689. return newErrorFormulaArg(formulaErrorVALUE, "FDIST requires 3 arguments")
  8690. }
  8691. var x, deg1, deg2 formulaArg
  8692. if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
  8693. return x
  8694. }
  8695. if deg1 = argsList.Front().Next().Value.(formulaArg).ToNumber(); deg1.Type != ArgNumber {
  8696. return deg1
  8697. }
  8698. if deg2 = argsList.Back().Value.(formulaArg).ToNumber(); deg2.Type != ArgNumber {
  8699. return deg2
  8700. }
  8701. if x.Number < 0 {
  8702. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8703. }
  8704. maxDeg := math.Pow10(10)
  8705. if deg1.Number < 1 || deg1.Number >= maxDeg {
  8706. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8707. }
  8708. if deg2.Number < 1 || deg2.Number >= maxDeg {
  8709. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8710. }
  8711. args := list.New()
  8712. args.PushBack(newNumberFormulaArg(deg1.Number * x.Number / (deg1.Number*x.Number + deg2.Number)))
  8713. args.PushBack(newNumberFormulaArg(0.5 * deg1.Number))
  8714. args.PushBack(newNumberFormulaArg(0.5 * deg2.Number))
  8715. args.PushBack(newNumberFormulaArg(0))
  8716. args.PushBack(newNumberFormulaArg(1))
  8717. return newNumberFormulaArg(1 - fn.BETADIST(args).Number)
  8718. }
  8719. // FdotDISTdotRT function calculates the (right-tailed) F Probability
  8720. // Distribution, which measures the degree of diversity between two data sets.
  8721. // The syntax of the function is:
  8722. //
  8723. // F.DIST.RT(x,deg_freedom1,deg_freedom2)
  8724. func (fn *formulaFuncs) FdotDISTdotRT(argsList *list.List) formulaArg {
  8725. if argsList.Len() != 3 {
  8726. return newErrorFormulaArg(formulaErrorVALUE, "F.DIST.RT requires 3 arguments")
  8727. }
  8728. return fn.FDIST(argsList)
  8729. }
  8730. // prepareFinvArgs checking and prepare arguments for the formula function
  8731. // F.INV, F.INV.RT and FINV.
  8732. func (fn *formulaFuncs) prepareFinvArgs(name string, argsList *list.List) formulaArg {
  8733. if argsList.Len() != 3 {
  8734. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 3 arguments", name))
  8735. }
  8736. var probability, d1, d2 formulaArg
  8737. if probability = argsList.Front().Value.(formulaArg).ToNumber(); probability.Type != ArgNumber {
  8738. return probability
  8739. }
  8740. if d1 = argsList.Front().Next().Value.(formulaArg).ToNumber(); d1.Type != ArgNumber {
  8741. return d1
  8742. }
  8743. if d2 = argsList.Back().Value.(formulaArg).ToNumber(); d2.Type != ArgNumber {
  8744. return d2
  8745. }
  8746. if probability.Number <= 0 || probability.Number > 1 {
  8747. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8748. }
  8749. if d1.Number < 1 || d1.Number >= math.Pow10(10) {
  8750. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8751. }
  8752. if d2.Number < 1 || d2.Number >= math.Pow10(10) {
  8753. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8754. }
  8755. return newListFormulaArg([]formulaArg{probability, d1, d2})
  8756. }
  8757. // FdotINV function calculates the inverse of the Cumulative F Distribution
  8758. // for a supplied probability. The syntax of the F.Inv function is:
  8759. //
  8760. // F.INV(probability,deg_freedom1,deg_freedom2)
  8761. func (fn *formulaFuncs) FdotINV(argsList *list.List) formulaArg {
  8762. args := fn.prepareFinvArgs("F.INV", argsList)
  8763. if args.Type != ArgList {
  8764. return args
  8765. }
  8766. probability, d1, d2 := args.List[0], args.List[1], args.List[2]
  8767. return newNumberFormulaArg((1/calcBetainv(1-probability.Number, d2.Number/2, d1.Number/2, 0, 1) - 1) * (d2.Number / d1.Number))
  8768. }
  8769. // FdotINVdotRT function calculates the inverse of the (right-tailed) F
  8770. // Probability Distribution for a supplied probability. The syntax of the
  8771. // function is:
  8772. //
  8773. // F.INV.RT(probability,deg_freedom1,deg_freedom2)
  8774. func (fn *formulaFuncs) FdotINVdotRT(argsList *list.List) formulaArg {
  8775. args := fn.prepareFinvArgs("F.INV.RT", argsList)
  8776. if args.Type != ArgList {
  8777. return args
  8778. }
  8779. probability, d1, d2 := args.List[0], args.List[1], args.List[2]
  8780. return newNumberFormulaArg((1/calcBetainv(1-(1-probability.Number), d2.Number/2, d1.Number/2, 0, 1) - 1) * (d2.Number / d1.Number))
  8781. }
  8782. // FINV function calculates the inverse of the (right-tailed) F Probability
  8783. // Distribution for a supplied probability. The syntax of the function is:
  8784. //
  8785. // FINV(probability,deg_freedom1,deg_freedom2)
  8786. func (fn *formulaFuncs) FINV(argsList *list.List) formulaArg {
  8787. args := fn.prepareFinvArgs("FINV", argsList)
  8788. if args.Type != ArgList {
  8789. return args
  8790. }
  8791. probability, d1, d2 := args.List[0], args.List[1], args.List[2]
  8792. return newNumberFormulaArg((1/calcBetainv(1-(1-probability.Number), d2.Number/2, d1.Number/2, 0, 1) - 1) * (d2.Number / d1.Number))
  8793. }
  8794. // FdotTEST function returns the F-Test for two supplied arrays. I.e. the
  8795. // function returns the two-tailed probability that the variances in the two
  8796. // supplied arrays are not significantly different. The syntax of the Ftest
  8797. // function is:
  8798. //
  8799. // F.TEST(array1,array2)
  8800. func (fn *formulaFuncs) FdotTEST(argsList *list.List) formulaArg {
  8801. if argsList.Len() != 2 {
  8802. return newErrorFormulaArg(formulaErrorVALUE, "F.TEST requires 2 arguments")
  8803. }
  8804. array1 := argsList.Front().Value.(formulaArg)
  8805. array2 := argsList.Back().Value.(formulaArg)
  8806. left, right := array1.ToList(), array2.ToList()
  8807. collectMatrix := func(args []formulaArg) (n, accu float64) {
  8808. var p, sum float64
  8809. for _, arg := range args {
  8810. if num := arg.ToNumber(); num.Type == ArgNumber {
  8811. x := num.Number - p
  8812. y := x / (n + 1)
  8813. p += y
  8814. accu += n * x * y
  8815. n++
  8816. sum += num.Number
  8817. }
  8818. }
  8819. return
  8820. }
  8821. nums, accu := collectMatrix(left)
  8822. f3 := nums - 1
  8823. if nums == 1 {
  8824. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  8825. }
  8826. f1 := accu / (nums - 1)
  8827. if f1 == 0 {
  8828. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  8829. }
  8830. nums, accu = collectMatrix(right)
  8831. f4 := nums - 1
  8832. if nums == 1 {
  8833. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  8834. }
  8835. f2 := accu / (nums - 1)
  8836. if f2 == 0 {
  8837. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  8838. }
  8839. args := list.New()
  8840. args.PushBack(newNumberFormulaArg(f1 / f2))
  8841. args.PushBack(newNumberFormulaArg(f3))
  8842. args.PushBack(newNumberFormulaArg(f4))
  8843. probability := (1 - fn.FDIST(args).Number) * 2
  8844. if probability > 1 {
  8845. probability = 2 - probability
  8846. }
  8847. return newNumberFormulaArg(probability)
  8848. }
  8849. // FTEST function returns the F-Test for two supplied arrays. I.e. the function
  8850. // returns the two-tailed probability that the variances in the two supplied
  8851. // arrays are not significantly different. The syntax of the Ftest function
  8852. // is:
  8853. //
  8854. // FTEST(array1,array2)
  8855. func (fn *formulaFuncs) FTEST(argsList *list.List) formulaArg {
  8856. if argsList.Len() != 2 {
  8857. return newErrorFormulaArg(formulaErrorVALUE, "FTEST requires 2 arguments")
  8858. }
  8859. return fn.FdotTEST(argsList)
  8860. }
  8861. // LOGINV function calculates the inverse of the Cumulative Log-Normal
  8862. // Distribution Function of x, for a supplied probability. The syntax of the
  8863. // function is:
  8864. //
  8865. // LOGINV(probability,mean,standard_dev)
  8866. func (fn *formulaFuncs) LOGINV(argsList *list.List) formulaArg {
  8867. if argsList.Len() != 3 {
  8868. return newErrorFormulaArg(formulaErrorVALUE, "LOGINV requires 3 arguments")
  8869. }
  8870. var probability, mean, stdDev formulaArg
  8871. if probability = argsList.Front().Value.(formulaArg).ToNumber(); probability.Type != ArgNumber {
  8872. return probability
  8873. }
  8874. if mean = argsList.Front().Next().Value.(formulaArg).ToNumber(); mean.Type != ArgNumber {
  8875. return mean
  8876. }
  8877. if stdDev = argsList.Back().Value.(formulaArg).ToNumber(); stdDev.Type != ArgNumber {
  8878. return stdDev
  8879. }
  8880. if probability.Number <= 0 || probability.Number >= 1 {
  8881. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8882. }
  8883. if stdDev.Number <= 0 {
  8884. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8885. }
  8886. args := list.New()
  8887. args.PushBack(probability)
  8888. args.PushBack(newNumberFormulaArg(0))
  8889. args.PushBack(newNumberFormulaArg(1))
  8890. norminv := fn.NORMINV(args)
  8891. return newNumberFormulaArg(math.Exp(mean.Number + stdDev.Number*norminv.Number))
  8892. }
  8893. // LOGNORMdotINV function calculates the inverse of the Cumulative Log-Normal
  8894. // Distribution Function of x, for a supplied probability. The syntax of the
  8895. // function is:
  8896. //
  8897. // LOGNORM.INV(probability,mean,standard_dev)
  8898. func (fn *formulaFuncs) LOGNORMdotINV(argsList *list.List) formulaArg {
  8899. if argsList.Len() != 3 {
  8900. return newErrorFormulaArg(formulaErrorVALUE, "LOGNORM.INV requires 3 arguments")
  8901. }
  8902. return fn.LOGINV(argsList)
  8903. }
  8904. // LOGNORMdotDIST function calculates the Log-Normal Probability Density
  8905. // Function or the Cumulative Log-Normal Distribution Function for a supplied
  8906. // value of x. The syntax of the function is:
  8907. //
  8908. // LOGNORM.DIST(x,mean,standard_dev,cumulative)
  8909. func (fn *formulaFuncs) LOGNORMdotDIST(argsList *list.List) formulaArg {
  8910. if argsList.Len() != 4 {
  8911. return newErrorFormulaArg(formulaErrorVALUE, "LOGNORM.DIST requires 4 arguments")
  8912. }
  8913. var x, mean, stdDev, cumulative formulaArg
  8914. if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
  8915. return x
  8916. }
  8917. if mean = argsList.Front().Next().Value.(formulaArg).ToNumber(); mean.Type != ArgNumber {
  8918. return mean
  8919. }
  8920. if stdDev = argsList.Back().Prev().Value.(formulaArg).ToNumber(); stdDev.Type != ArgNumber {
  8921. return stdDev
  8922. }
  8923. if cumulative = argsList.Back().Value.(formulaArg).ToBool(); cumulative.Type == ArgError {
  8924. return cumulative
  8925. }
  8926. if x.Number <= 0 || stdDev.Number <= 0 {
  8927. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8928. }
  8929. if cumulative.Number == 1 {
  8930. args := list.New()
  8931. args.PushBack(newNumberFormulaArg((math.Log(x.Number) - mean.Number) / stdDev.Number))
  8932. args.PushBack(newNumberFormulaArg(0))
  8933. args.PushBack(newNumberFormulaArg(1))
  8934. args.PushBack(cumulative)
  8935. return fn.NORMDIST(args)
  8936. }
  8937. return newNumberFormulaArg((1 / (math.Sqrt(2*math.Pi) * stdDev.Number * x.Number)) *
  8938. math.Exp(0-(math.Pow(math.Log(x.Number)-mean.Number, 2)/(2*math.Pow(stdDev.Number, 2)))))
  8939. }
  8940. // LOGNORMDIST function calculates the Cumulative Log-Normal Distribution
  8941. // Function at a supplied value of x. The syntax of the function is:
  8942. //
  8943. // LOGNORMDIST(x,mean,standard_dev)
  8944. func (fn *formulaFuncs) LOGNORMDIST(argsList *list.List) formulaArg {
  8945. if argsList.Len() != 3 {
  8946. return newErrorFormulaArg(formulaErrorVALUE, "LOGNORMDIST requires 3 arguments")
  8947. }
  8948. var x, mean, stdDev formulaArg
  8949. if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
  8950. return x
  8951. }
  8952. if mean = argsList.Front().Next().Value.(formulaArg).ToNumber(); mean.Type != ArgNumber {
  8953. return mean
  8954. }
  8955. if stdDev = argsList.Back().Value.(formulaArg).ToNumber(); stdDev.Type != ArgNumber {
  8956. return stdDev
  8957. }
  8958. if x.Number <= 0 || stdDev.Number <= 0 {
  8959. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  8960. }
  8961. args := list.New()
  8962. args.PushBack(newNumberFormulaArg((math.Log(x.Number) - mean.Number) / stdDev.Number))
  8963. return fn.NORMSDIST(args)
  8964. }
  8965. // MODE function returns the statistical mode (the most frequently occurring
  8966. // value) of a list of supplied numbers. If there are 2 or more most
  8967. // frequently occurring values in the supplied data, the function returns the
  8968. // lowest of these values The syntax of the function is:
  8969. //
  8970. // MODE(number1,[number2],...)
  8971. func (fn *formulaFuncs) MODE(argsList *list.List) formulaArg {
  8972. if argsList.Len() < 1 {
  8973. return newErrorFormulaArg(formulaErrorVALUE, "MODE requires at least 1 argument")
  8974. }
  8975. var values []float64
  8976. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  8977. cells := arg.Value.(formulaArg)
  8978. if cells.Type != ArgMatrix && cells.Type != ArgNumber {
  8979. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  8980. }
  8981. for _, cell := range cells.ToList() {
  8982. if cell.Type == ArgNumber {
  8983. values = append(values, cell.Number)
  8984. }
  8985. }
  8986. }
  8987. sort.Float64s(values)
  8988. cnt := len(values)
  8989. var count, modeCnt int
  8990. var mode float64
  8991. for i := 0; i < cnt; i++ {
  8992. count = 0
  8993. for j := 0; j < cnt; j++ {
  8994. if j != i && values[j] == values[i] {
  8995. count++
  8996. }
  8997. }
  8998. if count > modeCnt {
  8999. modeCnt = count
  9000. mode = values[i]
  9001. }
  9002. }
  9003. if modeCnt == 0 {
  9004. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  9005. }
  9006. return newNumberFormulaArg(mode)
  9007. }
  9008. // MODEdotMULT function returns a vertical array of the statistical modes
  9009. // (the most frequently occurring values) within a list of supplied numbers.
  9010. // The syntax of the function is:
  9011. //
  9012. // MODE.MULT(number1,[number2],...)
  9013. func (fn *formulaFuncs) MODEdotMULT(argsList *list.List) formulaArg {
  9014. if argsList.Len() < 1 {
  9015. return newErrorFormulaArg(formulaErrorVALUE, "MODE.MULT requires at least 1 argument")
  9016. }
  9017. var values []float64
  9018. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  9019. cells := arg.Value.(formulaArg)
  9020. if cells.Type != ArgMatrix && cells.Type != ArgNumber {
  9021. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  9022. }
  9023. for _, cell := range cells.ToList() {
  9024. if cell.Type == ArgNumber {
  9025. values = append(values, cell.Number)
  9026. }
  9027. }
  9028. }
  9029. sort.Float64s(values)
  9030. cnt := len(values)
  9031. var count, modeCnt int
  9032. var mtx [][]formulaArg
  9033. for i := 0; i < cnt; i++ {
  9034. count = 0
  9035. for j := i + 1; j < cnt; j++ {
  9036. if values[i] == values[j] {
  9037. count++
  9038. }
  9039. }
  9040. if count > modeCnt {
  9041. modeCnt = count
  9042. mtx = [][]formulaArg{}
  9043. mtx = append(mtx, []formulaArg{newNumberFormulaArg(values[i])})
  9044. } else if count == modeCnt {
  9045. mtx = append(mtx, []formulaArg{newNumberFormulaArg(values[i])})
  9046. }
  9047. }
  9048. if modeCnt == 0 {
  9049. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  9050. }
  9051. return newMatrixFormulaArg(mtx)
  9052. }
  9053. // MODEdotSNGL function returns the statistical mode (the most frequently
  9054. // occurring value) within a list of supplied numbers. If there are 2 or more
  9055. // most frequently occurring values in the supplied data, the function returns
  9056. // the lowest of these values. The syntax of the function is:
  9057. //
  9058. // MODE.SNGL(number1,[number2],...)
  9059. func (fn *formulaFuncs) MODEdotSNGL(argsList *list.List) formulaArg {
  9060. if argsList.Len() < 1 {
  9061. return newErrorFormulaArg(formulaErrorVALUE, "MODE.SNGL requires at least 1 argument")
  9062. }
  9063. return fn.MODE(argsList)
  9064. }
  9065. // NEGBINOMdotDIST function calculates the probability mass function or the
  9066. // cumulative distribution function for the Negative Binomial Distribution.
  9067. // This gives the probability that there will be a given number of failures
  9068. // before a required number of successes is achieved. The syntax of the
  9069. // function is:
  9070. //
  9071. // NEGBINOM.DIST(number_f,number_s,probability_s,cumulative)
  9072. func (fn *formulaFuncs) NEGBINOMdotDIST(argsList *list.List) formulaArg {
  9073. if argsList.Len() != 4 {
  9074. return newErrorFormulaArg(formulaErrorVALUE, "NEGBINOM.DIST requires 4 arguments")
  9075. }
  9076. var f, s, probability, cumulative formulaArg
  9077. if f = argsList.Front().Value.(formulaArg).ToNumber(); f.Type != ArgNumber {
  9078. return f
  9079. }
  9080. if s = argsList.Front().Next().Value.(formulaArg).ToNumber(); s.Type != ArgNumber {
  9081. return s
  9082. }
  9083. if probability = argsList.Front().Next().Next().Value.(formulaArg).ToNumber(); probability.Type != ArgNumber {
  9084. return probability
  9085. }
  9086. if cumulative = argsList.Back().Value.(formulaArg).ToBool(); cumulative.Type != ArgNumber {
  9087. return cumulative
  9088. }
  9089. if f.Number < 0 || s.Number < 1 || probability.Number < 0 || probability.Number > 1 {
  9090. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  9091. }
  9092. if cumulative.Number == 1 {
  9093. return newNumberFormulaArg(1 - getBetaDist(1-probability.Number, f.Number+1, s.Number))
  9094. }
  9095. return newNumberFormulaArg(binomCoeff(f.Number+s.Number-1, s.Number-1) * math.Pow(probability.Number, s.Number) * math.Pow(1-probability.Number, f.Number))
  9096. }
  9097. // NEGBINOMDIST function calculates the Negative Binomial Distribution for a
  9098. // given set of parameters. This gives the probability that there will be a
  9099. // specified number of failures before a required number of successes is
  9100. // achieved. The syntax of the function is:
  9101. //
  9102. // NEGBINOMDIST(number_f,number_s,probability_s)
  9103. func (fn *formulaFuncs) NEGBINOMDIST(argsList *list.List) formulaArg {
  9104. if argsList.Len() != 3 {
  9105. return newErrorFormulaArg(formulaErrorVALUE, "NEGBINOMDIST requires 3 arguments")
  9106. }
  9107. var f, s, probability formulaArg
  9108. if f = argsList.Front().Value.(formulaArg).ToNumber(); f.Type != ArgNumber {
  9109. return f
  9110. }
  9111. if s = argsList.Front().Next().Value.(formulaArg).ToNumber(); s.Type != ArgNumber {
  9112. return s
  9113. }
  9114. if probability = argsList.Back().Value.(formulaArg).ToNumber(); probability.Type != ArgNumber {
  9115. return probability
  9116. }
  9117. if f.Number < 0 || s.Number < 1 || probability.Number < 0 || probability.Number > 1 {
  9118. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  9119. }
  9120. return newNumberFormulaArg(binomCoeff(f.Number+s.Number-1, s.Number-1) * math.Pow(probability.Number, s.Number) * math.Pow(1-probability.Number, f.Number))
  9121. }
  9122. // NORMdotDIST function calculates the Normal Probability Density Function or
  9123. // the Cumulative Normal Distribution. Function for a supplied set of
  9124. // parameters. The syntax of the function is:
  9125. //
  9126. // NORM.DIST(x,mean,standard_dev,cumulative)
  9127. func (fn *formulaFuncs) NORMdotDIST(argsList *list.List) formulaArg {
  9128. if argsList.Len() != 4 {
  9129. return newErrorFormulaArg(formulaErrorVALUE, "NORM.DIST requires 4 arguments")
  9130. }
  9131. return fn.NORMDIST(argsList)
  9132. }
  9133. // NORMDIST function calculates the Normal Probability Density Function or the
  9134. // Cumulative Normal Distribution. Function for a supplied set of parameters.
  9135. // The syntax of the function is:
  9136. //
  9137. // NORMDIST(x,mean,standard_dev,cumulative)
  9138. func (fn *formulaFuncs) NORMDIST(argsList *list.List) formulaArg {
  9139. if argsList.Len() != 4 {
  9140. return newErrorFormulaArg(formulaErrorVALUE, "NORMDIST requires 4 arguments")
  9141. }
  9142. var x, mean, stdDev, cumulative formulaArg
  9143. if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
  9144. return x
  9145. }
  9146. if mean = argsList.Front().Next().Value.(formulaArg).ToNumber(); mean.Type != ArgNumber {
  9147. return mean
  9148. }
  9149. if stdDev = argsList.Back().Prev().Value.(formulaArg).ToNumber(); stdDev.Type != ArgNumber {
  9150. return stdDev
  9151. }
  9152. if cumulative = argsList.Back().Value.(formulaArg).ToBool(); cumulative.Type == ArgError {
  9153. return cumulative
  9154. }
  9155. if stdDev.Number < 0 {
  9156. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  9157. }
  9158. if cumulative.Number == 1 {
  9159. return newNumberFormulaArg(0.5 * (1 + math.Erf((x.Number-mean.Number)/(stdDev.Number*math.Sqrt(2)))))
  9160. }
  9161. return newNumberFormulaArg((1 / (math.Sqrt(2*math.Pi) * stdDev.Number)) * math.Exp(0-(math.Pow(x.Number-mean.Number, 2)/(2*(stdDev.Number*stdDev.Number)))))
  9162. }
  9163. // NORMdotINV function calculates the inverse of the Cumulative Normal
  9164. // Distribution Function for a supplied value of x, and a supplied
  9165. // distribution mean & standard deviation. The syntax of the function is:
  9166. //
  9167. // NORM.INV(probability,mean,standard_dev)
  9168. func (fn *formulaFuncs) NORMdotINV(argsList *list.List) formulaArg {
  9169. if argsList.Len() != 3 {
  9170. return newErrorFormulaArg(formulaErrorVALUE, "NORM.INV requires 3 arguments")
  9171. }
  9172. return fn.NORMINV(argsList)
  9173. }
  9174. // NORMINV function calculates the inverse of the Cumulative Normal
  9175. // Distribution Function for a supplied value of x, and a supplied
  9176. // distribution mean & standard deviation. The syntax of the function is:
  9177. //
  9178. // NORMINV(probability,mean,standard_dev)
  9179. func (fn *formulaFuncs) NORMINV(argsList *list.List) formulaArg {
  9180. if argsList.Len() != 3 {
  9181. return newErrorFormulaArg(formulaErrorVALUE, "NORMINV requires 3 arguments")
  9182. }
  9183. var prob, mean, stdDev formulaArg
  9184. if prob = argsList.Front().Value.(formulaArg).ToNumber(); prob.Type != ArgNumber {
  9185. return prob
  9186. }
  9187. if mean = argsList.Front().Next().Value.(formulaArg).ToNumber(); mean.Type != ArgNumber {
  9188. return mean
  9189. }
  9190. if stdDev = argsList.Back().Value.(formulaArg).ToNumber(); stdDev.Type != ArgNumber {
  9191. return stdDev
  9192. }
  9193. if prob.Number < 0 || prob.Number > 1 {
  9194. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  9195. }
  9196. if stdDev.Number < 0 {
  9197. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  9198. }
  9199. inv, err := norminv(prob.Number)
  9200. if err != nil {
  9201. return newErrorFormulaArg(err.Error(), err.Error())
  9202. }
  9203. return newNumberFormulaArg(inv*stdDev.Number + mean.Number)
  9204. }
  9205. // NORMdotSdotDIST function calculates the Standard Normal Cumulative
  9206. // Distribution Function for a supplied value. The syntax of the function
  9207. // is:
  9208. //
  9209. // NORM.S.DIST(z)
  9210. func (fn *formulaFuncs) NORMdotSdotDIST(argsList *list.List) formulaArg {
  9211. if argsList.Len() != 2 {
  9212. return newErrorFormulaArg(formulaErrorVALUE, "NORM.S.DIST requires 2 numeric arguments")
  9213. }
  9214. args := list.New().Init()
  9215. args.PushBack(argsList.Front().Value.(formulaArg))
  9216. args.PushBack(formulaArg{Type: ArgNumber, Number: 0})
  9217. args.PushBack(formulaArg{Type: ArgNumber, Number: 1})
  9218. args.PushBack(argsList.Back().Value.(formulaArg))
  9219. return fn.NORMDIST(args)
  9220. }
  9221. // NORMSDIST function calculates the Standard Normal Cumulative Distribution
  9222. // Function for a supplied value. The syntax of the function is:
  9223. //
  9224. // NORMSDIST(z)
  9225. func (fn *formulaFuncs) NORMSDIST(argsList *list.List) formulaArg {
  9226. if argsList.Len() != 1 {
  9227. return newErrorFormulaArg(formulaErrorVALUE, "NORMSDIST requires 1 numeric argument")
  9228. }
  9229. args := list.New().Init()
  9230. args.PushBack(argsList.Front().Value.(formulaArg))
  9231. args.PushBack(formulaArg{Type: ArgNumber, Number: 0})
  9232. args.PushBack(formulaArg{Type: ArgNumber, Number: 1})
  9233. args.PushBack(formulaArg{Type: ArgNumber, Number: 1, Boolean: true})
  9234. return fn.NORMDIST(args)
  9235. }
  9236. // NORMSINV function calculates the inverse of the Standard Normal Cumulative
  9237. // Distribution Function for a supplied probability value. The syntax of the
  9238. // function is:
  9239. //
  9240. // NORMSINV(probability)
  9241. func (fn *formulaFuncs) NORMSINV(argsList *list.List) formulaArg {
  9242. if argsList.Len() != 1 {
  9243. return newErrorFormulaArg(formulaErrorVALUE, "NORMSINV requires 1 numeric argument")
  9244. }
  9245. args := list.New().Init()
  9246. args.PushBack(argsList.Front().Value.(formulaArg))
  9247. args.PushBack(formulaArg{Type: ArgNumber, Number: 0})
  9248. args.PushBack(formulaArg{Type: ArgNumber, Number: 1})
  9249. return fn.NORMINV(args)
  9250. }
  9251. // NORMdotSdotINV function calculates the inverse of the Standard Normal
  9252. // Cumulative Distribution Function for a supplied probability value. The
  9253. // syntax of the function is:
  9254. //
  9255. // NORM.S.INV(probability)
  9256. func (fn *formulaFuncs) NORMdotSdotINV(argsList *list.List) formulaArg {
  9257. if argsList.Len() != 1 {
  9258. return newErrorFormulaArg(formulaErrorVALUE, "NORM.S.INV requires 1 numeric argument")
  9259. }
  9260. args := list.New().Init()
  9261. args.PushBack(argsList.Front().Value.(formulaArg))
  9262. args.PushBack(formulaArg{Type: ArgNumber, Number: 0})
  9263. args.PushBack(formulaArg{Type: ArgNumber, Number: 1})
  9264. return fn.NORMINV(args)
  9265. }
  9266. // norminv returns the inverse of the normal cumulative distribution for the
  9267. // specified value.
  9268. func norminv(p float64) (float64, error) {
  9269. a := map[int]float64{
  9270. 1: -3.969683028665376e+01, 2: 2.209460984245205e+02, 3: -2.759285104469687e+02,
  9271. 4: 1.383577518672690e+02, 5: -3.066479806614716e+01, 6: 2.506628277459239e+00,
  9272. }
  9273. b := map[int]float64{
  9274. 1: -5.447609879822406e+01, 2: 1.615858368580409e+02, 3: -1.556989798598866e+02,
  9275. 4: 6.680131188771972e+01, 5: -1.328068155288572e+01,
  9276. }
  9277. c := map[int]float64{
  9278. 1: -7.784894002430293e-03, 2: -3.223964580411365e-01, 3: -2.400758277161838e+00,
  9279. 4: -2.549732539343734e+00, 5: 4.374664141464968e+00, 6: 2.938163982698783e+00,
  9280. }
  9281. d := map[int]float64{
  9282. 1: 7.784695709041462e-03, 2: 3.224671290700398e-01, 3: 2.445134137142996e+00,
  9283. 4: 3.754408661907416e+00,
  9284. }
  9285. pLow := 0.02425 // Use lower region approx. below this
  9286. pHigh := 1 - pLow // Use upper region approx. above this
  9287. if 0 < p && p < pLow {
  9288. // Rational approximation for lower region.
  9289. q := math.Sqrt(-2 * math.Log(p))
  9290. return (((((c[1]*q+c[2])*q+c[3])*q+c[4])*q+c[5])*q + c[6]) /
  9291. ((((d[1]*q+d[2])*q+d[3])*q+d[4])*q + 1), nil
  9292. } else if pLow <= p && p <= pHigh {
  9293. // Rational approximation for central region.
  9294. q := p - 0.5
  9295. r := q * q
  9296. f1 := ((((a[1]*r+a[2])*r+a[3])*r+a[4])*r + a[5]) * r
  9297. f2 := (b[1]*r + b[2]) * r
  9298. f3 := ((math.Nextafter(f2, f2)+b[3])*r + b[4]) * r
  9299. f4 := (math.Nextafter(f3, f3) + b[5]) * r
  9300. return (math.Nextafter(f1, f1) + a[6]) * q /
  9301. (math.Nextafter(f4, f4) + 1), nil
  9302. } else if pHigh < p && p < 1 {
  9303. // Rational approximation for upper region.
  9304. q := math.Sqrt(-2 * math.Log(1-p))
  9305. return -(((((c[1]*q+c[2])*q+c[3])*q+c[4])*q+c[5])*q + c[6]) /
  9306. ((((d[1]*q+d[2])*q+d[3])*q+d[4])*q + 1), nil
  9307. }
  9308. return 0, errors.New(formulaErrorNUM)
  9309. }
  9310. // kth is an implementation of the formula functions LARGE and SMALL.
  9311. func (fn *formulaFuncs) kth(name string, argsList *list.List) formulaArg {
  9312. if argsList.Len() != 2 {
  9313. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 2 arguments", name))
  9314. }
  9315. array := argsList.Front().Value.(formulaArg).ToList()
  9316. argK := argsList.Back().Value.(formulaArg).ToNumber()
  9317. if argK.Type != ArgNumber {
  9318. return argK
  9319. }
  9320. k := int(argK.Number)
  9321. if k < 1 {
  9322. return newErrorFormulaArg(formulaErrorNUM, "k should be > 0")
  9323. }
  9324. var data []float64
  9325. for _, arg := range array {
  9326. if arg.Type == ArgNumber {
  9327. data = append(data, arg.Number)
  9328. }
  9329. }
  9330. if len(data) < k {
  9331. return newErrorFormulaArg(formulaErrorNUM, "k should be <= length of array")
  9332. }
  9333. sort.Float64s(data)
  9334. if name == "LARGE" {
  9335. return newNumberFormulaArg(data[len(data)-k])
  9336. }
  9337. return newNumberFormulaArg(data[k-1])
  9338. }
  9339. // LARGE function returns the k'th largest value from an array of numeric
  9340. // values. The syntax of the function is:
  9341. //
  9342. // LARGE(array,k)
  9343. func (fn *formulaFuncs) LARGE(argsList *list.List) formulaArg {
  9344. return fn.kth("LARGE", argsList)
  9345. }
  9346. // MAX function returns the largest value from a supplied set of numeric
  9347. // values. The syntax of the function is:
  9348. //
  9349. // MAX(number1,[number2],...)
  9350. func (fn *formulaFuncs) MAX(argsList *list.List) formulaArg {
  9351. if argsList.Len() == 0 {
  9352. return newErrorFormulaArg(formulaErrorVALUE, "MAX requires at least 1 argument")
  9353. }
  9354. return fn.max(false, argsList)
  9355. }
  9356. // MAXA function returns the largest value from a supplied set of numeric
  9357. // values, while counting text and the logical value FALSE as the value 0 and
  9358. // counting the logical value TRUE as the value 1. The syntax of the function
  9359. // is:
  9360. //
  9361. // MAXA(number1,[number2],...)
  9362. func (fn *formulaFuncs) MAXA(argsList *list.List) formulaArg {
  9363. if argsList.Len() == 0 {
  9364. return newErrorFormulaArg(formulaErrorVALUE, "MAXA requires at least 1 argument")
  9365. }
  9366. return fn.max(true, argsList)
  9367. }
  9368. // MAXIFS function returns the maximum value from a subset of values that are
  9369. // specified according to one or more criteria. The syntax of the function
  9370. // is:
  9371. //
  9372. // MAXIFS(max_range,criteria_range1,criteria1,[criteria_range2,criteria2],...)
  9373. func (fn *formulaFuncs) MAXIFS(argsList *list.List) formulaArg {
  9374. if argsList.Len() < 3 {
  9375. return newErrorFormulaArg(formulaErrorVALUE, "MAXIFS requires at least 3 arguments")
  9376. }
  9377. if argsList.Len()%2 != 1 {
  9378. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  9379. }
  9380. var args []formulaArg
  9381. max, maxRange := -math.MaxFloat64, argsList.Front().Value.(formulaArg).Matrix
  9382. for arg := argsList.Front().Next(); arg != nil; arg = arg.Next() {
  9383. args = append(args, arg.Value.(formulaArg))
  9384. }
  9385. for _, ref := range formulaIfsMatch(args) {
  9386. if num := maxRange[ref.Row][ref.Col].ToNumber(); num.Type == ArgNumber && max < num.Number {
  9387. max = num.Number
  9388. }
  9389. }
  9390. if max == -math.MaxFloat64 {
  9391. max = 0
  9392. }
  9393. return newNumberFormulaArg(max)
  9394. }
  9395. // calcListMatrixMax is part of the implementation max.
  9396. func calcListMatrixMax(maxa bool, max float64, arg formulaArg) float64 {
  9397. for _, cell := range arg.ToList() {
  9398. if cell.Type == ArgNumber && cell.Number > max {
  9399. if maxa && cell.Boolean || !cell.Boolean {
  9400. max = cell.Number
  9401. }
  9402. }
  9403. }
  9404. return max
  9405. }
  9406. // max is an implementation of the formula functions MAX and MAXA.
  9407. func (fn *formulaFuncs) max(maxa bool, argsList *list.List) formulaArg {
  9408. max := -math.MaxFloat64
  9409. for token := argsList.Front(); token != nil; token = token.Next() {
  9410. arg := token.Value.(formulaArg)
  9411. switch arg.Type {
  9412. case ArgString:
  9413. if !maxa && (arg.Value() == "TRUE" || arg.Value() == "FALSE") {
  9414. continue
  9415. } else {
  9416. num := arg.ToBool()
  9417. if num.Type == ArgNumber && num.Number > max {
  9418. max = num.Number
  9419. continue
  9420. }
  9421. }
  9422. num := arg.ToNumber()
  9423. if num.Type != ArgError && num.Number > max {
  9424. max = num.Number
  9425. }
  9426. case ArgNumber:
  9427. if arg.Number > max {
  9428. max = arg.Number
  9429. }
  9430. case ArgList, ArgMatrix:
  9431. max = calcListMatrixMax(maxa, max, arg)
  9432. case ArgError:
  9433. return arg
  9434. }
  9435. }
  9436. if max == -math.MaxFloat64 {
  9437. max = 0
  9438. }
  9439. return newNumberFormulaArg(max)
  9440. }
  9441. // MEDIAN function returns the statistical median (the middle value) of a list
  9442. // of supplied numbers. The syntax of the function is:
  9443. //
  9444. // MEDIAN(number1,[number2],...)
  9445. func (fn *formulaFuncs) MEDIAN(argsList *list.List) formulaArg {
  9446. if argsList.Len() == 0 {
  9447. return newErrorFormulaArg(formulaErrorVALUE, "MEDIAN requires at least 1 argument")
  9448. }
  9449. var values []float64
  9450. var median float64
  9451. for token := argsList.Front(); token != nil; token = token.Next() {
  9452. arg := token.Value.(formulaArg)
  9453. switch arg.Type {
  9454. case ArgString:
  9455. value := arg.ToNumber()
  9456. if value.Type != ArgNumber {
  9457. return value
  9458. }
  9459. values = append(values, value.Number)
  9460. case ArgNumber:
  9461. values = append(values, arg.Number)
  9462. case ArgMatrix:
  9463. for _, row := range arg.Matrix {
  9464. for _, cell := range row {
  9465. if cell.Type == ArgNumber {
  9466. values = append(values, cell.Number)
  9467. }
  9468. }
  9469. }
  9470. }
  9471. }
  9472. if len(values) == 0 {
  9473. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  9474. }
  9475. sort.Float64s(values)
  9476. if len(values)%2 == 0 {
  9477. median = (values[len(values)/2-1] + values[len(values)/2]) / 2
  9478. } else {
  9479. median = values[len(values)/2]
  9480. }
  9481. return newNumberFormulaArg(median)
  9482. }
  9483. // MIN function returns the smallest value from a supplied set of numeric
  9484. // values. The syntax of the function is:
  9485. //
  9486. // MIN(number1,[number2],...)
  9487. func (fn *formulaFuncs) MIN(argsList *list.List) formulaArg {
  9488. if argsList.Len() == 0 {
  9489. return newErrorFormulaArg(formulaErrorVALUE, "MIN requires at least 1 argument")
  9490. }
  9491. return fn.min(false, argsList)
  9492. }
  9493. // MINA function returns the smallest value from a supplied set of numeric
  9494. // values, while counting text and the logical value FALSE as the value 0 and
  9495. // counting the logical value TRUE as the value 1. The syntax of the function
  9496. // is:
  9497. //
  9498. // MINA(number1,[number2],...)
  9499. func (fn *formulaFuncs) MINA(argsList *list.List) formulaArg {
  9500. if argsList.Len() == 0 {
  9501. return newErrorFormulaArg(formulaErrorVALUE, "MINA requires at least 1 argument")
  9502. }
  9503. return fn.min(true, argsList)
  9504. }
  9505. // MINIFS function returns the minimum value from a subset of values that are
  9506. // specified according to one or more criteria. The syntax of the function
  9507. // is:
  9508. //
  9509. // MINIFS(min_range,criteria_range1,criteria1,[criteria_range2,criteria2],...)
  9510. func (fn *formulaFuncs) MINIFS(argsList *list.List) formulaArg {
  9511. if argsList.Len() < 3 {
  9512. return newErrorFormulaArg(formulaErrorVALUE, "MINIFS requires at least 3 arguments")
  9513. }
  9514. if argsList.Len()%2 != 1 {
  9515. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  9516. }
  9517. var args []formulaArg
  9518. min, minRange := math.MaxFloat64, argsList.Front().Value.(formulaArg).Matrix
  9519. for arg := argsList.Front().Next(); arg != nil; arg = arg.Next() {
  9520. args = append(args, arg.Value.(formulaArg))
  9521. }
  9522. for _, ref := range formulaIfsMatch(args) {
  9523. if num := minRange[ref.Row][ref.Col].ToNumber(); num.Type == ArgNumber && min > num.Number {
  9524. min = num.Number
  9525. }
  9526. }
  9527. if min == math.MaxFloat64 {
  9528. min = 0
  9529. }
  9530. return newNumberFormulaArg(min)
  9531. }
  9532. // calcListMatrixMin is part of the implementation min.
  9533. func calcListMatrixMin(mina bool, min float64, arg formulaArg) float64 {
  9534. for _, cell := range arg.ToList() {
  9535. if cell.Type == ArgNumber && cell.Number < min {
  9536. if mina && cell.Boolean || !cell.Boolean {
  9537. min = cell.Number
  9538. }
  9539. }
  9540. }
  9541. return min
  9542. }
  9543. // min is an implementation of the formula functions MIN and MINA.
  9544. func (fn *formulaFuncs) min(mina bool, argsList *list.List) formulaArg {
  9545. min := math.MaxFloat64
  9546. for token := argsList.Front(); token != nil; token = token.Next() {
  9547. arg := token.Value.(formulaArg)
  9548. switch arg.Type {
  9549. case ArgString:
  9550. if !mina && (arg.Value() == "TRUE" || arg.Value() == "FALSE") {
  9551. continue
  9552. } else {
  9553. num := arg.ToBool()
  9554. if num.Type == ArgNumber && num.Number < min {
  9555. min = num.Number
  9556. continue
  9557. }
  9558. }
  9559. num := arg.ToNumber()
  9560. if num.Type != ArgError && num.Number < min {
  9561. min = num.Number
  9562. }
  9563. case ArgNumber:
  9564. if arg.Number < min {
  9565. min = arg.Number
  9566. }
  9567. case ArgList, ArgMatrix:
  9568. min = calcListMatrixMin(mina, min, arg)
  9569. case ArgError:
  9570. return arg
  9571. }
  9572. }
  9573. if min == math.MaxFloat64 {
  9574. min = 0
  9575. }
  9576. return newNumberFormulaArg(min)
  9577. }
  9578. // pearsonProduct is an implementation of the formula functions PEARSON, RSQ
  9579. // and SLOPE.
  9580. func (fn *formulaFuncs) pearsonProduct(name string, argsList *list.List) formulaArg {
  9581. if argsList.Len() != 2 {
  9582. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 2 arguments", name))
  9583. }
  9584. var array1, array2 []formulaArg
  9585. if name == "SLOPE" {
  9586. array1 = argsList.Back().Value.(formulaArg).ToList()
  9587. array2 = argsList.Front().Value.(formulaArg).ToList()
  9588. } else {
  9589. array1 = argsList.Front().Value.(formulaArg).ToList()
  9590. array2 = argsList.Back().Value.(formulaArg).ToList()
  9591. }
  9592. if len(array1) != len(array2) {
  9593. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  9594. }
  9595. var sum, deltaX, deltaY, x, y, length float64
  9596. for i := 0; i < len(array1); i++ {
  9597. num1, num2 := array1[i], array2[i]
  9598. if !(num1.Type == ArgNumber && num2.Type == ArgNumber) {
  9599. continue
  9600. }
  9601. x += num1.Number
  9602. y += num2.Number
  9603. length++
  9604. }
  9605. x /= length
  9606. y /= length
  9607. for i := 0; i < len(array1); i++ {
  9608. num1, num2 := array1[i], array2[i]
  9609. if !(num1.Type == ArgNumber && num2.Type == ArgNumber) {
  9610. continue
  9611. }
  9612. sum += (num1.Number - x) * (num2.Number - y)
  9613. deltaX += (num1.Number - x) * (num1.Number - x)
  9614. deltaY += (num2.Number - y) * (num2.Number - y)
  9615. }
  9616. if deltaX == 0 || deltaY == 0 {
  9617. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  9618. }
  9619. if name == "RSQ" {
  9620. return newNumberFormulaArg(math.Pow(sum/math.Sqrt(deltaX*deltaY), 2))
  9621. }
  9622. if name == "PEARSON" {
  9623. return newNumberFormulaArg(sum / math.Sqrt(deltaX*deltaY))
  9624. }
  9625. return newNumberFormulaArg(sum / deltaX)
  9626. }
  9627. // PEARSON function calculates the Pearson Product-Moment Correlation
  9628. // Coefficient for two sets of values. The syntax of the function is:
  9629. //
  9630. // PEARSON(array1,array2)
  9631. func (fn *formulaFuncs) PEARSON(argsList *list.List) formulaArg {
  9632. return fn.pearsonProduct("PEARSON", argsList)
  9633. }
  9634. // PERCENTILEdotEXC function returns the k'th percentile (i.e. the value below
  9635. // which k% of the data values fall) for a supplied range of values and a
  9636. // supplied k (between 0 & 1 exclusive).The syntax of the function is:
  9637. //
  9638. // PERCENTILE.EXC(array,k)
  9639. func (fn *formulaFuncs) PERCENTILEdotEXC(argsList *list.List) formulaArg {
  9640. if argsList.Len() != 2 {
  9641. return newErrorFormulaArg(formulaErrorVALUE, "PERCENTILE.EXC requires 2 arguments")
  9642. }
  9643. array := argsList.Front().Value.(formulaArg).ToList()
  9644. k := argsList.Back().Value.(formulaArg).ToNumber()
  9645. if k.Type != ArgNumber {
  9646. return k
  9647. }
  9648. if k.Number <= 0 || k.Number >= 1 {
  9649. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  9650. }
  9651. var numbers []float64
  9652. for _, arg := range array {
  9653. if arg.Type == ArgError {
  9654. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  9655. }
  9656. if arg.Type == ArgNumber {
  9657. numbers = append(numbers, arg.Number)
  9658. }
  9659. }
  9660. cnt := len(numbers)
  9661. sort.Float64s(numbers)
  9662. idx := k.Number * (float64(cnt) + 1)
  9663. base := math.Floor(idx)
  9664. next := base - 1
  9665. proportion := math.Nextafter(idx, idx) - base
  9666. return newNumberFormulaArg(numbers[int(next)] + ((numbers[int(base)] - numbers[int(next)]) * proportion))
  9667. }
  9668. // PERCENTILEdotINC function returns the k'th percentile (i.e. the value below
  9669. // which k% of the data values fall) for a supplied range of values and a
  9670. // supplied k. The syntax of the function is:
  9671. //
  9672. // PERCENTILE.INC(array,k)
  9673. func (fn *formulaFuncs) PERCENTILEdotINC(argsList *list.List) formulaArg {
  9674. if argsList.Len() != 2 {
  9675. return newErrorFormulaArg(formulaErrorVALUE, "PERCENTILE.INC requires 2 arguments")
  9676. }
  9677. return fn.PERCENTILE(argsList)
  9678. }
  9679. // PERCENTILE function returns the k'th percentile (i.e. the value below which
  9680. // k% of the data values fall) for a supplied range of values and a supplied
  9681. // k. The syntax of the function is:
  9682. //
  9683. // PERCENTILE(array,k)
  9684. func (fn *formulaFuncs) PERCENTILE(argsList *list.List) formulaArg {
  9685. if argsList.Len() != 2 {
  9686. return newErrorFormulaArg(formulaErrorVALUE, "PERCENTILE requires 2 arguments")
  9687. }
  9688. array := argsList.Front().Value.(formulaArg).ToList()
  9689. k := argsList.Back().Value.(formulaArg).ToNumber()
  9690. if k.Type != ArgNumber {
  9691. return k
  9692. }
  9693. if k.Number < 0 || k.Number > 1 {
  9694. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  9695. }
  9696. var numbers []float64
  9697. for _, arg := range array {
  9698. if arg.Type == ArgError {
  9699. return arg
  9700. }
  9701. if arg.Type == ArgNumber {
  9702. numbers = append(numbers, arg.Number)
  9703. }
  9704. }
  9705. cnt := len(numbers)
  9706. sort.Float64s(numbers)
  9707. idx := k.Number * (float64(cnt) - 1)
  9708. base := math.Floor(idx)
  9709. if idx == base {
  9710. return newNumberFormulaArg(numbers[int(idx)])
  9711. }
  9712. next := base + 1
  9713. proportion := math.Nextafter(idx, idx) - base
  9714. return newNumberFormulaArg(numbers[int(base)] + ((numbers[int(next)] - numbers[int(base)]) * proportion))
  9715. }
  9716. // percentrank is an implementation of the formula functions PERCENTRANK and
  9717. // PERCENTRANK.INC.
  9718. func (fn *formulaFuncs) percentrank(name string, argsList *list.List) formulaArg {
  9719. if argsList.Len() != 2 && argsList.Len() != 3 {
  9720. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 2 or 3 arguments", name))
  9721. }
  9722. array := argsList.Front().Value.(formulaArg).ToList()
  9723. x := argsList.Front().Next().Value.(formulaArg).ToNumber()
  9724. if x.Type != ArgNumber {
  9725. return x
  9726. }
  9727. var numbers []float64
  9728. for _, arg := range array {
  9729. if arg.Type == ArgError {
  9730. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  9731. }
  9732. if arg.Type == ArgNumber {
  9733. numbers = append(numbers, arg.Number)
  9734. }
  9735. }
  9736. cnt := len(numbers)
  9737. sort.Float64s(numbers)
  9738. if x.Number < numbers[0] || x.Number > numbers[cnt-1] {
  9739. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  9740. }
  9741. pos, significance := float64(inFloat64Slice(numbers, x.Number)), newNumberFormulaArg(3)
  9742. if argsList.Len() == 3 {
  9743. if significance = argsList.Back().Value.(formulaArg).ToNumber(); significance.Type != ArgNumber {
  9744. return significance
  9745. }
  9746. if significance.Number < 1 {
  9747. return newErrorFormulaArg(formulaErrorNUM, fmt.Sprintf("%s arguments significance should be > 1", name))
  9748. }
  9749. }
  9750. if pos == -1 {
  9751. pos = 0
  9752. cmp := numbers[0]
  9753. for cmp < x.Number {
  9754. pos++
  9755. cmp = numbers[int(pos)]
  9756. }
  9757. pos--
  9758. pos += (x.Number - numbers[int(pos)]) / (cmp - numbers[int(pos)])
  9759. }
  9760. pow := math.Pow(10, significance.Number)
  9761. digit := pow * pos / (float64(cnt) - 1)
  9762. if name == "PERCENTRANK.EXC" {
  9763. digit = pow * (pos + 1) / (float64(cnt) + 1)
  9764. }
  9765. return newNumberFormulaArg(math.Floor(digit) / pow)
  9766. }
  9767. // PERCENTRANKdotEXC function calculates the relative position, between 0 and
  9768. // 1 (exclusive), of a specified value within a supplied array. The syntax of
  9769. // the function is:
  9770. //
  9771. // PERCENTRANK.EXC(array,x,[significance])
  9772. func (fn *formulaFuncs) PERCENTRANKdotEXC(argsList *list.List) formulaArg {
  9773. return fn.percentrank("PERCENTRANK.EXC", argsList)
  9774. }
  9775. // PERCENTRANKdotINC function calculates the relative position, between 0 and
  9776. // 1 (inclusive), of a specified value within a supplied array.The syntax of
  9777. // the function is:
  9778. //
  9779. // PERCENTRANK.INC(array,x,[significance])
  9780. func (fn *formulaFuncs) PERCENTRANKdotINC(argsList *list.List) formulaArg {
  9781. return fn.percentrank("PERCENTRANK.INC", argsList)
  9782. }
  9783. // PERCENTRANK function calculates the relative position of a specified value,
  9784. // within a set of values, as a percentage. The syntax of the function is:
  9785. //
  9786. // PERCENTRANK(array,x,[significance])
  9787. func (fn *formulaFuncs) PERCENTRANK(argsList *list.List) formulaArg {
  9788. return fn.percentrank("PERCENTRANK", argsList)
  9789. }
  9790. // PERMUT function calculates the number of permutations of a specified number
  9791. // of objects from a set of objects. The syntax of the function is:
  9792. //
  9793. // PERMUT(number,number_chosen)
  9794. func (fn *formulaFuncs) PERMUT(argsList *list.List) formulaArg {
  9795. if argsList.Len() != 2 {
  9796. return newErrorFormulaArg(formulaErrorVALUE, "PERMUT requires 2 numeric arguments")
  9797. }
  9798. number := argsList.Front().Value.(formulaArg).ToNumber()
  9799. chosen := argsList.Back().Value.(formulaArg).ToNumber()
  9800. if number.Type != ArgNumber {
  9801. return number
  9802. }
  9803. if chosen.Type != ArgNumber {
  9804. return chosen
  9805. }
  9806. if number.Number < chosen.Number {
  9807. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  9808. }
  9809. return newNumberFormulaArg(math.Round(fact(number.Number) / fact(number.Number-chosen.Number)))
  9810. }
  9811. // PERMUTATIONA function calculates the number of permutations, with
  9812. // repetitions, of a specified number of objects from a set. The syntax of
  9813. // the function is:
  9814. //
  9815. // PERMUTATIONA(number,number_chosen)
  9816. func (fn *formulaFuncs) PERMUTATIONA(argsList *list.List) formulaArg {
  9817. if argsList.Len() < 1 {
  9818. return newErrorFormulaArg(formulaErrorVALUE, "PERMUTATIONA requires 2 numeric arguments")
  9819. }
  9820. number := argsList.Front().Value.(formulaArg).ToNumber()
  9821. chosen := argsList.Back().Value.(formulaArg).ToNumber()
  9822. if number.Type != ArgNumber {
  9823. return number
  9824. }
  9825. if chosen.Type != ArgNumber {
  9826. return chosen
  9827. }
  9828. num, numChosen := math.Floor(number.Number), math.Floor(chosen.Number)
  9829. if num < 0 || numChosen < 0 {
  9830. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  9831. }
  9832. return newNumberFormulaArg(math.Pow(num, numChosen))
  9833. }
  9834. // PHI function returns the value of the density function for a standard normal
  9835. // distribution for a supplied number. The syntax of the function is:
  9836. //
  9837. // PHI(x)
  9838. func (fn *formulaFuncs) PHI(argsList *list.List) formulaArg {
  9839. if argsList.Len() != 1 {
  9840. return newErrorFormulaArg(formulaErrorVALUE, "PHI requires 1 argument")
  9841. }
  9842. x := argsList.Front().Value.(formulaArg).ToNumber()
  9843. if x.Type != ArgNumber {
  9844. return x
  9845. }
  9846. return newNumberFormulaArg(0.39894228040143268 * math.Exp(-(x.Number*x.Number)/2))
  9847. }
  9848. // QUARTILE function returns a requested quartile of a supplied range of
  9849. // values. The syntax of the function is:
  9850. //
  9851. // QUARTILE(array,quart)
  9852. func (fn *formulaFuncs) QUARTILE(argsList *list.List) formulaArg {
  9853. if argsList.Len() != 2 {
  9854. return newErrorFormulaArg(formulaErrorVALUE, "QUARTILE requires 2 arguments")
  9855. }
  9856. quart := argsList.Back().Value.(formulaArg).ToNumber()
  9857. if quart.Type != ArgNumber {
  9858. return quart
  9859. }
  9860. if quart.Number < 0 || quart.Number > 4 {
  9861. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  9862. }
  9863. args := list.New().Init()
  9864. args.PushBack(argsList.Front().Value.(formulaArg))
  9865. args.PushBack(newNumberFormulaArg(quart.Number / 4))
  9866. return fn.PERCENTILE(args)
  9867. }
  9868. // QUARTILEdotEXC function returns a requested quartile of a supplied range of
  9869. // values, based on a percentile range of 0 to 1 exclusive. The syntax of the
  9870. // function is:
  9871. //
  9872. // QUARTILE.EXC(array,quart)
  9873. func (fn *formulaFuncs) QUARTILEdotEXC(argsList *list.List) formulaArg {
  9874. if argsList.Len() != 2 {
  9875. return newErrorFormulaArg(formulaErrorVALUE, "QUARTILE.EXC requires 2 arguments")
  9876. }
  9877. quart := argsList.Back().Value.(formulaArg).ToNumber()
  9878. if quart.Type != ArgNumber {
  9879. return quart
  9880. }
  9881. if quart.Number <= 0 || quart.Number >= 4 {
  9882. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  9883. }
  9884. args := list.New().Init()
  9885. args.PushBack(argsList.Front().Value.(formulaArg))
  9886. args.PushBack(newNumberFormulaArg(quart.Number / 4))
  9887. return fn.PERCENTILEdotEXC(args)
  9888. }
  9889. // QUARTILEdotINC function returns a requested quartile of a supplied range of
  9890. // values. The syntax of the function is:
  9891. //
  9892. // QUARTILE.INC(array,quart)
  9893. func (fn *formulaFuncs) QUARTILEdotINC(argsList *list.List) formulaArg {
  9894. if argsList.Len() != 2 {
  9895. return newErrorFormulaArg(formulaErrorVALUE, "QUARTILE.INC requires 2 arguments")
  9896. }
  9897. return fn.QUARTILE(argsList)
  9898. }
  9899. // rank is an implementation of the formula functions RANK and RANK.EQ.
  9900. func (fn *formulaFuncs) rank(name string, argsList *list.List) formulaArg {
  9901. if argsList.Len() < 2 {
  9902. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at least 2 arguments", name))
  9903. }
  9904. if argsList.Len() > 3 {
  9905. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at most 3 arguments", name))
  9906. }
  9907. num := argsList.Front().Value.(formulaArg).ToNumber()
  9908. if num.Type != ArgNumber {
  9909. return num
  9910. }
  9911. var arr []float64
  9912. for _, arg := range argsList.Front().Next().Value.(formulaArg).ToList() {
  9913. if arg.Type == ArgNumber {
  9914. arr = append(arr, arg.Number)
  9915. }
  9916. }
  9917. sort.Float64s(arr)
  9918. order := newNumberFormulaArg(0)
  9919. if argsList.Len() == 3 {
  9920. if order = argsList.Back().Value.(formulaArg).ToNumber(); order.Type != ArgNumber {
  9921. return order
  9922. }
  9923. }
  9924. if order.Number == 0 {
  9925. sort.Sort(sort.Reverse(sort.Float64Slice(arr)))
  9926. }
  9927. if idx := inFloat64Slice(arr, num.Number); idx != -1 {
  9928. return newNumberFormulaArg(float64(idx + 1))
  9929. }
  9930. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  9931. }
  9932. // RANKdotEQ function returns the statistical rank of a given value, within a
  9933. // supplied array of values. If there are duplicate values in the list, these
  9934. // are given the same rank. The syntax of the function is:
  9935. //
  9936. // RANK.EQ(number,ref,[order])
  9937. func (fn *formulaFuncs) RANKdotEQ(argsList *list.List) formulaArg {
  9938. return fn.rank("RANK.EQ", argsList)
  9939. }
  9940. // RANK function returns the statistical rank of a given value, within a
  9941. // supplied array of values. If there are duplicate values in the list, these
  9942. // are given the same rank. The syntax of the function is:
  9943. //
  9944. // RANK(number,ref,[order])
  9945. func (fn *formulaFuncs) RANK(argsList *list.List) formulaArg {
  9946. return fn.rank("RANK", argsList)
  9947. }
  9948. // RSQ function calculates the square of the Pearson Product-Moment Correlation
  9949. // Coefficient for two supplied sets of values. The syntax of the function
  9950. // is:
  9951. //
  9952. // RSQ(known_y's,known_x's)
  9953. func (fn *formulaFuncs) RSQ(argsList *list.List) formulaArg {
  9954. return fn.pearsonProduct("RSQ", argsList)
  9955. }
  9956. // skew is an implementation of the formula functions SKEW and SKEW.P.
  9957. func (fn *formulaFuncs) skew(name string, argsList *list.List) formulaArg {
  9958. if argsList.Len() < 1 {
  9959. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at least 1 argument", name))
  9960. }
  9961. mean := fn.AVERAGE(argsList)
  9962. var stdDev formulaArg
  9963. var count, summer float64
  9964. if name == "SKEW" {
  9965. stdDev = fn.STDEV(argsList)
  9966. } else {
  9967. stdDev = fn.STDEVP(argsList)
  9968. }
  9969. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  9970. token := arg.Value.(formulaArg)
  9971. switch token.Type {
  9972. case ArgNumber, ArgString:
  9973. num := token.ToNumber()
  9974. if num.Type == ArgError {
  9975. return num
  9976. }
  9977. summer += math.Pow((num.Number-mean.Number)/stdDev.Number, 3)
  9978. count++
  9979. case ArgList, ArgMatrix:
  9980. for _, cell := range token.ToList() {
  9981. if cell.Type != ArgNumber {
  9982. continue
  9983. }
  9984. summer += math.Pow((cell.Number-mean.Number)/stdDev.Number, 3)
  9985. count++
  9986. }
  9987. }
  9988. }
  9989. if count > 2 {
  9990. if name == "SKEW" {
  9991. return newNumberFormulaArg(summer * (count / ((count - 1) * (count - 2))))
  9992. }
  9993. return newNumberFormulaArg(summer / count)
  9994. }
  9995. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  9996. }
  9997. // SKEW function calculates the skewness of the distribution of a supplied set
  9998. // of values. The syntax of the function is:
  9999. //
  10000. // SKEW(number1,[number2],...)
  10001. func (fn *formulaFuncs) SKEW(argsList *list.List) formulaArg {
  10002. return fn.skew("SKEW", argsList)
  10003. }
  10004. // SKEWdotP function calculates the skewness of the distribution of a supplied
  10005. // set of values. The syntax of the function is:
  10006. //
  10007. // SKEW.P(number1,[number2],...)
  10008. func (fn *formulaFuncs) SKEWdotP(argsList *list.List) formulaArg {
  10009. return fn.skew("SKEW.P", argsList)
  10010. }
  10011. // SLOPE returns the slope of the linear regression line through data points in
  10012. // known_y's and known_x's. The slope is the vertical distance divided by the
  10013. // horizontal distance between any two points on the line, which is the rate
  10014. // of change along the regression line. The syntax of the function is:
  10015. //
  10016. // SLOPE(known_y's,known_x's)
  10017. func (fn *formulaFuncs) SLOPE(argsList *list.List) formulaArg {
  10018. return fn.pearsonProduct("SLOPE", argsList)
  10019. }
  10020. // SMALL function returns the k'th smallest value from an array of numeric
  10021. // values. The syntax of the function is:
  10022. //
  10023. // SMALL(array,k)
  10024. func (fn *formulaFuncs) SMALL(argsList *list.List) formulaArg {
  10025. return fn.kth("SMALL", argsList)
  10026. }
  10027. // STANDARDIZE function returns a normalized value of a distribution that is
  10028. // characterized by a supplied mean and standard deviation. The syntax of the
  10029. // function is:
  10030. //
  10031. // STANDARDIZE(x,mean,standard_dev)
  10032. func (fn *formulaFuncs) STANDARDIZE(argsList *list.List) formulaArg {
  10033. if argsList.Len() != 3 {
  10034. return newErrorFormulaArg(formulaErrorVALUE, "STANDARDIZE requires 3 arguments")
  10035. }
  10036. x := argsList.Front().Value.(formulaArg).ToNumber()
  10037. if x.Type != ArgNumber {
  10038. return x
  10039. }
  10040. mean := argsList.Front().Next().Value.(formulaArg).ToNumber()
  10041. if mean.Type != ArgNumber {
  10042. return mean
  10043. }
  10044. stdDev := argsList.Back().Value.(formulaArg).ToNumber()
  10045. if stdDev.Type != ArgNumber {
  10046. return stdDev
  10047. }
  10048. if stdDev.Number <= 0 {
  10049. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  10050. }
  10051. return newNumberFormulaArg((x.Number - mean.Number) / stdDev.Number)
  10052. }
  10053. // stdevp is an implementation of the formula functions STDEVP, STDEV.P and
  10054. // STDEVPA.
  10055. func (fn *formulaFuncs) stdevp(name string, argsList *list.List) formulaArg {
  10056. if argsList.Len() < 1 {
  10057. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at least 1 argument", name))
  10058. }
  10059. fnName := "VARP"
  10060. if name == "STDEVPA" {
  10061. fnName = "VARPA"
  10062. }
  10063. varp := fn.vars(fnName, argsList)
  10064. if varp.Type != ArgNumber {
  10065. return varp
  10066. }
  10067. return newNumberFormulaArg(math.Sqrt(varp.Number))
  10068. }
  10069. // STDEVP function calculates the standard deviation of a supplied set of
  10070. // values. The syntax of the function is:
  10071. //
  10072. // STDEVP(number1,[number2],...)
  10073. func (fn *formulaFuncs) STDEVP(argsList *list.List) formulaArg {
  10074. return fn.stdevp("STDEVP", argsList)
  10075. }
  10076. // STDEVdotP function calculates the standard deviation of a supplied set of
  10077. // values.
  10078. //
  10079. // STDEV.P( number1, [number2], ... )
  10080. func (fn *formulaFuncs) STDEVdotP(argsList *list.List) formulaArg {
  10081. return fn.stdevp("STDEV.P", argsList)
  10082. }
  10083. // STDEVPA function calculates the standard deviation of a supplied set of
  10084. // values. The syntax of the function is:
  10085. //
  10086. // STDEVPA(number1,[number2],...)
  10087. func (fn *formulaFuncs) STDEVPA(argsList *list.List) formulaArg {
  10088. return fn.stdevp("STDEVPA", argsList)
  10089. }
  10090. // STEYX function calculates the standard error for the line of best fit,
  10091. // through a supplied set of x- and y- values. The syntax of the function is:
  10092. //
  10093. // STEYX(known_y's,known_x's)
  10094. func (fn *formulaFuncs) STEYX(argsList *list.List) formulaArg {
  10095. if argsList.Len() != 2 {
  10096. return newErrorFormulaArg(formulaErrorVALUE, "STEYX requires 2 arguments")
  10097. }
  10098. array1 := argsList.Back().Value.(formulaArg).ToList()
  10099. array2 := argsList.Front().Value.(formulaArg).ToList()
  10100. if len(array1) != len(array2) {
  10101. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  10102. }
  10103. var count, sumX, sumY, squareX, squareY, sigmaXY float64
  10104. for i := 0; i < len(array1); i++ {
  10105. num1, num2 := array1[i], array2[i]
  10106. if !(num1.Type == ArgNumber && num2.Type == ArgNumber) {
  10107. continue
  10108. }
  10109. sumX += num1.Number
  10110. sumY += num2.Number
  10111. squareX += num1.Number * num1.Number
  10112. squareY += num2.Number * num2.Number
  10113. sigmaXY += num1.Number * num2.Number
  10114. count++
  10115. }
  10116. if count < 3 {
  10117. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  10118. }
  10119. dx, dy := sumX/count, sumY/count
  10120. sigma1 := squareY - 2*dy*sumY + count*dy*dy
  10121. sigma2 := sigmaXY - dy*sumX - sumY*dx + count*dy*dx
  10122. sigma3 := squareX - 2*dx*sumX + count*dx*dx
  10123. return newNumberFormulaArg(math.Sqrt((sigma1 - (sigma2*sigma2)/sigma3) / (count - 2)))
  10124. }
  10125. // getTDist is an implementation for the beta distribution probability density
  10126. // function.
  10127. func getTDist(T, fDF, nType float64) float64 {
  10128. var res float64
  10129. switch nType {
  10130. case 1:
  10131. res = 0.5 * getBetaDist(fDF/(fDF+T*T), fDF/2, 0.5)
  10132. case 2:
  10133. res = getBetaDist(fDF/(fDF+T*T), fDF/2, 0.5)
  10134. case 3:
  10135. res = math.Pow(1+(T*T/fDF), -(fDF+1)/2) / (math.Sqrt(fDF) * getBeta(0.5, fDF/2.0))
  10136. case 4:
  10137. X := fDF / (T*T + fDF)
  10138. R := 0.5 * getBetaDist(X, 0.5*fDF, 0.5)
  10139. res = 1 - R
  10140. if T < 0 {
  10141. res = R
  10142. }
  10143. }
  10144. return res
  10145. }
  10146. // TdotDIST function calculates the one-tailed Student's T Distribution, which
  10147. // is a continuous probability distribution that is frequently used for
  10148. // testing hypotheses on small sample data sets. The syntax of the function
  10149. // is:
  10150. //
  10151. // T.DIST(x,degrees_freedom,cumulative)
  10152. func (fn *formulaFuncs) TdotDIST(argsList *list.List) formulaArg {
  10153. if argsList.Len() != 3 {
  10154. return newErrorFormulaArg(formulaErrorVALUE, "T.DIST requires 3 arguments")
  10155. }
  10156. var x, degrees, cumulative formulaArg
  10157. if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
  10158. return x
  10159. }
  10160. if degrees = argsList.Front().Next().Value.(formulaArg).ToNumber(); degrees.Type != ArgNumber {
  10161. return degrees
  10162. }
  10163. if cumulative = argsList.Back().Value.(formulaArg).ToBool(); cumulative.Type != ArgNumber {
  10164. return cumulative
  10165. }
  10166. if cumulative.Number == 1 && degrees.Number < 1 {
  10167. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  10168. }
  10169. if cumulative.Number == 0 {
  10170. if degrees.Number < 0 {
  10171. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  10172. }
  10173. if degrees.Number == 0 {
  10174. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  10175. }
  10176. return newNumberFormulaArg(getTDist(x.Number, degrees.Number, 3))
  10177. }
  10178. return newNumberFormulaArg(getTDist(x.Number, degrees.Number, 4))
  10179. }
  10180. // TdotDISTdot2T function calculates the two-tailed Student's T Distribution,
  10181. // which is a continuous probability distribution that is frequently used for
  10182. // testing hypotheses on small sample data sets. The syntax of the function
  10183. // is:
  10184. //
  10185. // T.DIST.2T(x,degrees_freedom)
  10186. func (fn *formulaFuncs) TdotDISTdot2T(argsList *list.List) formulaArg {
  10187. if argsList.Len() != 2 {
  10188. return newErrorFormulaArg(formulaErrorVALUE, "T.DIST.2T requires 2 arguments")
  10189. }
  10190. var x, degrees formulaArg
  10191. if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
  10192. return x
  10193. }
  10194. if degrees = argsList.Back().Value.(formulaArg).ToNumber(); degrees.Type != ArgNumber {
  10195. return degrees
  10196. }
  10197. if x.Number < 0 || degrees.Number < 1 {
  10198. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  10199. }
  10200. return newNumberFormulaArg(getTDist(x.Number, degrees.Number, 2))
  10201. }
  10202. // TdotDISTdotRT function calculates the right-tailed Student's T Distribution,
  10203. // which is a continuous probability distribution that is frequently used for
  10204. // testing hypotheses on small sample data sets. The syntax of the function
  10205. // is:
  10206. //
  10207. // T.DIST.RT(x,degrees_freedom)
  10208. func (fn *formulaFuncs) TdotDISTdotRT(argsList *list.List) formulaArg {
  10209. if argsList.Len() != 2 {
  10210. return newErrorFormulaArg(formulaErrorVALUE, "T.DIST.RT requires 2 arguments")
  10211. }
  10212. var x, degrees formulaArg
  10213. if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
  10214. return x
  10215. }
  10216. if degrees = argsList.Back().Value.(formulaArg).ToNumber(); degrees.Type != ArgNumber {
  10217. return degrees
  10218. }
  10219. if degrees.Number < 1 {
  10220. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  10221. }
  10222. v := getTDist(x.Number, degrees.Number, 1)
  10223. if x.Number < 0 {
  10224. v = 1 - v
  10225. }
  10226. return newNumberFormulaArg(v)
  10227. }
  10228. // TDIST function calculates the Student's T Distribution, which is a
  10229. // continuous probability distribution that is frequently used for testing
  10230. // hypotheses on small sample data sets. The syntax of the function is:
  10231. //
  10232. // TDIST(x,degrees_freedom,tails)
  10233. func (fn *formulaFuncs) TDIST(argsList *list.List) formulaArg {
  10234. if argsList.Len() != 3 {
  10235. return newErrorFormulaArg(formulaErrorVALUE, "TDIST requires 3 arguments")
  10236. }
  10237. var x, degrees, tails formulaArg
  10238. if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
  10239. return x
  10240. }
  10241. if degrees = argsList.Front().Next().Value.(formulaArg).ToNumber(); degrees.Type != ArgNumber {
  10242. return degrees
  10243. }
  10244. if tails = argsList.Back().Value.(formulaArg).ToNumber(); tails.Type != ArgNumber {
  10245. return tails
  10246. }
  10247. if x.Number < 0 || degrees.Number < 1 || (tails.Number != 1 && tails.Number != 2) {
  10248. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  10249. }
  10250. return newNumberFormulaArg(getTDist(x.Number, degrees.Number, tails.Number))
  10251. }
  10252. // TdotINV function calculates the left-tailed inverse of the Student's T
  10253. // Distribution, which is a continuous probability distribution that is
  10254. // frequently used for testing hypotheses on small sample data sets. The
  10255. // syntax of the function is:
  10256. //
  10257. // T.INV(probability,degrees_freedom)
  10258. func (fn *formulaFuncs) TdotINV(argsList *list.List) formulaArg {
  10259. if argsList.Len() != 2 {
  10260. return newErrorFormulaArg(formulaErrorVALUE, "T.INV requires 2 arguments")
  10261. }
  10262. var probability, degrees formulaArg
  10263. if probability = argsList.Front().Value.(formulaArg).ToNumber(); probability.Type != ArgNumber {
  10264. return probability
  10265. }
  10266. if degrees = argsList.Back().Value.(formulaArg).ToNumber(); degrees.Type != ArgNumber {
  10267. return degrees
  10268. }
  10269. if probability.Number <= 0 || probability.Number >= 1 || degrees.Number < 1 {
  10270. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  10271. }
  10272. if probability.Number < 0.5 {
  10273. return newNumberFormulaArg(-calcIterateInverse(calcInverseIterator{
  10274. name: "T.INV",
  10275. fp: 1 - probability.Number,
  10276. fDF: degrees.Number,
  10277. nT: 4,
  10278. }, degrees.Number/2, degrees.Number))
  10279. }
  10280. return newNumberFormulaArg(calcIterateInverse(calcInverseIterator{
  10281. name: "T.INV",
  10282. fp: probability.Number,
  10283. fDF: degrees.Number,
  10284. nT: 4,
  10285. }, degrees.Number/2, degrees.Number))
  10286. }
  10287. // TdotINVdot2T function calculates the inverse of the two-tailed Student's T
  10288. // Distribution, which is a continuous probability distribution that is
  10289. // frequently used for testing hypotheses on small sample data sets. The
  10290. // syntax of the function is:
  10291. //
  10292. // T.INV.2T(probability,degrees_freedom)
  10293. func (fn *formulaFuncs) TdotINVdot2T(argsList *list.List) formulaArg {
  10294. if argsList.Len() != 2 {
  10295. return newErrorFormulaArg(formulaErrorVALUE, "T.INV.2T requires 2 arguments")
  10296. }
  10297. var probability, degrees formulaArg
  10298. if probability = argsList.Front().Value.(formulaArg).ToNumber(); probability.Type != ArgNumber {
  10299. return probability
  10300. }
  10301. if degrees = argsList.Back().Value.(formulaArg).ToNumber(); degrees.Type != ArgNumber {
  10302. return degrees
  10303. }
  10304. if probability.Number <= 0 || probability.Number > 1 || degrees.Number < 1 {
  10305. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  10306. }
  10307. return newNumberFormulaArg(calcIterateInverse(calcInverseIterator{
  10308. name: "T.INV.2T",
  10309. fp: probability.Number,
  10310. fDF: degrees.Number,
  10311. nT: 2,
  10312. }, degrees.Number/2, degrees.Number))
  10313. }
  10314. // TINV function calculates the inverse of the two-tailed Student's T
  10315. // Distribution, which is a continuous probability distribution that is
  10316. // frequently used for testing hypotheses on small sample data sets. The
  10317. // syntax of the function is:
  10318. //
  10319. // TINV(probability,degrees_freedom)
  10320. func (fn *formulaFuncs) TINV(argsList *list.List) formulaArg {
  10321. if argsList.Len() != 2 {
  10322. return newErrorFormulaArg(formulaErrorVALUE, "TINV requires 2 arguments")
  10323. }
  10324. return fn.TdotINVdot2T(argsList)
  10325. }
  10326. // TREND function calculates the linear trend line through a given set of
  10327. // y-values and (optionally), a given set of x-values. The function then
  10328. // extends the linear trendline to calculate additional y-values for a further
  10329. // supplied set of new x-values. The syntax of the function is:
  10330. //
  10331. // TREND(known_y's,[known_x's],[new_x's],[const])
  10332. func (fn *formulaFuncs) TREND(argsList *list.List) formulaArg {
  10333. return fn.trendGrowth("TREND", argsList)
  10334. }
  10335. // tTest calculates the probability associated with the Student's T Test.
  10336. func tTest(bTemplin bool, mtx1, mtx2 [][]formulaArg, c1, c2, r1, r2 int) (float64, float64, bool) {
  10337. var cnt1, cnt2, sum1, sumSqr1, sum2, sumSqr2 float64
  10338. var fVal formulaArg
  10339. for i := 0; i < c1; i++ {
  10340. for j := 0; j < r1; j++ {
  10341. if fVal = mtx1[i][j]; fVal.Type == ArgNumber {
  10342. sum1 += fVal.Number
  10343. sumSqr1 += fVal.Number * fVal.Number
  10344. cnt1++
  10345. }
  10346. }
  10347. }
  10348. for i := 0; i < c2; i++ {
  10349. for j := 0; j < r2; j++ {
  10350. if fVal = mtx2[i][j]; fVal.Type == ArgNumber {
  10351. sum2 += fVal.Number
  10352. sumSqr2 += fVal.Number * fVal.Number
  10353. cnt2++
  10354. }
  10355. }
  10356. }
  10357. if cnt1 < 2.0 || cnt2 < 2.0 {
  10358. return 0, 0, false
  10359. }
  10360. if bTemplin {
  10361. fS1 := (sumSqr1 - sum1*sum1/cnt1) / (cnt1 - 1) / cnt1
  10362. fS2 := (sumSqr2 - sum2*sum2/cnt2) / (cnt2 - 1) / cnt2
  10363. if fS1+fS2 == 0 {
  10364. return 0, 0, false
  10365. }
  10366. c := fS1 / (fS1 + fS2)
  10367. return math.Abs(sum1/cnt1-sum2/cnt2) / math.Sqrt(fS1+fS2), 1 / (c*c/(cnt1-1) + (1-c)*(1-c)/(cnt2-1)), true
  10368. }
  10369. fS1 := (sumSqr1 - sum1*sum1/cnt1) / (cnt1 - 1)
  10370. fS2 := (sumSqr2 - sum2*sum2/cnt2) / (cnt2 - 1)
  10371. return math.Abs(sum1/cnt1-sum2/cnt2) / math.Sqrt((cnt1-1)*fS1+(cnt2-1)*fS2) * math.Sqrt(cnt1*cnt2*(cnt1+cnt2-2)/(cnt1+cnt2)), cnt1 + cnt2 - 2, true
  10372. }
  10373. // tTest is an implementation of the formula function TTEST.
  10374. func (fn *formulaFuncs) tTest(mtx1, mtx2 [][]formulaArg, fTails, fTyp float64) formulaArg {
  10375. var fT, fF float64
  10376. c1, c2, r1, r2, ok := len(mtx1), len(mtx2), len(mtx1[0]), len(mtx2[0]), true
  10377. if fTyp == 1 {
  10378. if c1 != c2 || r1 != r2 {
  10379. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  10380. }
  10381. var cnt, sum1, sum2, sumSqrD float64
  10382. var fVal1, fVal2 formulaArg
  10383. for i := 0; i < c1; i++ {
  10384. for j := 0; j < r1; j++ {
  10385. fVal1, fVal2 = mtx1[i][j], mtx2[i][j]
  10386. if fVal1.Type != ArgNumber || fVal2.Type != ArgNumber {
  10387. continue
  10388. }
  10389. sum1 += fVal1.Number
  10390. sum2 += fVal2.Number
  10391. sumSqrD += (fVal1.Number - fVal2.Number) * (fVal1.Number - fVal2.Number)
  10392. cnt++
  10393. }
  10394. }
  10395. if cnt < 1 {
  10396. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  10397. }
  10398. sumD := sum1 - sum2
  10399. divider := cnt*sumSqrD - sumD*sumD
  10400. if divider == 0 {
  10401. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  10402. }
  10403. fT = math.Abs(sumD) * math.Sqrt((cnt-1)/divider)
  10404. fF = cnt - 1
  10405. } else if fTyp == 2 {
  10406. fT, fF, ok = tTest(false, mtx1, mtx2, c1, c2, r1, r2)
  10407. } else {
  10408. fT, fF, ok = tTest(true, mtx1, mtx2, c1, c2, r1, r2)
  10409. }
  10410. if !ok {
  10411. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  10412. }
  10413. return newNumberFormulaArg(getTDist(fT, fF, fTails))
  10414. }
  10415. // TTEST function calculates the probability associated with the Student's T
  10416. // Test, which is commonly used for identifying whether two data sets are
  10417. // likely to have come from the same two underlying populations with the same
  10418. // mean. The syntax of the function is:
  10419. //
  10420. // TTEST(array1,array2,tails,type)
  10421. func (fn *formulaFuncs) TTEST(argsList *list.List) formulaArg {
  10422. if argsList.Len() != 4 {
  10423. return newErrorFormulaArg(formulaErrorVALUE, "TTEST requires 4 arguments")
  10424. }
  10425. var array1, array2, tails, typeArg formulaArg
  10426. array1 = argsList.Front().Value.(formulaArg)
  10427. array2 = argsList.Front().Next().Value.(formulaArg)
  10428. if tails = argsList.Front().Next().Next().Value.(formulaArg); tails.Type != ArgNumber {
  10429. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  10430. }
  10431. if typeArg = argsList.Back().Value.(formulaArg); typeArg.Type != ArgNumber {
  10432. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  10433. }
  10434. if len(array1.Matrix) == 0 || len(array2.Matrix) == 0 {
  10435. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  10436. }
  10437. if tails.Number != 1 && tails.Number != 2 {
  10438. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  10439. }
  10440. if typeArg.Number != 1 && typeArg.Number != 2 && typeArg.Number != 3 {
  10441. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  10442. }
  10443. return fn.tTest(array1.Matrix, array2.Matrix, tails.Number, typeArg.Number)
  10444. }
  10445. // TdotTEST function calculates the probability associated with the Student's T
  10446. // Test, which is commonly used for identifying whether two data sets are
  10447. // likely to have come from the same two underlying populations with the same
  10448. // mean. The syntax of the function is:
  10449. //
  10450. // T.TEST(array1,array2,tails,type)
  10451. func (fn *formulaFuncs) TdotTEST(argsList *list.List) formulaArg {
  10452. if argsList.Len() != 4 {
  10453. return newErrorFormulaArg(formulaErrorVALUE, "T.TEST requires 4 arguments")
  10454. }
  10455. return fn.TTEST(argsList)
  10456. }
  10457. // TRIMMEAN function calculates the trimmed mean (or truncated mean) of a
  10458. // supplied set of values. The syntax of the function is:
  10459. //
  10460. // TRIMMEAN(array,percent)
  10461. func (fn *formulaFuncs) TRIMMEAN(argsList *list.List) formulaArg {
  10462. if argsList.Len() != 2 {
  10463. return newErrorFormulaArg(formulaErrorVALUE, "TRIMMEAN requires 2 arguments")
  10464. }
  10465. percent := argsList.Back().Value.(formulaArg).ToNumber()
  10466. if percent.Type != ArgNumber {
  10467. return percent
  10468. }
  10469. if percent.Number < 0 || percent.Number >= 1 {
  10470. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  10471. }
  10472. var arr []float64
  10473. arrArg := argsList.Front().Value.(formulaArg).ToList()
  10474. for _, cell := range arrArg {
  10475. if cell.Type != ArgNumber {
  10476. continue
  10477. }
  10478. arr = append(arr, cell.Number)
  10479. }
  10480. discard := math.Floor(float64(len(arr)) * percent.Number / 2)
  10481. sort.Float64s(arr)
  10482. for i := 0; i < int(discard); i++ {
  10483. if len(arr) > 0 {
  10484. arr = arr[1:]
  10485. }
  10486. if len(arr) > 0 {
  10487. arr = arr[:len(arr)-1]
  10488. }
  10489. }
  10490. args := list.New().Init()
  10491. for _, ele := range arr {
  10492. args.PushBack(newNumberFormulaArg(ele))
  10493. }
  10494. return fn.AVERAGE(args)
  10495. }
  10496. // vars is an implementation of the formula functions VAR, VARA, VARP, VAR.P
  10497. // VAR.S and VARPA.
  10498. func (fn *formulaFuncs) vars(name string, argsList *list.List) formulaArg {
  10499. if argsList.Len() < 1 {
  10500. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at least 1 argument", name))
  10501. }
  10502. summerA, summerB, count := 0.0, 0.0, 0.0
  10503. minimum := 0.0
  10504. if name == "VAR" || name == "VAR.S" || name == "VARA" {
  10505. minimum = 1.0
  10506. }
  10507. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  10508. for _, token := range arg.Value.(formulaArg).ToList() {
  10509. if token.Value() == "" {
  10510. continue
  10511. }
  10512. num := token.ToNumber()
  10513. if token.Value() != "TRUE" && num.Type == ArgNumber {
  10514. summerA += num.Number * num.Number
  10515. summerB += num.Number
  10516. count++
  10517. continue
  10518. }
  10519. num = token.ToBool()
  10520. if num.Type == ArgNumber {
  10521. summerA += num.Number * num.Number
  10522. summerB += num.Number
  10523. count++
  10524. continue
  10525. }
  10526. if name == "VARA" || name == "VARPA" {
  10527. count++
  10528. }
  10529. }
  10530. }
  10531. if count > minimum {
  10532. summerA *= count
  10533. summerB *= summerB
  10534. return newNumberFormulaArg((summerA - summerB) / (count * (count - minimum)))
  10535. }
  10536. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  10537. }
  10538. // VAR function returns the sample variance of a supplied set of values. The
  10539. // syntax of the function is:
  10540. //
  10541. // VAR(number1,[number2],...)
  10542. func (fn *formulaFuncs) VAR(argsList *list.List) formulaArg {
  10543. return fn.vars("VAR", argsList)
  10544. }
  10545. // VARA function calculates the sample variance of a supplied set of values.
  10546. // The syntax of the function is:
  10547. //
  10548. // VARA(number1,[number2],...)
  10549. func (fn *formulaFuncs) VARA(argsList *list.List) formulaArg {
  10550. return fn.vars("VARA", argsList)
  10551. }
  10552. // VARP function returns the Variance of a given set of values. The syntax of
  10553. // the function is:
  10554. //
  10555. // VARP(number1,[number2],...)
  10556. func (fn *formulaFuncs) VARP(argsList *list.List) formulaArg {
  10557. return fn.vars("VARP", argsList)
  10558. }
  10559. // VARdotP function returns the Variance of a given set of values. The syntax
  10560. // of the function is:
  10561. //
  10562. // VAR.P(number1,[number2],...)
  10563. func (fn *formulaFuncs) VARdotP(argsList *list.List) formulaArg {
  10564. return fn.vars("VAR.P", argsList)
  10565. }
  10566. // VARdotS function calculates the sample variance of a supplied set of
  10567. // values. The syntax of the function is:
  10568. //
  10569. // VAR.S(number1,[number2],...)
  10570. func (fn *formulaFuncs) VARdotS(argsList *list.List) formulaArg {
  10571. return fn.vars("VAR.S", argsList)
  10572. }
  10573. // VARPA function returns the Variance of a given set of values. The syntax of
  10574. // the function is:
  10575. //
  10576. // VARPA(number1,[number2],...)
  10577. func (fn *formulaFuncs) VARPA(argsList *list.List) formulaArg {
  10578. return fn.vars("VARPA", argsList)
  10579. }
  10580. // WEIBULL function calculates the Weibull Probability Density Function or the
  10581. // Weibull Cumulative Distribution Function for a supplied set of parameters.
  10582. // The syntax of the function is:
  10583. //
  10584. // WEIBULL(x,alpha,beta,cumulative)
  10585. func (fn *formulaFuncs) WEIBULL(argsList *list.List) formulaArg {
  10586. if argsList.Len() != 4 {
  10587. return newErrorFormulaArg(formulaErrorVALUE, "WEIBULL requires 4 arguments")
  10588. }
  10589. x := argsList.Front().Value.(formulaArg).ToNumber()
  10590. alpha := argsList.Front().Next().Value.(formulaArg).ToNumber()
  10591. beta := argsList.Back().Prev().Value.(formulaArg).ToNumber()
  10592. if alpha.Type == ArgNumber && beta.Type == ArgNumber && x.Type == ArgNumber {
  10593. if alpha.Number < 0 || alpha.Number <= 0 || beta.Number <= 0 {
  10594. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  10595. }
  10596. cumulative := argsList.Back().Value.(formulaArg).ToBool()
  10597. if cumulative.Boolean && cumulative.Number == 1 {
  10598. return newNumberFormulaArg(1 - math.Exp(0-math.Pow(x.Number/beta.Number, alpha.Number)))
  10599. }
  10600. return newNumberFormulaArg((alpha.Number / math.Pow(beta.Number, alpha.Number)) *
  10601. math.Pow(x.Number, alpha.Number-1) * math.Exp(0-math.Pow(x.Number/beta.Number, alpha.Number)))
  10602. }
  10603. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  10604. }
  10605. // WEIBULLdotDIST function calculates the Weibull Probability Density Function
  10606. // or the Weibull Cumulative Distribution Function for a supplied set of
  10607. // parameters. The syntax of the function is:
  10608. //
  10609. // WEIBULL.DIST(x,alpha,beta,cumulative)
  10610. func (fn *formulaFuncs) WEIBULLdotDIST(argsList *list.List) formulaArg {
  10611. if argsList.Len() != 4 {
  10612. return newErrorFormulaArg(formulaErrorVALUE, "WEIBULL.DIST requires 4 arguments")
  10613. }
  10614. return fn.WEIBULL(argsList)
  10615. }
  10616. // ZdotTEST function calculates the one-tailed probability value of the
  10617. // Z-Test. The syntax of the function is:
  10618. //
  10619. // Z.TEST(array,x,[sigma])
  10620. func (fn *formulaFuncs) ZdotTEST(argsList *list.List) formulaArg {
  10621. argsLen := argsList.Len()
  10622. if argsLen < 2 {
  10623. return newErrorFormulaArg(formulaErrorVALUE, "Z.TEST requires at least 2 arguments")
  10624. }
  10625. if argsLen > 3 {
  10626. return newErrorFormulaArg(formulaErrorVALUE, "Z.TEST accepts at most 3 arguments")
  10627. }
  10628. return fn.ZTEST(argsList)
  10629. }
  10630. // ZTEST function calculates the one-tailed probability value of the Z-Test.
  10631. // The syntax of the function is:
  10632. //
  10633. // ZTEST(array,x,[sigma])
  10634. func (fn *formulaFuncs) ZTEST(argsList *list.List) formulaArg {
  10635. argsLen := argsList.Len()
  10636. if argsLen < 2 {
  10637. return newErrorFormulaArg(formulaErrorVALUE, "ZTEST requires at least 2 arguments")
  10638. }
  10639. if argsLen > 3 {
  10640. return newErrorFormulaArg(formulaErrorVALUE, "ZTEST accepts at most 3 arguments")
  10641. }
  10642. arrArg, arrArgs := argsList.Front().Value.(formulaArg), list.New()
  10643. arrArgs.PushBack(arrArg)
  10644. arr := fn.AVERAGE(arrArgs)
  10645. if arr.Type == ArgError {
  10646. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  10647. }
  10648. x := argsList.Front().Next().Value.(formulaArg).ToNumber()
  10649. if x.Type == ArgError {
  10650. return x
  10651. }
  10652. sigma := argsList.Back().Value.(formulaArg).ToNumber()
  10653. if sigma.Type == ArgError {
  10654. return sigma
  10655. }
  10656. if argsLen != 3 {
  10657. sigma = fn.STDEV(arrArgs).ToNumber()
  10658. }
  10659. normsdistArg := list.New()
  10660. div := sigma.Number / math.Sqrt(float64(len(arrArg.ToList())))
  10661. if div == 0 {
  10662. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  10663. }
  10664. normsdistArg.PushBack(newNumberFormulaArg((arr.Number - x.Number) / div))
  10665. return newNumberFormulaArg(1 - fn.NORMSDIST(normsdistArg).Number)
  10666. }
  10667. // Information Functions
  10668. // ERRORdotTYPE function receives an error value and returns an integer, that
  10669. // tells you the type of the supplied error. The syntax of the function is:
  10670. //
  10671. // ERROR.TYPE(error_val)
  10672. func (fn *formulaFuncs) ERRORdotTYPE(argsList *list.List) formulaArg {
  10673. if argsList.Len() != 1 {
  10674. return newErrorFormulaArg(formulaErrorVALUE, "ERROR.TYPE requires 1 argument")
  10675. }
  10676. token := argsList.Front().Value.(formulaArg)
  10677. if token.Type == ArgError {
  10678. for i, errType := range []string{
  10679. formulaErrorNULL, formulaErrorDIV, formulaErrorVALUE, formulaErrorREF,
  10680. formulaErrorNAME, formulaErrorNUM, formulaErrorNA,
  10681. } {
  10682. if errType == token.String {
  10683. return newNumberFormulaArg(float64(i) + 1)
  10684. }
  10685. }
  10686. }
  10687. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  10688. }
  10689. // ISBLANK function tests if a specified cell is blank (empty) and if so,
  10690. // returns TRUE; Otherwise the function returns FALSE. The syntax of the
  10691. // function is:
  10692. //
  10693. // ISBLANK(value)
  10694. func (fn *formulaFuncs) ISBLANK(argsList *list.List) formulaArg {
  10695. if argsList.Len() != 1 {
  10696. return newErrorFormulaArg(formulaErrorVALUE, "ISBLANK requires 1 argument")
  10697. }
  10698. token := argsList.Front().Value.(formulaArg)
  10699. switch token.Type {
  10700. case ArgUnknown, ArgEmpty:
  10701. return newBoolFormulaArg(true)
  10702. default:
  10703. return newBoolFormulaArg(false)
  10704. }
  10705. }
  10706. // ISERR function tests if an initial supplied expression (or value) returns
  10707. // any Excel Error, except the #N/A error. If so, the function returns the
  10708. // logical value TRUE; If the supplied value is not an error or is the #N/A
  10709. // error, the ISERR function returns FALSE. The syntax of the function is:
  10710. //
  10711. // ISERR(value)
  10712. func (fn *formulaFuncs) ISERR(argsList *list.List) formulaArg {
  10713. if argsList.Len() != 1 {
  10714. return newErrorFormulaArg(formulaErrorVALUE, "ISERR requires 1 argument")
  10715. }
  10716. token := argsList.Front().Value.(formulaArg)
  10717. result := false
  10718. if token.Type == ArgError {
  10719. for _, errType := range []string{
  10720. formulaErrorDIV, formulaErrorNAME, formulaErrorNUM,
  10721. formulaErrorVALUE, formulaErrorREF, formulaErrorNULL,
  10722. formulaErrorSPILL, formulaErrorCALC, formulaErrorGETTINGDATA,
  10723. } {
  10724. if errType == token.String {
  10725. result = true
  10726. }
  10727. }
  10728. }
  10729. return newBoolFormulaArg(result)
  10730. }
  10731. // ISERROR function tests if an initial supplied expression (or value) returns
  10732. // an Excel Error, and if so, returns the logical value TRUE; Otherwise the
  10733. // function returns FALSE. The syntax of the function is:
  10734. //
  10735. // ISERROR(value)
  10736. func (fn *formulaFuncs) ISERROR(argsList *list.List) formulaArg {
  10737. if argsList.Len() != 1 {
  10738. return newErrorFormulaArg(formulaErrorVALUE, "ISERROR requires 1 argument")
  10739. }
  10740. token := argsList.Front().Value.(formulaArg)
  10741. result := false
  10742. if token.Type == ArgError {
  10743. for _, errType := range []string{
  10744. formulaErrorDIV, formulaErrorNAME, formulaErrorNA, formulaErrorNUM,
  10745. formulaErrorVALUE, formulaErrorREF, formulaErrorNULL, formulaErrorSPILL,
  10746. formulaErrorCALC, formulaErrorGETTINGDATA,
  10747. } {
  10748. if errType == token.String {
  10749. result = true
  10750. }
  10751. }
  10752. }
  10753. return newBoolFormulaArg(result)
  10754. }
  10755. // ISEVEN function tests if a supplied number (or numeric expression)
  10756. // evaluates to an even number, and if so, returns TRUE; Otherwise, the
  10757. // function returns FALSE. The syntax of the function is:
  10758. //
  10759. // ISEVEN(value)
  10760. func (fn *formulaFuncs) ISEVEN(argsList *list.List) formulaArg {
  10761. if argsList.Len() != 1 {
  10762. return newErrorFormulaArg(formulaErrorVALUE, "ISEVEN requires 1 argument")
  10763. }
  10764. token := argsList.Front().Value.(formulaArg)
  10765. switch token.Type {
  10766. case ArgEmpty:
  10767. return newBoolFormulaArg(true)
  10768. case ArgNumber, ArgString:
  10769. num := token.ToNumber()
  10770. if num.Type != ArgNumber {
  10771. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  10772. }
  10773. if num.Number == 1 {
  10774. return newBoolFormulaArg(false)
  10775. }
  10776. return newBoolFormulaArg(num.Number == num.Number/2*2)
  10777. default:
  10778. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  10779. }
  10780. }
  10781. // ISFORMULA function tests if a specified cell contains a formula, and if so,
  10782. // returns TRUE; Otherwise, the function returns FALSE. The syntax of the
  10783. // function is:
  10784. //
  10785. // ISFORMULA(reference)
  10786. func (fn *formulaFuncs) ISFORMULA(argsList *list.List) formulaArg {
  10787. if argsList.Len() != 1 {
  10788. return newErrorFormulaArg(formulaErrorVALUE, "ISFORMULA requires 1 argument")
  10789. }
  10790. arg := argsList.Front().Value.(formulaArg)
  10791. if arg.cellRefs != nil && arg.cellRefs.Len() == 1 {
  10792. ref := arg.cellRefs.Front().Value.(cellRef)
  10793. cell, _ := CoordinatesToCellName(ref.Col, ref.Row)
  10794. if formula, _ := fn.f.GetCellFormula(ref.Sheet, cell); len(formula) > 0 {
  10795. return newBoolFormulaArg(true)
  10796. }
  10797. }
  10798. return newBoolFormulaArg(false)
  10799. }
  10800. // ISLOGICAL function tests if a supplied value (or expression) returns a
  10801. // logical value (i.e. evaluates to True or False). If so, the function
  10802. // returns TRUE; Otherwise, it returns FALSE. The syntax of the function is:
  10803. //
  10804. // ISLOGICAL(value)
  10805. func (fn *formulaFuncs) ISLOGICAL(argsList *list.List) formulaArg {
  10806. if argsList.Len() != 1 {
  10807. return newErrorFormulaArg(formulaErrorVALUE, "ISLOGICAL requires 1 argument")
  10808. }
  10809. val := argsList.Front().Value.(formulaArg).Value()
  10810. if strings.EqualFold("TRUE", val) || strings.EqualFold("FALSE", val) {
  10811. return newBoolFormulaArg(true)
  10812. }
  10813. return newBoolFormulaArg(false)
  10814. }
  10815. // ISNA function tests if an initial supplied expression (or value) returns
  10816. // the Excel #N/A Error, and if so, returns TRUE; Otherwise the function
  10817. // returns FALSE. The syntax of the function is:
  10818. //
  10819. // ISNA(value)
  10820. func (fn *formulaFuncs) ISNA(argsList *list.List) formulaArg {
  10821. if argsList.Len() != 1 {
  10822. return newErrorFormulaArg(formulaErrorVALUE, "ISNA requires 1 argument")
  10823. }
  10824. token := argsList.Front().Value.(formulaArg)
  10825. result := "FALSE"
  10826. if token.Type == ArgError && token.String == formulaErrorNA {
  10827. result = "TRUE"
  10828. }
  10829. return newStringFormulaArg(result)
  10830. }
  10831. // ISNONTEXT function tests if a supplied value is text. If not, the
  10832. // function returns TRUE; If the supplied value is text, the function returns
  10833. // FALSE. The syntax of the function is:
  10834. //
  10835. // ISNONTEXT(value)
  10836. func (fn *formulaFuncs) ISNONTEXT(argsList *list.List) formulaArg {
  10837. if argsList.Len() != 1 {
  10838. return newErrorFormulaArg(formulaErrorVALUE, "ISNONTEXT requires 1 argument")
  10839. }
  10840. if argsList.Front().Value.(formulaArg).Type == ArgString {
  10841. return newBoolFormulaArg(false)
  10842. }
  10843. return newBoolFormulaArg(true)
  10844. }
  10845. // ISNUMBER function tests if a supplied value is a number. If so,
  10846. // the function returns TRUE; Otherwise it returns FALSE. The syntax of the
  10847. // function is:
  10848. //
  10849. // ISNUMBER(value)
  10850. func (fn *formulaFuncs) ISNUMBER(argsList *list.List) formulaArg {
  10851. if argsList.Len() != 1 {
  10852. return newErrorFormulaArg(formulaErrorVALUE, "ISNUMBER requires 1 argument")
  10853. }
  10854. if argsList.Front().Value.(formulaArg).Type == ArgNumber {
  10855. return newBoolFormulaArg(true)
  10856. }
  10857. return newBoolFormulaArg(false)
  10858. }
  10859. // ISODD function tests if a supplied number (or numeric expression) evaluates
  10860. // to an odd number, and if so, returns TRUE; Otherwise, the function returns
  10861. // FALSE. The syntax of the function is:
  10862. //
  10863. // ISODD(value)
  10864. func (fn *formulaFuncs) ISODD(argsList *list.List) formulaArg {
  10865. if argsList.Len() != 1 {
  10866. return newErrorFormulaArg(formulaErrorVALUE, "ISODD requires 1 argument")
  10867. }
  10868. arg := argsList.Front().Value.(formulaArg).ToNumber()
  10869. if arg.Type != ArgNumber {
  10870. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  10871. }
  10872. if int(arg.Number) != int(arg.Number)/2*2 {
  10873. return newBoolFormulaArg(true)
  10874. }
  10875. return newBoolFormulaArg(false)
  10876. }
  10877. // ISREF function tests if a supplied value is a reference. If so, the
  10878. // function returns TRUE; Otherwise it returns FALSE. The syntax of the
  10879. // function is:
  10880. //
  10881. // ISREF(value)
  10882. func (fn *formulaFuncs) ISREF(argsList *list.List) formulaArg {
  10883. if argsList.Len() != 1 {
  10884. return newErrorFormulaArg(formulaErrorVALUE, "ISREF requires 1 argument")
  10885. }
  10886. arg := argsList.Front().Value.(formulaArg)
  10887. if arg.cellRanges != nil && arg.cellRanges.Len() > 0 || arg.cellRefs != nil && arg.cellRefs.Len() > 0 {
  10888. return newBoolFormulaArg(true)
  10889. }
  10890. return newBoolFormulaArg(false)
  10891. }
  10892. // ISTEXT function tests if a supplied value is text, and if so, returns TRUE;
  10893. // Otherwise, the function returns FALSE. The syntax of the function is:
  10894. //
  10895. // ISTEXT(value)
  10896. func (fn *formulaFuncs) ISTEXT(argsList *list.List) formulaArg {
  10897. if argsList.Len() != 1 {
  10898. return newErrorFormulaArg(formulaErrorVALUE, "ISTEXT requires 1 argument")
  10899. }
  10900. token := argsList.Front().Value.(formulaArg)
  10901. if token.ToNumber().Type != ArgError {
  10902. return newBoolFormulaArg(false)
  10903. }
  10904. return newBoolFormulaArg(token.Type == ArgString)
  10905. }
  10906. // N function converts data into a numeric value. The syntax of the function
  10907. // is:
  10908. //
  10909. // N(value)
  10910. func (fn *formulaFuncs) N(argsList *list.List) formulaArg {
  10911. if argsList.Len() != 1 {
  10912. return newErrorFormulaArg(formulaErrorVALUE, "N requires 1 argument")
  10913. }
  10914. token, num := argsList.Front().Value.(formulaArg), 0.0
  10915. if token.Type == ArgError {
  10916. return token
  10917. }
  10918. if arg := token.ToNumber(); arg.Type == ArgNumber {
  10919. num = arg.Number
  10920. }
  10921. if token.Value() == "TRUE" {
  10922. num = 1
  10923. }
  10924. return newNumberFormulaArg(num)
  10925. }
  10926. // NA function returns the Excel #N/A error. This error message has the
  10927. // meaning 'value not available' and is produced when an Excel Formula is
  10928. // unable to find a value that it needs. The syntax of the function is:
  10929. //
  10930. // NA()
  10931. func (fn *formulaFuncs) NA(argsList *list.List) formulaArg {
  10932. if argsList.Len() != 0 {
  10933. return newErrorFormulaArg(formulaErrorVALUE, "NA accepts no arguments")
  10934. }
  10935. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  10936. }
  10937. // SHEET function returns the Sheet number for a specified reference. The
  10938. // syntax of the function is:
  10939. //
  10940. // SHEET([value])
  10941. func (fn *formulaFuncs) SHEET(argsList *list.List) formulaArg {
  10942. if argsList.Len() > 1 {
  10943. return newErrorFormulaArg(formulaErrorVALUE, "SHEET accepts at most 1 argument")
  10944. }
  10945. if argsList.Len() == 0 {
  10946. idx, _ := fn.f.GetSheetIndex(fn.sheet)
  10947. return newNumberFormulaArg(float64(idx + 1))
  10948. }
  10949. arg := argsList.Front().Value.(formulaArg)
  10950. if sheetIdx, _ := fn.f.GetSheetIndex(arg.Value()); sheetIdx != -1 {
  10951. return newNumberFormulaArg(float64(sheetIdx + 1))
  10952. }
  10953. if arg.cellRanges != nil && arg.cellRanges.Len() > 0 {
  10954. if sheetIdx, _ := fn.f.GetSheetIndex(arg.cellRanges.Front().Value.(cellRange).From.Sheet); sheetIdx != -1 {
  10955. return newNumberFormulaArg(float64(sheetIdx + 1))
  10956. }
  10957. }
  10958. if arg.cellRefs != nil && arg.cellRefs.Len() > 0 {
  10959. if sheetIdx, _ := fn.f.GetSheetIndex(arg.cellRefs.Front().Value.(cellRef).Sheet); sheetIdx != -1 {
  10960. return newNumberFormulaArg(float64(sheetIdx + 1))
  10961. }
  10962. }
  10963. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  10964. }
  10965. // SHEETS function returns the number of sheets in a supplied reference. The
  10966. // result includes sheets that are Visible, Hidden or Very Hidden. The syntax
  10967. // of the function is:
  10968. //
  10969. // SHEETS([reference])
  10970. func (fn *formulaFuncs) SHEETS(argsList *list.List) formulaArg {
  10971. if argsList.Len() > 1 {
  10972. return newErrorFormulaArg(formulaErrorVALUE, "SHEETS accepts at most 1 argument")
  10973. }
  10974. if argsList.Len() == 0 {
  10975. return newNumberFormulaArg(float64(len(fn.f.GetSheetList())))
  10976. }
  10977. arg := argsList.Front().Value.(formulaArg)
  10978. sheetMap := map[string]struct{}{}
  10979. if arg.cellRanges != nil && arg.cellRanges.Len() > 0 {
  10980. for rng := arg.cellRanges.Front(); rng != nil; rng = rng.Next() {
  10981. sheetMap[rng.Value.(cellRange).From.Sheet] = struct{}{}
  10982. }
  10983. }
  10984. if arg.cellRefs != nil && arg.cellRefs.Len() > 0 {
  10985. for ref := arg.cellRefs.Front(); ref != nil; ref = ref.Next() {
  10986. sheetMap[ref.Value.(cellRef).Sheet] = struct{}{}
  10987. }
  10988. }
  10989. if len(sheetMap) > 0 {
  10990. return newNumberFormulaArg(float64(len(sheetMap)))
  10991. }
  10992. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  10993. }
  10994. // TYPE function returns an integer that represents the value's data type. The
  10995. // syntax of the function is:
  10996. //
  10997. // TYPE(value)
  10998. func (fn *formulaFuncs) TYPE(argsList *list.List) formulaArg {
  10999. if argsList.Len() != 1 {
  11000. return newErrorFormulaArg(formulaErrorVALUE, "TYPE requires 1 argument")
  11001. }
  11002. token := argsList.Front().Value.(formulaArg)
  11003. switch token.Type {
  11004. case ArgError:
  11005. return newNumberFormulaArg(16)
  11006. case ArgMatrix:
  11007. return newNumberFormulaArg(64)
  11008. case ArgNumber, ArgEmpty:
  11009. if token.Boolean {
  11010. return newNumberFormulaArg(4)
  11011. }
  11012. return newNumberFormulaArg(1)
  11013. default:
  11014. return newNumberFormulaArg(2)
  11015. }
  11016. }
  11017. // T function tests if a supplied value is text and if so, returns the
  11018. // supplied text; Otherwise, the function returns an empty text string. The
  11019. // syntax of the function is:
  11020. //
  11021. // T(value)
  11022. func (fn *formulaFuncs) T(argsList *list.List) formulaArg {
  11023. if argsList.Len() != 1 {
  11024. return newErrorFormulaArg(formulaErrorVALUE, "T requires 1 argument")
  11025. }
  11026. token := argsList.Front().Value.(formulaArg)
  11027. if token.Type == ArgError {
  11028. return token
  11029. }
  11030. if token.Type == ArgNumber {
  11031. return newStringFormulaArg("")
  11032. }
  11033. return newStringFormulaArg(token.Value())
  11034. }
  11035. // Logical Functions
  11036. // AND function tests a number of supplied conditions and returns TRUE or
  11037. // FALSE. The syntax of the function is:
  11038. //
  11039. // AND(logical_test1,[logical_test2],...)
  11040. func (fn *formulaFuncs) AND(argsList *list.List) formulaArg {
  11041. if argsList.Len() == 0 {
  11042. return newErrorFormulaArg(formulaErrorVALUE, "AND requires at least 1 argument")
  11043. }
  11044. if argsList.Len() > 30 {
  11045. return newErrorFormulaArg(formulaErrorVALUE, "AND accepts at most 30 arguments")
  11046. }
  11047. and := true
  11048. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  11049. token := arg.Value.(formulaArg)
  11050. switch token.Type {
  11051. case ArgUnknown:
  11052. continue
  11053. case ArgString:
  11054. if token.String == "TRUE" {
  11055. continue
  11056. }
  11057. if token.String == "FALSE" {
  11058. return newStringFormulaArg(token.String)
  11059. }
  11060. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  11061. case ArgNumber:
  11062. and = and && token.Number != 0
  11063. case ArgMatrix:
  11064. // TODO
  11065. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  11066. }
  11067. }
  11068. return newBoolFormulaArg(and)
  11069. }
  11070. // FALSE function returns the logical value FALSE. The syntax of the
  11071. // function is:
  11072. //
  11073. // FALSE()
  11074. func (fn *formulaFuncs) FALSE(argsList *list.List) formulaArg {
  11075. if argsList.Len() != 0 {
  11076. return newErrorFormulaArg(formulaErrorVALUE, "FALSE takes no arguments")
  11077. }
  11078. return newBoolFormulaArg(false)
  11079. }
  11080. // IFERROR function receives two values (or expressions) and tests if the
  11081. // first of these evaluates to an error. The syntax of the function is:
  11082. //
  11083. // IFERROR(value,value_if_error)
  11084. func (fn *formulaFuncs) IFERROR(argsList *list.List) formulaArg {
  11085. if argsList.Len() != 2 {
  11086. return newErrorFormulaArg(formulaErrorVALUE, "IFERROR requires 2 arguments")
  11087. }
  11088. value := argsList.Front().Value.(formulaArg)
  11089. if value.Type != ArgError {
  11090. if value.Type == ArgEmpty {
  11091. return newNumberFormulaArg(0)
  11092. }
  11093. return value
  11094. }
  11095. return argsList.Back().Value.(formulaArg)
  11096. }
  11097. // IFNA function tests if an initial supplied value (or expression) evaluates
  11098. // to the Excel #N/A error. If so, the function returns a second supplied
  11099. // value; Otherwise the function returns the first supplied value. The syntax
  11100. // of the function is:
  11101. //
  11102. // IFNA(value,value_if_na)
  11103. func (fn *formulaFuncs) IFNA(argsList *list.List) formulaArg {
  11104. if argsList.Len() != 2 {
  11105. return newErrorFormulaArg(formulaErrorVALUE, "IFNA requires 2 arguments")
  11106. }
  11107. arg := argsList.Front().Value.(formulaArg)
  11108. if arg.Type == ArgError && arg.String == formulaErrorNA {
  11109. return argsList.Back().Value.(formulaArg)
  11110. }
  11111. return arg
  11112. }
  11113. // IFS function tests a number of supplied conditions and returns the result
  11114. // corresponding to the first condition that evaluates to TRUE. If none of
  11115. // the supplied conditions evaluate to TRUE, the function returns the #N/A
  11116. // error.
  11117. //
  11118. // IFS(logical_test1,value_if_true1,[logical_test2,value_if_true2],...)
  11119. func (fn *formulaFuncs) IFS(argsList *list.List) formulaArg {
  11120. if argsList.Len() < 2 {
  11121. return newErrorFormulaArg(formulaErrorVALUE, "IFS requires at least 2 arguments")
  11122. }
  11123. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  11124. if arg.Value.(formulaArg).ToBool().Number == 1 {
  11125. return arg.Next().Value.(formulaArg)
  11126. }
  11127. arg = arg.Next()
  11128. }
  11129. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  11130. }
  11131. // NOT function returns the opposite to a supplied logical value. The syntax
  11132. // of the function is:
  11133. //
  11134. // NOT(logical)
  11135. func (fn *formulaFuncs) NOT(argsList *list.List) formulaArg {
  11136. if argsList.Len() != 1 {
  11137. return newErrorFormulaArg(formulaErrorVALUE, "NOT requires 1 argument")
  11138. }
  11139. token := argsList.Front().Value.(formulaArg)
  11140. switch token.Type {
  11141. case ArgString, ArgList:
  11142. if strings.ToUpper(token.String) == "TRUE" {
  11143. return newBoolFormulaArg(false)
  11144. }
  11145. if strings.ToUpper(token.String) == "FALSE" {
  11146. return newBoolFormulaArg(true)
  11147. }
  11148. case ArgNumber:
  11149. return newBoolFormulaArg(!(token.Number != 0))
  11150. case ArgError:
  11151. return token
  11152. }
  11153. return newErrorFormulaArg(formulaErrorVALUE, "NOT expects 1 boolean or numeric argument")
  11154. }
  11155. // OR function tests a number of supplied conditions and returns either TRUE
  11156. // or FALSE. The syntax of the function is:
  11157. //
  11158. // OR(logical_test1,[logical_test2],...)
  11159. func (fn *formulaFuncs) OR(argsList *list.List) formulaArg {
  11160. if argsList.Len() == 0 {
  11161. return newErrorFormulaArg(formulaErrorVALUE, "OR requires at least 1 argument")
  11162. }
  11163. if argsList.Len() > 30 {
  11164. return newErrorFormulaArg(formulaErrorVALUE, "OR accepts at most 30 arguments")
  11165. }
  11166. var or bool
  11167. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  11168. token := arg.Value.(formulaArg)
  11169. switch token.Type {
  11170. case ArgUnknown:
  11171. continue
  11172. case ArgString:
  11173. if token.String == "FALSE" {
  11174. continue
  11175. }
  11176. if token.String == "TRUE" {
  11177. or = true
  11178. continue
  11179. }
  11180. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  11181. case ArgNumber:
  11182. if or = token.Number != 0; or {
  11183. return newStringFormulaArg(strings.ToUpper(strconv.FormatBool(or)))
  11184. }
  11185. case ArgMatrix:
  11186. // TODO
  11187. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  11188. }
  11189. }
  11190. return newStringFormulaArg(strings.ToUpper(strconv.FormatBool(or)))
  11191. }
  11192. // SWITCH function compares a number of supplied values to a supplied test
  11193. // expression and returns a result corresponding to the first value that
  11194. // matches the test expression. A default value can be supplied, to be
  11195. // returned if none of the supplied values match the test expression. The
  11196. // syntax of the function is:
  11197. //
  11198. // SWITCH(expression,value1,result1,[value2,result2],[value3,result3],...,[default])
  11199. func (fn *formulaFuncs) SWITCH(argsList *list.List) formulaArg {
  11200. if argsList.Len() < 3 {
  11201. return newErrorFormulaArg(formulaErrorVALUE, "SWITCH requires at least 3 arguments")
  11202. }
  11203. target := argsList.Front().Value.(formulaArg)
  11204. argCount := argsList.Len() - 1
  11205. switchCount := int(math.Floor(float64(argCount) / 2))
  11206. hasDefaultClause := argCount%2 != 0
  11207. result := newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  11208. if hasDefaultClause {
  11209. result = argsList.Back().Value.(formulaArg)
  11210. }
  11211. if switchCount > 0 {
  11212. arg := argsList.Front()
  11213. for i := 0; i < switchCount; i++ {
  11214. arg = arg.Next()
  11215. if target.Value() == arg.Value.(formulaArg).Value() {
  11216. result = arg.Next().Value.(formulaArg)
  11217. break
  11218. }
  11219. arg = arg.Next()
  11220. }
  11221. }
  11222. return result
  11223. }
  11224. // TRUE function returns the logical value TRUE. The syntax of the function
  11225. // is:
  11226. //
  11227. // TRUE()
  11228. func (fn *formulaFuncs) TRUE(argsList *list.List) formulaArg {
  11229. if argsList.Len() != 0 {
  11230. return newErrorFormulaArg(formulaErrorVALUE, "TRUE takes no arguments")
  11231. }
  11232. return newBoolFormulaArg(true)
  11233. }
  11234. // calcXor checking if numeric cell exists and count it by given arguments
  11235. // sequence for the formula function XOR.
  11236. func calcXor(argsList *list.List) formulaArg {
  11237. count, ok := 0, false
  11238. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  11239. token := arg.Value.(formulaArg)
  11240. switch token.Type {
  11241. case ArgError:
  11242. return token
  11243. case ArgNumber:
  11244. ok = true
  11245. if token.Number != 0 {
  11246. count++
  11247. }
  11248. case ArgMatrix:
  11249. for _, value := range token.ToList() {
  11250. if num := value.ToNumber(); num.Type == ArgNumber {
  11251. ok = true
  11252. if num.Number != 0 {
  11253. count++
  11254. }
  11255. }
  11256. }
  11257. }
  11258. }
  11259. if !ok {
  11260. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  11261. }
  11262. return newBoolFormulaArg(count%2 != 0)
  11263. }
  11264. // XOR function returns the Exclusive Or logical operation for one or more
  11265. // supplied conditions. I.e. the Xor function returns TRUE if an odd number
  11266. // of the supplied conditions evaluate to TRUE, and FALSE otherwise. The
  11267. // syntax of the function is:
  11268. //
  11269. // XOR(logical_test1,[logical_test2],...)
  11270. func (fn *formulaFuncs) XOR(argsList *list.List) formulaArg {
  11271. if argsList.Len() < 1 {
  11272. return newErrorFormulaArg(formulaErrorVALUE, "XOR requires at least 1 argument")
  11273. }
  11274. return calcXor(argsList)
  11275. }
  11276. // Date and Time Functions
  11277. // DATE returns a date, from a user-supplied year, month and day. The syntax
  11278. // of the function is:
  11279. //
  11280. // DATE(year,month,day)
  11281. func (fn *formulaFuncs) DATE(argsList *list.List) formulaArg {
  11282. if argsList.Len() != 3 {
  11283. return newErrorFormulaArg(formulaErrorVALUE, "DATE requires 3 number arguments")
  11284. }
  11285. year := argsList.Front().Value.(formulaArg).ToNumber()
  11286. month := argsList.Front().Next().Value.(formulaArg).ToNumber()
  11287. day := argsList.Back().Value.(formulaArg).ToNumber()
  11288. if year.Type != ArgNumber || month.Type != ArgNumber || day.Type != ArgNumber {
  11289. return newErrorFormulaArg(formulaErrorVALUE, "DATE requires 3 number arguments")
  11290. }
  11291. d := makeDate(int(year.Number), time.Month(month.Number), int(day.Number))
  11292. return newStringFormulaArg(timeFromExcelTime(daysBetween(excelMinTime1900.Unix(), d)+1, false).String())
  11293. }
  11294. // calcDateDif is an implementation of the formula function DATEDIF,
  11295. // calculation difference between two dates.
  11296. func calcDateDif(unit string, diff float64, seq []int, startArg, endArg formulaArg) float64 {
  11297. ey, sy, em, sm, ed, sd := seq[0], seq[1], seq[2], seq[3], seq[4], seq[5]
  11298. switch unit {
  11299. case "d":
  11300. diff = endArg.Number - startArg.Number
  11301. case "md":
  11302. smMD := em
  11303. if ed < sd {
  11304. smMD--
  11305. }
  11306. diff = endArg.Number - daysBetween(excelMinTime1900.Unix(), makeDate(ey, time.Month(smMD), sd)) - 1
  11307. case "ym":
  11308. diff = float64(em - sm)
  11309. if ed < sd {
  11310. diff--
  11311. }
  11312. if diff < 0 {
  11313. diff += 12
  11314. }
  11315. case "yd":
  11316. syYD := sy
  11317. if em < sm || (em == sm && ed < sd) {
  11318. syYD++
  11319. }
  11320. s := daysBetween(excelMinTime1900.Unix(), makeDate(syYD, time.Month(em), ed))
  11321. e := daysBetween(excelMinTime1900.Unix(), makeDate(sy, time.Month(sm), sd))
  11322. diff = s - e
  11323. }
  11324. return diff
  11325. }
  11326. // DATEDIF function calculates the number of days, months, or years between
  11327. // two dates. The syntax of the function is:
  11328. //
  11329. // DATEDIF(start_date,end_date,unit)
  11330. func (fn *formulaFuncs) DATEDIF(argsList *list.List) formulaArg {
  11331. if argsList.Len() != 3 {
  11332. return newErrorFormulaArg(formulaErrorVALUE, "DATEDIF requires 3 number arguments")
  11333. }
  11334. startArg, endArg := argsList.Front().Value.(formulaArg).ToNumber(), argsList.Front().Next().Value.(formulaArg).ToNumber()
  11335. if startArg.Type != ArgNumber || endArg.Type != ArgNumber {
  11336. return startArg
  11337. }
  11338. if startArg.Number > endArg.Number {
  11339. return newErrorFormulaArg(formulaErrorNUM, "start_date > end_date")
  11340. }
  11341. if startArg.Number == endArg.Number {
  11342. return newNumberFormulaArg(0)
  11343. }
  11344. unit := strings.ToLower(argsList.Back().Value.(formulaArg).Value())
  11345. startDate, endDate := timeFromExcelTime(startArg.Number, false), timeFromExcelTime(endArg.Number, false)
  11346. sy, smm, sd := startDate.Date()
  11347. ey, emm, ed := endDate.Date()
  11348. sm, em, diff := int(smm), int(emm), 0.0
  11349. switch unit {
  11350. case "y":
  11351. diff = float64(ey - sy)
  11352. if em < sm || (em == sm && ed < sd) {
  11353. diff--
  11354. }
  11355. case "m":
  11356. yDiff := ey - sy
  11357. mDiff := em - sm
  11358. if ed < sd {
  11359. mDiff--
  11360. }
  11361. if mDiff < 0 {
  11362. yDiff--
  11363. mDiff += 12
  11364. }
  11365. diff = float64(yDiff*12 + mDiff)
  11366. case "d", "md", "ym", "yd":
  11367. diff = calcDateDif(unit, diff, []int{ey, sy, em, sm, ed, sd}, startArg, endArg)
  11368. default:
  11369. return newErrorFormulaArg(formulaErrorVALUE, "DATEDIF has invalid unit")
  11370. }
  11371. return newNumberFormulaArg(diff)
  11372. }
  11373. // isDateOnlyFmt check if the given string matches date-only format regular expressions.
  11374. func isDateOnlyFmt(dateString string) bool {
  11375. for _, df := range dateOnlyFormats {
  11376. subMatch := df.FindStringSubmatch(dateString)
  11377. if len(subMatch) > 1 {
  11378. return true
  11379. }
  11380. }
  11381. return false
  11382. }
  11383. // isTimeOnlyFmt check if the given string matches time-only format regular expressions.
  11384. func isTimeOnlyFmt(timeString string) bool {
  11385. for _, tf := range timeFormats {
  11386. subMatch := tf.FindStringSubmatch(timeString)
  11387. if len(subMatch) > 1 {
  11388. return true
  11389. }
  11390. }
  11391. return false
  11392. }
  11393. // strToTimePatternHandler1 parse and convert the given string in pattern
  11394. // hh to the time.
  11395. func strToTimePatternHandler1(subMatch []string) (h, m int, s float64, err error) {
  11396. h, err = strconv.Atoi(subMatch[0])
  11397. return
  11398. }
  11399. // strToTimePatternHandler2 parse and convert the given string in pattern
  11400. // hh:mm to the time.
  11401. func strToTimePatternHandler2(subMatch []string) (h, m int, s float64, err error) {
  11402. if h, err = strconv.Atoi(subMatch[0]); err != nil {
  11403. return
  11404. }
  11405. m, err = strconv.Atoi(subMatch[2])
  11406. return
  11407. }
  11408. // strToTimePatternHandler3 parse and convert the given string in pattern
  11409. // mm:ss to the time.
  11410. func strToTimePatternHandler3(subMatch []string) (h, m int, s float64, err error) {
  11411. if m, err = strconv.Atoi(subMatch[0]); err != nil {
  11412. return
  11413. }
  11414. s, err = strconv.ParseFloat(subMatch[2], 64)
  11415. return
  11416. }
  11417. // strToTimePatternHandler4 parse and convert the given string in pattern
  11418. // hh:mm:ss to the time.
  11419. func strToTimePatternHandler4(subMatch []string) (h, m int, s float64, err error) {
  11420. if h, err = strconv.Atoi(subMatch[0]); err != nil {
  11421. return
  11422. }
  11423. if m, err = strconv.Atoi(subMatch[2]); err != nil {
  11424. return
  11425. }
  11426. s, err = strconv.ParseFloat(subMatch[4], 64)
  11427. return
  11428. }
  11429. // strToTime parse and convert the given string to the time.
  11430. func strToTime(str string) (int, int, float64, bool, bool, formulaArg) {
  11431. var subMatch []string
  11432. pattern := ""
  11433. for key, tf := range timeFormats {
  11434. subMatch = tf.FindStringSubmatch(str)
  11435. if len(subMatch) > 1 {
  11436. pattern = key
  11437. break
  11438. }
  11439. }
  11440. if pattern == "" {
  11441. return 0, 0, 0, false, false, newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  11442. }
  11443. dateIsEmpty := subMatch[1] == ""
  11444. subMatch = subMatch[49:]
  11445. var (
  11446. l = len(subMatch)
  11447. last = subMatch[l-1]
  11448. am = last == "am"
  11449. pm = last == "pm"
  11450. hours, minutes int
  11451. seconds float64
  11452. err error
  11453. )
  11454. if handler, ok := map[string]func(match []string) (int, int, float64, error){
  11455. "hh": strToTimePatternHandler1,
  11456. "hh:mm": strToTimePatternHandler2,
  11457. "mm:ss": strToTimePatternHandler3,
  11458. "hh:mm:ss": strToTimePatternHandler4,
  11459. }[pattern]; ok {
  11460. if hours, minutes, seconds, err = handler(subMatch); err != nil {
  11461. return 0, 0, 0, false, false, newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  11462. }
  11463. }
  11464. if minutes >= 60 {
  11465. return 0, 0, 0, false, false, newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  11466. }
  11467. if am || pm {
  11468. if hours > 12 || seconds >= 60 {
  11469. return 0, 0, 0, false, false, newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  11470. } else if hours == 12 {
  11471. hours = 0
  11472. }
  11473. } else if hours >= 24 || seconds >= 10000 {
  11474. return 0, 0, 0, false, false, newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  11475. }
  11476. return hours, minutes, seconds, pm, dateIsEmpty, newEmptyFormulaArg()
  11477. }
  11478. // strToDatePatternHandler1 parse and convert the given string in pattern
  11479. // mm/dd/yy to the date.
  11480. func strToDatePatternHandler1(subMatch []string) (int, int, int, bool, error) {
  11481. var year, month, day int
  11482. var err error
  11483. if month, err = strconv.Atoi(subMatch[1]); err != nil {
  11484. return 0, 0, 0, false, err
  11485. }
  11486. if day, err = strconv.Atoi(subMatch[3]); err != nil {
  11487. return 0, 0, 0, false, err
  11488. }
  11489. if year, err = strconv.Atoi(subMatch[5]); err != nil {
  11490. return 0, 0, 0, false, err
  11491. }
  11492. if year < 0 || year > 9999 || (year > 99 && year < 1900) {
  11493. return 0, 0, 0, false, ErrParameterInvalid
  11494. }
  11495. return formatYear(year), month, day, subMatch[8] == "", err
  11496. }
  11497. // strToDatePatternHandler2 parse and convert the given string in pattern mm
  11498. // dd, yy to the date.
  11499. func strToDatePatternHandler2(subMatch []string) (int, int, int, bool, error) {
  11500. var year, month, day int
  11501. var err error
  11502. month = month2num[subMatch[1]]
  11503. if day, err = strconv.Atoi(subMatch[14]); err != nil {
  11504. return 0, 0, 0, false, err
  11505. }
  11506. if year, err = strconv.Atoi(subMatch[16]); err != nil {
  11507. return 0, 0, 0, false, err
  11508. }
  11509. if year < 0 || year > 9999 || (year > 99 && year < 1900) {
  11510. return 0, 0, 0, false, ErrParameterInvalid
  11511. }
  11512. return formatYear(year), month, day, subMatch[19] == "", err
  11513. }
  11514. // strToDatePatternHandler3 parse and convert the given string in pattern
  11515. // yy-mm-dd to the date.
  11516. func strToDatePatternHandler3(subMatch []string) (int, int, int, bool, error) {
  11517. var year, month, day int
  11518. v1, err := strconv.Atoi(subMatch[1])
  11519. if err != nil {
  11520. return 0, 0, 0, false, err
  11521. }
  11522. v2, err := strconv.Atoi(subMatch[3])
  11523. if err != nil {
  11524. return 0, 0, 0, false, err
  11525. }
  11526. v3, err := strconv.Atoi(subMatch[5])
  11527. if err != nil {
  11528. return 0, 0, 0, false, err
  11529. }
  11530. if v1 >= 1900 && v1 < 10000 {
  11531. year = v1
  11532. month = v2
  11533. day = v3
  11534. } else if v1 > 0 && v1 < 13 {
  11535. month = v1
  11536. day = v2
  11537. year = v3
  11538. } else {
  11539. return 0, 0, 0, false, ErrParameterInvalid
  11540. }
  11541. return year, month, day, subMatch[8] == "", err
  11542. }
  11543. // strToDatePatternHandler4 parse and convert the given string in pattern
  11544. // yy-mmStr-dd, yy to the date.
  11545. func strToDatePatternHandler4(subMatch []string) (int, int, int, bool, error) {
  11546. var year, month, day int
  11547. var err error
  11548. if year, err = strconv.Atoi(subMatch[16]); err != nil {
  11549. return 0, 0, 0, false, err
  11550. }
  11551. month = month2num[subMatch[3]]
  11552. if day, err = strconv.Atoi(subMatch[1]); err != nil {
  11553. return 0, 0, 0, false, err
  11554. }
  11555. return formatYear(year), month, day, subMatch[19] == "", err
  11556. }
  11557. // strToDate parse and convert the given string to the date.
  11558. func strToDate(str string) (int, int, int, bool, formulaArg) {
  11559. var subMatch []string
  11560. pattern := ""
  11561. for key, df := range dateFormats {
  11562. subMatch = df.FindStringSubmatch(str)
  11563. if len(subMatch) > 1 {
  11564. pattern = key
  11565. break
  11566. }
  11567. }
  11568. if pattern == "" {
  11569. return 0, 0, 0, false, newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  11570. }
  11571. var (
  11572. timeIsEmpty bool
  11573. year, month, day int
  11574. err error
  11575. )
  11576. if handler, ok := map[string]func(match []string) (int, int, int, bool, error){
  11577. "mm/dd/yy": strToDatePatternHandler1,
  11578. "mm dd, yy": strToDatePatternHandler2,
  11579. "yy-mm-dd": strToDatePatternHandler3,
  11580. "yy-mmStr-dd": strToDatePatternHandler4,
  11581. }[pattern]; ok {
  11582. if year, month, day, timeIsEmpty, err = handler(subMatch); err != nil {
  11583. return 0, 0, 0, false, newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  11584. }
  11585. }
  11586. if !validateDate(year, month, day) {
  11587. return 0, 0, 0, false, newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  11588. }
  11589. return year, month, day, timeIsEmpty, newEmptyFormulaArg()
  11590. }
  11591. // DATEVALUE function converts a text representation of a date into an Excel
  11592. // date. For example, the function converts a text string representing a
  11593. // date, into the serial number that represents the date in Excels' date-time
  11594. // code. The syntax of the function is:
  11595. //
  11596. // DATEVALUE(date_text)
  11597. func (fn *formulaFuncs) DATEVALUE(argsList *list.List) formulaArg {
  11598. if argsList.Len() != 1 {
  11599. return newErrorFormulaArg(formulaErrorVALUE, "DATEVALUE requires 1 argument")
  11600. }
  11601. dateText := argsList.Front().Value.(formulaArg).Value()
  11602. if !isDateOnlyFmt(dateText) {
  11603. if _, _, _, _, _, err := strToTime(dateText); err.Type == ArgError {
  11604. return err
  11605. }
  11606. }
  11607. y, m, d, _, err := strToDate(dateText)
  11608. if err.Type == ArgError {
  11609. return err
  11610. }
  11611. return newNumberFormulaArg(daysBetween(excelMinTime1900.Unix(), makeDate(y, time.Month(m), d)) + 1)
  11612. }
  11613. // DAY function returns the day of a date, represented by a serial number. The
  11614. // day is given as an integer ranging from 1 to 31. The syntax of the
  11615. // function is:
  11616. //
  11617. // DAY(serial_number)
  11618. func (fn *formulaFuncs) DAY(argsList *list.List) formulaArg {
  11619. if argsList.Len() != 1 {
  11620. return newErrorFormulaArg(formulaErrorVALUE, "DAY requires exactly 1 argument")
  11621. }
  11622. arg := argsList.Front().Value.(formulaArg)
  11623. num := arg.ToNumber()
  11624. if num.Type != ArgNumber {
  11625. dateString := strings.ToLower(arg.Value())
  11626. if !isDateOnlyFmt(dateString) {
  11627. if _, _, _, _, _, err := strToTime(dateString); err.Type == ArgError {
  11628. return err
  11629. }
  11630. }
  11631. _, _, day, _, err := strToDate(dateString)
  11632. if err.Type == ArgError {
  11633. return err
  11634. }
  11635. return newNumberFormulaArg(float64(day))
  11636. }
  11637. if num.Number < 0 {
  11638. return newErrorFormulaArg(formulaErrorNUM, "DAY only accepts positive argument")
  11639. }
  11640. if num.Number <= 60 {
  11641. return newNumberFormulaArg(math.Mod(num.Number, 31.0))
  11642. }
  11643. return newNumberFormulaArg(float64(timeFromExcelTime(num.Number, false).Day()))
  11644. }
  11645. // DAYS function returns the number of days between two supplied dates. The
  11646. // syntax of the function is:
  11647. //
  11648. // DAYS(end_date,start_date)
  11649. func (fn *formulaFuncs) DAYS(argsList *list.List) formulaArg {
  11650. if argsList.Len() != 2 {
  11651. return newErrorFormulaArg(formulaErrorVALUE, "DAYS requires 2 arguments")
  11652. }
  11653. args := fn.prepareDataValueArgs(2, argsList)
  11654. if args.Type != ArgList {
  11655. return args
  11656. }
  11657. end, start := args.List[0], args.List[1]
  11658. return newNumberFormulaArg(end.Number - start.Number)
  11659. }
  11660. // DAYS360 function returns the number of days between 2 dates, based on a
  11661. // 360-day year (12 x 30 months). The syntax of the function is:
  11662. //
  11663. // DAYS360(start_date,end_date,[method])
  11664. func (fn *formulaFuncs) DAYS360(argsList *list.List) formulaArg {
  11665. if argsList.Len() < 2 {
  11666. return newErrorFormulaArg(formulaErrorVALUE, "DAYS360 requires at least 2 arguments")
  11667. }
  11668. if argsList.Len() > 3 {
  11669. return newErrorFormulaArg(formulaErrorVALUE, "DAYS360 requires at most 3 arguments")
  11670. }
  11671. startDate := toExcelDateArg(argsList.Front().Value.(formulaArg))
  11672. if startDate.Type != ArgNumber {
  11673. return startDate
  11674. }
  11675. endDate := toExcelDateArg(argsList.Front().Next().Value.(formulaArg))
  11676. if endDate.Type != ArgNumber {
  11677. return endDate
  11678. }
  11679. start, end := timeFromExcelTime(startDate.Number, false), timeFromExcelTime(endDate.Number, false)
  11680. sy, sm, sd, ey, em, ed := start.Year(), int(start.Month()), start.Day(), end.Year(), int(end.Month()), end.Day()
  11681. method := newBoolFormulaArg(false)
  11682. if argsList.Len() > 2 {
  11683. if method = argsList.Back().Value.(formulaArg).ToBool(); method.Type != ArgNumber {
  11684. return method
  11685. }
  11686. }
  11687. if method.Number == 1 {
  11688. if sd == 31 {
  11689. sd--
  11690. }
  11691. if ed == 31 {
  11692. ed--
  11693. }
  11694. } else {
  11695. if getDaysInMonth(sy, sm) == sd {
  11696. sd = 30
  11697. }
  11698. if ed > 30 {
  11699. if sd < 30 {
  11700. em++
  11701. ed = 1
  11702. } else {
  11703. ed = 30
  11704. }
  11705. }
  11706. }
  11707. return newNumberFormulaArg(float64(360*(ey-sy) + 30*(em-sm) + (ed - sd)))
  11708. }
  11709. // ISOWEEKNUM function returns the ISO week number of a supplied date. The
  11710. // syntax of the function is:
  11711. //
  11712. // ISOWEEKNUM(date)
  11713. func (fn *formulaFuncs) ISOWEEKNUM(argsList *list.List) formulaArg {
  11714. if argsList.Len() != 1 {
  11715. return newErrorFormulaArg(formulaErrorVALUE, "ISOWEEKNUM requires 1 argument")
  11716. }
  11717. date := argsList.Front().Value.(formulaArg)
  11718. num := date.ToNumber()
  11719. weekNum := 0
  11720. if num.Type != ArgNumber {
  11721. dateString := strings.ToLower(date.Value())
  11722. if !isDateOnlyFmt(dateString) {
  11723. if _, _, _, _, _, err := strToTime(dateString); err.Type == ArgError {
  11724. return err
  11725. }
  11726. }
  11727. y, m, d, _, err := strToDate(dateString)
  11728. if err.Type == ArgError {
  11729. return err
  11730. }
  11731. _, weekNum = time.Date(y, time.Month(m), d, 0, 0, 0, 0, time.UTC).ISOWeek()
  11732. } else {
  11733. if num.Number < 0 {
  11734. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  11735. }
  11736. _, weekNum = timeFromExcelTime(num.Number, false).ISOWeek()
  11737. }
  11738. return newNumberFormulaArg(float64(weekNum))
  11739. }
  11740. // EDATE function returns a date that is a specified number of months before or
  11741. // after a supplied start date. The syntax of function is:
  11742. //
  11743. // EDATE(start_date,months)
  11744. func (fn *formulaFuncs) EDATE(argsList *list.List) formulaArg {
  11745. if argsList.Len() != 2 {
  11746. return newErrorFormulaArg(formulaErrorVALUE, "EDATE requires 2 arguments")
  11747. }
  11748. date := argsList.Front().Value.(formulaArg)
  11749. num := date.ToNumber()
  11750. var dateTime time.Time
  11751. if num.Type != ArgNumber {
  11752. dateString := strings.ToLower(date.Value())
  11753. if !isDateOnlyFmt(dateString) {
  11754. if _, _, _, _, _, err := strToTime(dateString); err.Type == ArgError {
  11755. return err
  11756. }
  11757. }
  11758. y, m, d, _, err := strToDate(dateString)
  11759. if err.Type == ArgError {
  11760. return err
  11761. }
  11762. dateTime = time.Date(y, time.Month(m), d, 0, 0, 0, 0, time.Now().Location())
  11763. } else {
  11764. if num.Number < 0 {
  11765. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  11766. }
  11767. dateTime = timeFromExcelTime(num.Number, false)
  11768. }
  11769. month := argsList.Back().Value.(formulaArg).ToNumber()
  11770. if month.Type != ArgNumber {
  11771. return month
  11772. }
  11773. y, d := dateTime.Year(), dateTime.Day()
  11774. m := int(dateTime.Month()) + int(month.Number)
  11775. if month.Number < 0 {
  11776. y -= int(math.Ceil(-1 * float64(m) / 12))
  11777. }
  11778. if month.Number > 11 {
  11779. y += int(math.Floor(float64(m) / 12))
  11780. }
  11781. if m = m % 12; m < 0 {
  11782. m += 12
  11783. }
  11784. if d > 28 {
  11785. if days := getDaysInMonth(y, m); d > days {
  11786. d = days
  11787. }
  11788. }
  11789. result, _ := timeToExcelTime(time.Date(y, time.Month(m), d, 0, 0, 0, 0, time.UTC), false)
  11790. return newNumberFormulaArg(result)
  11791. }
  11792. // EOMONTH function returns the last day of the month, that is a specified
  11793. // number of months before or after an initial supplied start date. The syntax
  11794. // of the function is:
  11795. //
  11796. // EOMONTH(start_date,months)
  11797. func (fn *formulaFuncs) EOMONTH(argsList *list.List) formulaArg {
  11798. if argsList.Len() != 2 {
  11799. return newErrorFormulaArg(formulaErrorVALUE, "EOMONTH requires 2 arguments")
  11800. }
  11801. date := argsList.Front().Value.(formulaArg)
  11802. num := date.ToNumber()
  11803. var dateTime time.Time
  11804. if num.Type != ArgNumber {
  11805. dateString := strings.ToLower(date.Value())
  11806. if !isDateOnlyFmt(dateString) {
  11807. if _, _, _, _, _, err := strToTime(dateString); err.Type == ArgError {
  11808. return err
  11809. }
  11810. }
  11811. y, m, d, _, err := strToDate(dateString)
  11812. if err.Type == ArgError {
  11813. return err
  11814. }
  11815. dateTime = time.Date(y, time.Month(m), d, 0, 0, 0, 0, time.Now().Location())
  11816. } else {
  11817. if num.Number < 0 {
  11818. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  11819. }
  11820. dateTime = timeFromExcelTime(num.Number, false)
  11821. }
  11822. months := argsList.Back().Value.(formulaArg).ToNumber()
  11823. if months.Type != ArgNumber {
  11824. return months
  11825. }
  11826. y, m := dateTime.Year(), int(dateTime.Month())+int(months.Number)-1
  11827. if m < 0 {
  11828. y -= int(math.Ceil(-1 * float64(m) / 12))
  11829. }
  11830. if m > 11 {
  11831. y += int(math.Floor(float64(m) / 12))
  11832. }
  11833. if m = m % 12; m < 0 {
  11834. m += 12
  11835. }
  11836. result, _ := timeToExcelTime(time.Date(y, time.Month(m+1), getDaysInMonth(y, m+1), 0, 0, 0, 0, time.UTC), false)
  11837. return newNumberFormulaArg(result)
  11838. }
  11839. // HOUR function returns an integer representing the hour component of a
  11840. // supplied Excel time. The syntax of the function is:
  11841. //
  11842. // HOUR(serial_number)
  11843. func (fn *formulaFuncs) HOUR(argsList *list.List) formulaArg {
  11844. if argsList.Len() != 1 {
  11845. return newErrorFormulaArg(formulaErrorVALUE, "HOUR requires exactly 1 argument")
  11846. }
  11847. date := argsList.Front().Value.(formulaArg)
  11848. num := date.ToNumber()
  11849. if num.Type != ArgNumber {
  11850. timeString := strings.ToLower(date.Value())
  11851. if !isTimeOnlyFmt(timeString) {
  11852. _, _, _, _, err := strToDate(timeString)
  11853. if err.Type == ArgError {
  11854. return err
  11855. }
  11856. }
  11857. h, _, _, pm, _, err := strToTime(timeString)
  11858. if err.Type == ArgError {
  11859. return err
  11860. }
  11861. if pm {
  11862. h += 12
  11863. }
  11864. return newNumberFormulaArg(float64(h))
  11865. }
  11866. if num.Number < 0 {
  11867. return newErrorFormulaArg(formulaErrorNUM, "HOUR only accepts positive argument")
  11868. }
  11869. return newNumberFormulaArg(float64(timeFromExcelTime(num.Number, false).Hour()))
  11870. }
  11871. // MINUTE function returns an integer representing the minute component of a
  11872. // supplied Excel time. The syntax of the function is:
  11873. //
  11874. // MINUTE(serial_number)
  11875. func (fn *formulaFuncs) MINUTE(argsList *list.List) formulaArg {
  11876. if argsList.Len() != 1 {
  11877. return newErrorFormulaArg(formulaErrorVALUE, "MINUTE requires exactly 1 argument")
  11878. }
  11879. date := argsList.Front().Value.(formulaArg)
  11880. num := date.ToNumber()
  11881. if num.Type != ArgNumber {
  11882. timeString := strings.ToLower(date.Value())
  11883. if !isTimeOnlyFmt(timeString) {
  11884. _, _, _, _, err := strToDate(timeString)
  11885. if err.Type == ArgError {
  11886. return err
  11887. }
  11888. }
  11889. _, m, _, _, _, err := strToTime(timeString)
  11890. if err.Type == ArgError {
  11891. return err
  11892. }
  11893. return newNumberFormulaArg(float64(m))
  11894. }
  11895. if num.Number < 0 {
  11896. return newErrorFormulaArg(formulaErrorNUM, "MINUTE only accepts positive argument")
  11897. }
  11898. return newNumberFormulaArg(float64(timeFromExcelTime(num.Number, false).Minute()))
  11899. }
  11900. // MONTH function returns the month of a date represented by a serial number.
  11901. // The month is given as an integer, ranging from 1 (January) to 12
  11902. // (December). The syntax of the function is:
  11903. //
  11904. // MONTH(serial_number)
  11905. func (fn *formulaFuncs) MONTH(argsList *list.List) formulaArg {
  11906. if argsList.Len() != 1 {
  11907. return newErrorFormulaArg(formulaErrorVALUE, "MONTH requires exactly 1 argument")
  11908. }
  11909. arg := argsList.Front().Value.(formulaArg)
  11910. num := arg.ToNumber()
  11911. if num.Type != ArgNumber {
  11912. dateString := strings.ToLower(arg.Value())
  11913. if !isDateOnlyFmt(dateString) {
  11914. if _, _, _, _, _, err := strToTime(dateString); err.Type == ArgError {
  11915. return err
  11916. }
  11917. }
  11918. _, month, _, _, err := strToDate(dateString)
  11919. if err.Type == ArgError {
  11920. return err
  11921. }
  11922. return newNumberFormulaArg(float64(month))
  11923. }
  11924. if num.Number < 0 {
  11925. return newErrorFormulaArg(formulaErrorNUM, "MONTH only accepts positive argument")
  11926. }
  11927. return newNumberFormulaArg(float64(timeFromExcelTime(num.Number, false).Month()))
  11928. }
  11929. // genWeekendMask generate weekend mask of a series of seven 0's and 1's which
  11930. // represent the seven weekdays, starting from Monday.
  11931. func genWeekendMask(weekend int) []byte {
  11932. if masks, ok := map[int][]int{
  11933. 1: {5, 6}, 2: {6, 0}, 3: {0, 1}, 4: {1, 2}, 5: {2, 3}, 6: {3, 4}, 7: {4, 5},
  11934. 11: {6}, 12: {0}, 13: {1}, 14: {2}, 15: {3}, 16: {4}, 17: {5},
  11935. }[weekend]; ok {
  11936. mask := make([]byte, 7)
  11937. for _, idx := range masks {
  11938. mask[idx] = 1
  11939. }
  11940. return mask
  11941. }
  11942. return nil
  11943. }
  11944. // isWorkday check if the date is workday.
  11945. func isWorkday(weekendMask []byte, date float64) bool {
  11946. dateTime := timeFromExcelTime(date, false)
  11947. weekday := dateTime.Weekday()
  11948. if weekday == time.Sunday {
  11949. weekday = 7
  11950. }
  11951. return weekendMask[weekday-1] == 0
  11952. }
  11953. // prepareWorkday returns weekend mask and workdays pre week by given days
  11954. // counted as weekend.
  11955. func prepareWorkday(weekend formulaArg) ([]byte, int) {
  11956. weekendArg := weekend.ToNumber()
  11957. if weekendArg.Type != ArgNumber {
  11958. return nil, 0
  11959. }
  11960. var weekendMask []byte
  11961. var workdaysPerWeek int
  11962. if len(weekend.Value()) == 7 {
  11963. // possible string values for the weekend argument
  11964. for _, mask := range weekend.Value() {
  11965. if mask != '0' && mask != '1' {
  11966. return nil, 0
  11967. }
  11968. weekendMask = append(weekendMask, byte(mask)-48)
  11969. }
  11970. } else {
  11971. weekendMask = genWeekendMask(int(weekendArg.Number))
  11972. }
  11973. for _, mask := range weekendMask {
  11974. if mask == 0 {
  11975. workdaysPerWeek++
  11976. }
  11977. }
  11978. return weekendMask, workdaysPerWeek
  11979. }
  11980. // toExcelDateArg function converts a text representation of a time, into an
  11981. // Excel date time number formula argument.
  11982. func toExcelDateArg(arg formulaArg) formulaArg {
  11983. num := arg.ToNumber()
  11984. if num.Type != ArgNumber {
  11985. dateString := strings.ToLower(arg.Value())
  11986. if !isDateOnlyFmt(dateString) {
  11987. if _, _, _, _, _, err := strToTime(dateString); err.Type == ArgError {
  11988. return err
  11989. }
  11990. }
  11991. y, m, d, _, err := strToDate(dateString)
  11992. if err.Type == ArgError {
  11993. return err
  11994. }
  11995. num.Number, _ = timeToExcelTime(time.Date(y, time.Month(m), d, 0, 0, 0, 0, time.UTC), false)
  11996. return newNumberFormulaArg(num.Number)
  11997. }
  11998. if arg.Number < 0 {
  11999. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  12000. }
  12001. return num
  12002. }
  12003. // prepareHolidays function converts array type formula arguments to into an
  12004. // Excel date time number formula arguments list.
  12005. func prepareHolidays(args formulaArg) []int {
  12006. var holidays []int
  12007. for _, arg := range args.ToList() {
  12008. num := toExcelDateArg(arg)
  12009. if num.Type != ArgNumber {
  12010. continue
  12011. }
  12012. holidays = append(holidays, int(math.Ceil(num.Number)))
  12013. }
  12014. return holidays
  12015. }
  12016. // workdayIntl is an implementation of the formula function WORKDAY.INTL.
  12017. func workdayIntl(endDate, sign int, holidays []int, weekendMask []byte, startDate float64) int {
  12018. for i := 0; i < len(holidays); i++ {
  12019. holiday := holidays[i]
  12020. if sign > 0 {
  12021. if holiday > endDate {
  12022. break
  12023. }
  12024. } else {
  12025. if holiday < endDate {
  12026. break
  12027. }
  12028. }
  12029. if sign > 0 {
  12030. if holiday > int(math.Ceil(startDate)) {
  12031. if isWorkday(weekendMask, float64(holiday)) {
  12032. endDate += sign
  12033. for !isWorkday(weekendMask, float64(endDate)) {
  12034. endDate += sign
  12035. }
  12036. }
  12037. }
  12038. } else {
  12039. if holiday < int(math.Ceil(startDate)) {
  12040. if isWorkday(weekendMask, float64(holiday)) {
  12041. endDate += sign
  12042. for !isWorkday(weekendMask, float64(endDate)) {
  12043. endDate += sign
  12044. }
  12045. }
  12046. }
  12047. }
  12048. }
  12049. return endDate
  12050. }
  12051. // NETWORKDAYS function calculates the number of work days between two supplied
  12052. // dates (including the start and end date). The calculation includes all
  12053. // weekdays (Mon - Fri), excluding a supplied list of holidays. The syntax of
  12054. // the function is:
  12055. //
  12056. // NETWORKDAYS(start_date,end_date,[holidays])
  12057. func (fn *formulaFuncs) NETWORKDAYS(argsList *list.List) formulaArg {
  12058. if argsList.Len() < 2 {
  12059. return newErrorFormulaArg(formulaErrorVALUE, "NETWORKDAYS requires at least 2 arguments")
  12060. }
  12061. if argsList.Len() > 3 {
  12062. return newErrorFormulaArg(formulaErrorVALUE, "NETWORKDAYS requires at most 3 arguments")
  12063. }
  12064. args := list.New()
  12065. args.PushBack(argsList.Front().Value.(formulaArg))
  12066. args.PushBack(argsList.Front().Next().Value.(formulaArg))
  12067. args.PushBack(newNumberFormulaArg(1))
  12068. if argsList.Len() == 3 {
  12069. args.PushBack(argsList.Back().Value.(formulaArg))
  12070. }
  12071. return fn.NETWORKDAYSdotINTL(args)
  12072. }
  12073. // NETWORKDAYSdotINTL function calculates the number of whole work days between
  12074. // two supplied dates, excluding weekends and holidays. The function allows
  12075. // the user to specify which days are counted as weekends and holidays. The
  12076. // syntax of the function is:
  12077. //
  12078. // NETWORKDAYS.INTL(start_date,end_date,[weekend],[holidays])
  12079. func (fn *formulaFuncs) NETWORKDAYSdotINTL(argsList *list.List) formulaArg {
  12080. if argsList.Len() < 2 {
  12081. return newErrorFormulaArg(formulaErrorVALUE, "NETWORKDAYS.INTL requires at least 2 arguments")
  12082. }
  12083. if argsList.Len() > 4 {
  12084. return newErrorFormulaArg(formulaErrorVALUE, "NETWORKDAYS.INTL requires at most 4 arguments")
  12085. }
  12086. startDate := toExcelDateArg(argsList.Front().Value.(formulaArg))
  12087. if startDate.Type != ArgNumber {
  12088. return startDate
  12089. }
  12090. endDate := toExcelDateArg(argsList.Front().Next().Value.(formulaArg))
  12091. if endDate.Type != ArgNumber {
  12092. return endDate
  12093. }
  12094. weekend := newNumberFormulaArg(1)
  12095. if argsList.Len() > 2 {
  12096. weekend = argsList.Front().Next().Next().Value.(formulaArg)
  12097. }
  12098. var holidays []int
  12099. if argsList.Len() == 4 {
  12100. holidays = prepareHolidays(argsList.Back().Value.(formulaArg))
  12101. sort.Ints(holidays)
  12102. }
  12103. weekendMask, workdaysPerWeek := prepareWorkday(weekend)
  12104. if workdaysPerWeek == 0 {
  12105. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  12106. }
  12107. sign := 1
  12108. if startDate.Number > endDate.Number {
  12109. sign = -1
  12110. temp := startDate.Number
  12111. startDate.Number = endDate.Number
  12112. endDate.Number = temp
  12113. }
  12114. offset := endDate.Number - startDate.Number
  12115. count := int(math.Floor(offset/7) * float64(workdaysPerWeek))
  12116. daysMod := int(offset) % 7
  12117. for daysMod >= 0 {
  12118. if isWorkday(weekendMask, endDate.Number-float64(daysMod)) {
  12119. count++
  12120. }
  12121. daysMod--
  12122. }
  12123. for i := 0; i < len(holidays); i++ {
  12124. holiday := float64(holidays[i])
  12125. if isWorkday(weekendMask, holiday) && holiday >= startDate.Number && holiday <= endDate.Number {
  12126. count--
  12127. }
  12128. }
  12129. return newNumberFormulaArg(float64(sign * count))
  12130. }
  12131. // WORKDAY function returns a date that is a supplied number of working days
  12132. // (excluding weekends and holidays) ahead of a given start date. The syntax
  12133. // of the function is:
  12134. //
  12135. // WORKDAY(start_date,days,[holidays])
  12136. func (fn *formulaFuncs) WORKDAY(argsList *list.List) formulaArg {
  12137. if argsList.Len() < 2 {
  12138. return newErrorFormulaArg(formulaErrorVALUE, "WORKDAY requires at least 2 arguments")
  12139. }
  12140. if argsList.Len() > 3 {
  12141. return newErrorFormulaArg(formulaErrorVALUE, "WORKDAY requires at most 3 arguments")
  12142. }
  12143. args := list.New()
  12144. args.PushBack(argsList.Front().Value.(formulaArg))
  12145. args.PushBack(argsList.Front().Next().Value.(formulaArg))
  12146. args.PushBack(newNumberFormulaArg(1))
  12147. if argsList.Len() == 3 {
  12148. args.PushBack(argsList.Back().Value.(formulaArg))
  12149. }
  12150. return fn.WORKDAYdotINTL(args)
  12151. }
  12152. // WORKDAYdotINTL function returns a date that is a supplied number of working
  12153. // days (excluding weekends and holidays) ahead of a given start date. The
  12154. // function allows the user to specify which days of the week are counted as
  12155. // weekends. The syntax of the function is:
  12156. //
  12157. // WORKDAY.INTL(start_date,days,[weekend],[holidays])
  12158. func (fn *formulaFuncs) WORKDAYdotINTL(argsList *list.List) formulaArg {
  12159. if argsList.Len() < 2 {
  12160. return newErrorFormulaArg(formulaErrorVALUE, "WORKDAY.INTL requires at least 2 arguments")
  12161. }
  12162. if argsList.Len() > 4 {
  12163. return newErrorFormulaArg(formulaErrorVALUE, "WORKDAY.INTL requires at most 4 arguments")
  12164. }
  12165. startDate := toExcelDateArg(argsList.Front().Value.(formulaArg))
  12166. if startDate.Type != ArgNumber {
  12167. return startDate
  12168. }
  12169. days := argsList.Front().Next().Value.(formulaArg).ToNumber()
  12170. if days.Type != ArgNumber {
  12171. return days
  12172. }
  12173. weekend := newNumberFormulaArg(1)
  12174. if argsList.Len() > 2 {
  12175. weekend = argsList.Front().Next().Next().Value.(formulaArg)
  12176. }
  12177. var holidays []int
  12178. if argsList.Len() == 4 {
  12179. holidays = prepareHolidays(argsList.Back().Value.(formulaArg))
  12180. sort.Ints(holidays)
  12181. }
  12182. if days.Number == 0 {
  12183. return newNumberFormulaArg(math.Ceil(startDate.Number))
  12184. }
  12185. weekendMask, workdaysPerWeek := prepareWorkday(weekend)
  12186. if workdaysPerWeek == 0 {
  12187. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  12188. }
  12189. sign := 1
  12190. if days.Number < 0 {
  12191. sign = -1
  12192. }
  12193. offset := int(days.Number) / workdaysPerWeek
  12194. daysMod := int(days.Number) % workdaysPerWeek
  12195. endDate := int(math.Ceil(startDate.Number)) + offset*7
  12196. if daysMod == 0 {
  12197. for !isWorkday(weekendMask, float64(endDate)) {
  12198. endDate -= sign
  12199. }
  12200. } else {
  12201. for daysMod != 0 {
  12202. endDate += sign
  12203. if isWorkday(weekendMask, float64(endDate)) {
  12204. if daysMod < 0 {
  12205. daysMod++
  12206. continue
  12207. }
  12208. daysMod--
  12209. }
  12210. }
  12211. }
  12212. return newNumberFormulaArg(float64(workdayIntl(endDate, sign, holidays, weekendMask, startDate.Number)))
  12213. }
  12214. // YEAR function returns an integer representing the year of a supplied date.
  12215. // The syntax of the function is:
  12216. //
  12217. // YEAR(serial_number)
  12218. func (fn *formulaFuncs) YEAR(argsList *list.List) formulaArg {
  12219. if argsList.Len() != 1 {
  12220. return newErrorFormulaArg(formulaErrorVALUE, "YEAR requires exactly 1 argument")
  12221. }
  12222. arg := argsList.Front().Value.(formulaArg)
  12223. num := arg.ToNumber()
  12224. if num.Type != ArgNumber {
  12225. dateString := strings.ToLower(arg.Value())
  12226. if !isDateOnlyFmt(dateString) {
  12227. if _, _, _, _, _, err := strToTime(dateString); err.Type == ArgError {
  12228. return err
  12229. }
  12230. }
  12231. year, _, _, _, err := strToDate(dateString)
  12232. if err.Type == ArgError {
  12233. return err
  12234. }
  12235. return newNumberFormulaArg(float64(year))
  12236. }
  12237. if num.Number < 0 {
  12238. return newErrorFormulaArg(formulaErrorNUM, "YEAR only accepts positive argument")
  12239. }
  12240. return newNumberFormulaArg(float64(timeFromExcelTime(num.Number, false).Year()))
  12241. }
  12242. // yearFracBasisCond is an implementation of the yearFracBasis1.
  12243. func yearFracBasisCond(sy, sm, sd, ey, em, ed int) bool {
  12244. return (isLeapYear(sy) && (sm < 2 || (sm == 2 && sd <= 29))) || (isLeapYear(ey) && (em > 2 || (em == 2 && ed == 29)))
  12245. }
  12246. // yearFracBasis0 function returns the fraction of a year that between two
  12247. // supplied dates in US (NASD) 30/360 type of day.
  12248. func yearFracBasis0(startDate, endDate float64) (dayDiff, daysInYear float64) {
  12249. startTime, endTime := timeFromExcelTime(startDate, false), timeFromExcelTime(endDate, false)
  12250. sy, smM, sd := startTime.Date()
  12251. ey, emM, ed := endTime.Date()
  12252. sm, em := int(smM), int(emM)
  12253. if sd == 31 {
  12254. sd--
  12255. }
  12256. if sd == 30 && ed == 31 {
  12257. ed--
  12258. } else if leap := isLeapYear(sy); sm == 2 && ((leap && sd == 29) || (!leap && sd == 28)) {
  12259. sd = 30
  12260. if leap := isLeapYear(ey); em == 2 && ((leap && ed == 29) || (!leap && ed == 28)) {
  12261. ed = 30
  12262. }
  12263. }
  12264. dayDiff = float64((ey-sy)*360 + (em-sm)*30 + (ed - sd))
  12265. daysInYear = 360
  12266. return
  12267. }
  12268. // yearFracBasis1 function returns the fraction of a year that between two
  12269. // supplied dates in actual type of day.
  12270. func yearFracBasis1(startDate, endDate float64) (dayDiff, daysInYear float64) {
  12271. startTime, endTime := timeFromExcelTime(startDate, false), timeFromExcelTime(endDate, false)
  12272. sy, smM, sd := startTime.Date()
  12273. ey, emM, ed := endTime.Date()
  12274. sm, em := int(smM), int(emM)
  12275. dayDiff = endDate - startDate
  12276. isYearDifferent := sy != ey
  12277. if isYearDifferent && (ey != sy+1 || sm < em || (sm == em && sd < ed)) {
  12278. dayCount := 0
  12279. for y := sy; y <= ey; y++ {
  12280. dayCount += getYearDays(y, 1)
  12281. }
  12282. daysInYear = float64(dayCount) / float64(ey-sy+1)
  12283. } else {
  12284. if !isYearDifferent && isLeapYear(sy) {
  12285. daysInYear = 366
  12286. } else {
  12287. if isYearDifferent && yearFracBasisCond(sy, sm, sd, ey, em, ed) {
  12288. daysInYear = 366
  12289. } else {
  12290. daysInYear = 365
  12291. }
  12292. }
  12293. }
  12294. return
  12295. }
  12296. // yearFracBasis4 function returns the fraction of a year that between two
  12297. // supplied dates in European 30/360 type of day.
  12298. func yearFracBasis4(startDate, endDate float64) (dayDiff, daysInYear float64) {
  12299. startTime, endTime := timeFromExcelTime(startDate, false), timeFromExcelTime(endDate, false)
  12300. sy, smM, sd := startTime.Date()
  12301. ey, emM, ed := endTime.Date()
  12302. sm, em := int(smM), int(emM)
  12303. if sd == 31 {
  12304. sd--
  12305. }
  12306. if ed == 31 {
  12307. ed--
  12308. }
  12309. dayDiff = float64((ey-sy)*360 + (em-sm)*30 + (ed - sd))
  12310. daysInYear = 360
  12311. return
  12312. }
  12313. // yearFrac is an implementation of the formula function YEARFRAC.
  12314. func yearFrac(startDate, endDate float64, basis int) formulaArg {
  12315. startTime, endTime := timeFromExcelTime(startDate, false), timeFromExcelTime(endDate, false)
  12316. if startTime == endTime {
  12317. return newNumberFormulaArg(0)
  12318. }
  12319. var dayDiff, daysInYear float64
  12320. switch basis {
  12321. case 0:
  12322. dayDiff, daysInYear = yearFracBasis0(startDate, endDate)
  12323. case 1:
  12324. dayDiff, daysInYear = yearFracBasis1(startDate, endDate)
  12325. case 2:
  12326. dayDiff = endDate - startDate
  12327. daysInYear = 360
  12328. case 3:
  12329. dayDiff = endDate - startDate
  12330. daysInYear = 365
  12331. case 4:
  12332. dayDiff, daysInYear = yearFracBasis4(startDate, endDate)
  12333. default:
  12334. return newErrorFormulaArg(formulaErrorNUM, "invalid basis")
  12335. }
  12336. return newNumberFormulaArg(dayDiff / daysInYear)
  12337. }
  12338. // getYearDays return days of the year with specifying the type of day count
  12339. // basis to be used.
  12340. func getYearDays(year, basis int) int {
  12341. switch basis {
  12342. case 1:
  12343. if isLeapYear(year) {
  12344. return 366
  12345. }
  12346. return 365
  12347. case 3:
  12348. return 365
  12349. default:
  12350. return 360
  12351. }
  12352. }
  12353. // YEARFRAC function returns the fraction of a year that is represented by the
  12354. // number of whole days between two supplied dates. The syntax of the
  12355. // function is:
  12356. //
  12357. // YEARFRAC(start_date,end_date,[basis])
  12358. func (fn *formulaFuncs) YEARFRAC(argsList *list.List) formulaArg {
  12359. if argsList.Len() != 2 && argsList.Len() != 3 {
  12360. return newErrorFormulaArg(formulaErrorVALUE, "YEARFRAC requires 3 or 4 arguments")
  12361. }
  12362. args := fn.prepareDataValueArgs(2, argsList)
  12363. if args.Type != ArgList {
  12364. return args
  12365. }
  12366. start, end := args.List[0], args.List[1]
  12367. basis := newNumberFormulaArg(0)
  12368. if argsList.Len() == 3 {
  12369. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  12370. return basis
  12371. }
  12372. }
  12373. return yearFrac(start.Number, end.Number, int(basis.Number))
  12374. }
  12375. // NOW function returns the current date and time. The function receives no
  12376. // arguments and therefore. The syntax of the function is:
  12377. //
  12378. // NOW()
  12379. func (fn *formulaFuncs) NOW(argsList *list.List) formulaArg {
  12380. if argsList.Len() != 0 {
  12381. return newErrorFormulaArg(formulaErrorVALUE, "NOW accepts no arguments")
  12382. }
  12383. now := time.Now()
  12384. _, offset := now.Zone()
  12385. return newNumberFormulaArg(25569.0 + float64(now.Unix()+int64(offset))/86400)
  12386. }
  12387. // SECOND function returns an integer representing the second component of a
  12388. // supplied Excel time. The syntax of the function is:
  12389. //
  12390. // SECOND(serial_number)
  12391. func (fn *formulaFuncs) SECOND(argsList *list.List) formulaArg {
  12392. if argsList.Len() != 1 {
  12393. return newErrorFormulaArg(formulaErrorVALUE, "SECOND requires exactly 1 argument")
  12394. }
  12395. date := argsList.Front().Value.(formulaArg)
  12396. num := date.ToNumber()
  12397. if num.Type != ArgNumber {
  12398. timeString := strings.ToLower(date.Value())
  12399. if !isTimeOnlyFmt(timeString) {
  12400. _, _, _, _, err := strToDate(timeString)
  12401. if err.Type == ArgError {
  12402. return err
  12403. }
  12404. }
  12405. _, _, s, _, _, err := strToTime(timeString)
  12406. if err.Type == ArgError {
  12407. return err
  12408. }
  12409. return newNumberFormulaArg(float64(int(s) % 60))
  12410. }
  12411. if num.Number < 0 {
  12412. return newErrorFormulaArg(formulaErrorNUM, "SECOND only accepts positive argument")
  12413. }
  12414. return newNumberFormulaArg(float64(timeFromExcelTime(num.Number, false).Second()))
  12415. }
  12416. // TIME function accepts three integer arguments representing hours, minutes
  12417. // and seconds, and returns an Excel time. I.e. the function returns the
  12418. // decimal value that represents the time in Excel. The syntax of the
  12419. // function is:
  12420. //
  12421. // TIME(hour,minute,second)
  12422. func (fn *formulaFuncs) TIME(argsList *list.List) formulaArg {
  12423. if argsList.Len() != 3 {
  12424. return newErrorFormulaArg(formulaErrorVALUE, "TIME requires 3 number arguments")
  12425. }
  12426. h := argsList.Front().Value.(formulaArg).ToNumber()
  12427. m := argsList.Front().Next().Value.(formulaArg).ToNumber()
  12428. s := argsList.Back().Value.(formulaArg).ToNumber()
  12429. if h.Type != ArgNumber || m.Type != ArgNumber || s.Type != ArgNumber {
  12430. return newErrorFormulaArg(formulaErrorVALUE, "TIME requires 3 number arguments")
  12431. }
  12432. t := (h.Number*3600 + m.Number*60 + s.Number) / 86400
  12433. if t < 0 {
  12434. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  12435. }
  12436. return newNumberFormulaArg(t)
  12437. }
  12438. // TIMEVALUE function converts a text representation of a time, into an Excel
  12439. // time. The syntax of the function is:
  12440. //
  12441. // TIMEVALUE(time_text)
  12442. func (fn *formulaFuncs) TIMEVALUE(argsList *list.List) formulaArg {
  12443. if argsList.Len() != 1 {
  12444. return newErrorFormulaArg(formulaErrorVALUE, "TIMEVALUE requires exactly 1 argument")
  12445. }
  12446. date := argsList.Front().Value.(formulaArg)
  12447. timeString := strings.ToLower(date.Value())
  12448. if !isTimeOnlyFmt(timeString) {
  12449. _, _, _, _, err := strToDate(timeString)
  12450. if err.Type == ArgError {
  12451. return err
  12452. }
  12453. }
  12454. h, m, s, pm, _, err := strToTime(timeString)
  12455. if err.Type == ArgError {
  12456. return err
  12457. }
  12458. if pm {
  12459. h += 12
  12460. }
  12461. args := list.New()
  12462. args.PushBack(newNumberFormulaArg(float64(h)))
  12463. args.PushBack(newNumberFormulaArg(float64(m)))
  12464. args.PushBack(newNumberFormulaArg(s))
  12465. return fn.TIME(args)
  12466. }
  12467. // TODAY function returns the current date. The function has no arguments and
  12468. // therefore. The syntax of the function is:
  12469. //
  12470. // TODAY()
  12471. func (fn *formulaFuncs) TODAY(argsList *list.List) formulaArg {
  12472. if argsList.Len() != 0 {
  12473. return newErrorFormulaArg(formulaErrorVALUE, "TODAY accepts no arguments")
  12474. }
  12475. now := time.Now()
  12476. _, offset := now.Zone()
  12477. return newNumberFormulaArg(daysBetween(excelMinTime1900.Unix(), now.Unix()+int64(offset)) + 1)
  12478. }
  12479. // makeDate return date as a Unix time, the number of seconds elapsed since
  12480. // January 1, 1970 UTC.
  12481. func makeDate(y int, m time.Month, d int) int64 {
  12482. if y == 1900 && int(m) <= 2 {
  12483. d--
  12484. }
  12485. date := time.Date(y, m, d, 0, 0, 0, 0, time.UTC)
  12486. return date.Unix()
  12487. }
  12488. // daysBetween return time interval of the given start timestamp and end
  12489. // timestamp.
  12490. func daysBetween(startDate, endDate int64) float64 {
  12491. return float64(int(0.5 + float64((endDate-startDate)/86400)))
  12492. }
  12493. // WEEKDAY function returns an integer representing the day of the week for a
  12494. // supplied date. The syntax of the function is:
  12495. //
  12496. // WEEKDAY(serial_number,[return_type])
  12497. func (fn *formulaFuncs) WEEKDAY(argsList *list.List) formulaArg {
  12498. if argsList.Len() < 1 {
  12499. return newErrorFormulaArg(formulaErrorVALUE, "WEEKDAY requires at least 1 argument")
  12500. }
  12501. if argsList.Len() > 2 {
  12502. return newErrorFormulaArg(formulaErrorVALUE, "WEEKDAY allows at most 2 arguments")
  12503. }
  12504. sn := argsList.Front().Value.(formulaArg)
  12505. num := sn.ToNumber()
  12506. weekday, returnType := 0, 1
  12507. if num.Type != ArgNumber {
  12508. dateString := strings.ToLower(sn.Value())
  12509. if !isDateOnlyFmt(dateString) {
  12510. if _, _, _, _, _, err := strToTime(dateString); err.Type == ArgError {
  12511. return err
  12512. }
  12513. }
  12514. y, m, d, _, err := strToDate(dateString)
  12515. if err.Type == ArgError {
  12516. return err
  12517. }
  12518. weekday = int(time.Date(y, time.Month(m), d, 0, 0, 0, 0, time.Now().Location()).Weekday())
  12519. } else {
  12520. if num.Number < 0 {
  12521. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  12522. }
  12523. weekday = int(timeFromExcelTime(num.Number, false).Weekday())
  12524. }
  12525. if argsList.Len() == 2 {
  12526. returnTypeArg := argsList.Back().Value.(formulaArg).ToNumber()
  12527. if returnTypeArg.Type != ArgNumber {
  12528. return returnTypeArg
  12529. }
  12530. returnType = int(returnTypeArg.Number)
  12531. }
  12532. if returnType == 2 {
  12533. returnType = 11
  12534. }
  12535. weekday++
  12536. if returnType == 1 {
  12537. return newNumberFormulaArg(float64(weekday))
  12538. }
  12539. if returnType == 3 {
  12540. return newNumberFormulaArg(float64((weekday + 6 - 1) % 7))
  12541. }
  12542. if returnType >= 11 && returnType <= 17 {
  12543. return newNumberFormulaArg(float64((weekday+6-(returnType-10))%7 + 1))
  12544. }
  12545. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  12546. }
  12547. // weeknum is an implementation of the formula function WEEKNUM.
  12548. func (fn *formulaFuncs) weeknum(snTime time.Time, returnType int) formulaArg {
  12549. days := snTime.YearDay()
  12550. weekMod, weekNum := days%7, math.Ceil(float64(days)/7)
  12551. if weekMod == 0 {
  12552. weekMod = 7
  12553. }
  12554. year := snTime.Year()
  12555. firstWeekday := int(time.Date(year, time.January, 1, 0, 0, 0, 0, time.UTC).Weekday())
  12556. var offset int
  12557. switch returnType {
  12558. case 1, 17:
  12559. offset = 0
  12560. case 2, 11, 21:
  12561. offset = 1
  12562. case 12, 13, 14, 15, 16:
  12563. offset = returnType - 10
  12564. default:
  12565. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  12566. }
  12567. padding := offset + 7 - firstWeekday
  12568. if padding > 7 {
  12569. padding -= 7
  12570. }
  12571. if weekMod > padding {
  12572. weekNum++
  12573. }
  12574. if returnType == 21 && (firstWeekday == 0 || firstWeekday > 4) {
  12575. if weekNum--; weekNum < 1 {
  12576. if weekNum = 52; int(time.Date(year-1, time.January, 1, 0, 0, 0, 0, time.UTC).Weekday()) < 4 {
  12577. weekNum++
  12578. }
  12579. }
  12580. }
  12581. return newNumberFormulaArg(weekNum)
  12582. }
  12583. // WEEKNUM function returns an integer representing the week number (from 1 to
  12584. // 53) of the year. The syntax of the function is:
  12585. //
  12586. // WEEKNUM(serial_number,[return_type])
  12587. func (fn *formulaFuncs) WEEKNUM(argsList *list.List) formulaArg {
  12588. if argsList.Len() < 1 {
  12589. return newErrorFormulaArg(formulaErrorVALUE, "WEEKNUM requires at least 1 argument")
  12590. }
  12591. if argsList.Len() > 2 {
  12592. return newErrorFormulaArg(formulaErrorVALUE, "WEEKNUM allows at most 2 arguments")
  12593. }
  12594. sn := argsList.Front().Value.(formulaArg)
  12595. num, returnType := sn.ToNumber(), 1
  12596. var snTime time.Time
  12597. if num.Type != ArgNumber {
  12598. dateString := strings.ToLower(sn.Value())
  12599. if !isDateOnlyFmt(dateString) {
  12600. if _, _, _, _, _, err := strToTime(dateString); err.Type == ArgError {
  12601. return err
  12602. }
  12603. }
  12604. y, m, d, _, err := strToDate(dateString)
  12605. if err.Type == ArgError {
  12606. return err
  12607. }
  12608. snTime = time.Date(y, time.Month(m), d, 0, 0, 0, 0, time.Now().Location())
  12609. } else {
  12610. if num.Number < 0 {
  12611. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  12612. }
  12613. snTime = timeFromExcelTime(num.Number, false)
  12614. }
  12615. if argsList.Len() == 2 {
  12616. returnTypeArg := argsList.Back().Value.(formulaArg).ToNumber()
  12617. if returnTypeArg.Type != ArgNumber {
  12618. return returnTypeArg
  12619. }
  12620. returnType = int(returnTypeArg.Number)
  12621. }
  12622. return fn.weeknum(snTime, returnType)
  12623. }
  12624. // Text Functions
  12625. // CHAR function returns the character relating to a supplied character set
  12626. // number (from 1 to 255). syntax of the function is:
  12627. //
  12628. // CHAR(number)
  12629. func (fn *formulaFuncs) CHAR(argsList *list.List) formulaArg {
  12630. if argsList.Len() != 1 {
  12631. return newErrorFormulaArg(formulaErrorVALUE, "CHAR requires 1 argument")
  12632. }
  12633. arg := argsList.Front().Value.(formulaArg).ToNumber()
  12634. if arg.Type != ArgNumber {
  12635. return arg
  12636. }
  12637. num := int(arg.Number)
  12638. if num < 0 || num > MaxFieldLength {
  12639. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  12640. }
  12641. return newStringFormulaArg(fmt.Sprintf("%c", num))
  12642. }
  12643. // CLEAN removes all non-printable characters from a supplied text string. The
  12644. // syntax of the function is:
  12645. //
  12646. // CLEAN(text)
  12647. func (fn *formulaFuncs) CLEAN(argsList *list.List) formulaArg {
  12648. if argsList.Len() != 1 {
  12649. return newErrorFormulaArg(formulaErrorVALUE, "CLEAN requires 1 argument")
  12650. }
  12651. b := bytes.Buffer{}
  12652. for _, c := range argsList.Front().Value.(formulaArg).Value() {
  12653. if c > 31 {
  12654. b.WriteRune(c)
  12655. }
  12656. }
  12657. return newStringFormulaArg(b.String())
  12658. }
  12659. // CODE function converts the first character of a supplied text string into
  12660. // the associated numeric character set code used by your computer. The
  12661. // syntax of the function is:
  12662. //
  12663. // CODE(text)
  12664. func (fn *formulaFuncs) CODE(argsList *list.List) formulaArg {
  12665. return fn.code("CODE", argsList)
  12666. }
  12667. // code is an implementation of the formula functions CODE and UNICODE.
  12668. func (fn *formulaFuncs) code(name string, argsList *list.List) formulaArg {
  12669. if argsList.Len() != 1 {
  12670. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 1 argument", name))
  12671. }
  12672. text := argsList.Front().Value.(formulaArg).Value()
  12673. if len(text) == 0 {
  12674. if name == "CODE" {
  12675. return newNumberFormulaArg(0)
  12676. }
  12677. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  12678. }
  12679. return newNumberFormulaArg(float64(text[0]))
  12680. }
  12681. // CONCAT function joins together a series of supplied text strings into one
  12682. // combined text string.
  12683. //
  12684. // CONCAT(text1,[text2],...)
  12685. func (fn *formulaFuncs) CONCAT(argsList *list.List) formulaArg {
  12686. return fn.concat("CONCAT", argsList)
  12687. }
  12688. // CONCATENATE function joins together a series of supplied text strings into
  12689. // one combined text string.
  12690. //
  12691. // CONCATENATE(text1,[text2],...)
  12692. func (fn *formulaFuncs) CONCATENATE(argsList *list.List) formulaArg {
  12693. return fn.concat("CONCATENATE", argsList)
  12694. }
  12695. // concat is an implementation of the formula functions CONCAT and
  12696. // CONCATENATE.
  12697. func (fn *formulaFuncs) concat(name string, argsList *list.List) formulaArg {
  12698. buf := bytes.Buffer{}
  12699. for arg := argsList.Front(); arg != nil; arg = arg.Next() {
  12700. token := arg.Value.(formulaArg)
  12701. switch token.Type {
  12702. case ArgString:
  12703. buf.WriteString(token.String)
  12704. case ArgNumber:
  12705. if token.Boolean {
  12706. if token.Number == 0 {
  12707. buf.WriteString("FALSE")
  12708. } else {
  12709. buf.WriteString("TRUE")
  12710. }
  12711. } else {
  12712. buf.WriteString(token.Value())
  12713. }
  12714. default:
  12715. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires arguments to be strings", name))
  12716. }
  12717. }
  12718. return newStringFormulaArg(buf.String())
  12719. }
  12720. // EXACT function tests if two supplied text strings or values are exactly
  12721. // equal and if so, returns TRUE; Otherwise, the function returns FALSE. The
  12722. // function is case-sensitive. The syntax of the function is:
  12723. //
  12724. // EXACT(text1,text2)
  12725. func (fn *formulaFuncs) EXACT(argsList *list.List) formulaArg {
  12726. if argsList.Len() != 2 {
  12727. return newErrorFormulaArg(formulaErrorVALUE, "EXACT requires 2 arguments")
  12728. }
  12729. text1 := argsList.Front().Value.(formulaArg).Value()
  12730. text2 := argsList.Back().Value.(formulaArg).Value()
  12731. return newBoolFormulaArg(text1 == text2)
  12732. }
  12733. // FIXED function rounds a supplied number to a specified number of decimal
  12734. // places and then converts this into text. The syntax of the function is:
  12735. //
  12736. // FIXED(number,[decimals],[no_commas])
  12737. func (fn *formulaFuncs) FIXED(argsList *list.List) formulaArg {
  12738. if argsList.Len() < 1 {
  12739. return newErrorFormulaArg(formulaErrorVALUE, "FIXED requires at least 1 argument")
  12740. }
  12741. if argsList.Len() > 3 {
  12742. return newErrorFormulaArg(formulaErrorVALUE, "FIXED allows at most 3 arguments")
  12743. }
  12744. numArg := argsList.Front().Value.(formulaArg).ToNumber()
  12745. if numArg.Type != ArgNumber {
  12746. return numArg
  12747. }
  12748. precision, decimals, noCommas := 0, 0, false
  12749. s := strings.Split(argsList.Front().Value.(formulaArg).Value(), ".")
  12750. if argsList.Len() == 1 && len(s) == 2 {
  12751. precision = len(s[1])
  12752. decimals = len(s[1])
  12753. }
  12754. if argsList.Len() >= 2 {
  12755. decimalsArg := argsList.Front().Next().Value.(formulaArg).ToNumber()
  12756. if decimalsArg.Type != ArgNumber {
  12757. return decimalsArg
  12758. }
  12759. decimals = int(decimalsArg.Number)
  12760. }
  12761. if argsList.Len() == 3 {
  12762. noCommasArg := argsList.Back().Value.(formulaArg).ToBool()
  12763. if noCommasArg.Type == ArgError {
  12764. return noCommasArg
  12765. }
  12766. noCommas = noCommasArg.Boolean
  12767. }
  12768. n := math.Pow(10, float64(decimals))
  12769. r := numArg.Number * n
  12770. fixed := float64(int(r+math.Copysign(0.5, r))) / n
  12771. if decimals > 0 {
  12772. precision = decimals
  12773. }
  12774. if noCommas {
  12775. return newStringFormulaArg(fmt.Sprintf(fmt.Sprintf("%%.%df", precision), fixed))
  12776. }
  12777. p := message.NewPrinter(language.English)
  12778. return newStringFormulaArg(p.Sprintf(fmt.Sprintf("%%.%df", precision), fixed))
  12779. }
  12780. // FIND function returns the position of a specified character or sub-string
  12781. // within a supplied text string. The function is case-sensitive. The syntax
  12782. // of the function is:
  12783. //
  12784. // FIND(find_text,within_text,[start_num])
  12785. func (fn *formulaFuncs) FIND(argsList *list.List) formulaArg {
  12786. return fn.find("FIND", argsList)
  12787. }
  12788. // FINDB counts each double-byte character as 2 when you have enabled the
  12789. // editing of a language that supports DBCS and then set it as the default
  12790. // language. Otherwise, FINDB counts each character as 1. The syntax of the
  12791. // function is:
  12792. //
  12793. // FINDB(find_text,within_text,[start_num])
  12794. func (fn *formulaFuncs) FINDB(argsList *list.List) formulaArg {
  12795. return fn.find("FINDB", argsList)
  12796. }
  12797. // find is an implementation of the formula functions FIND and FINDB.
  12798. func (fn *formulaFuncs) find(name string, argsList *list.List) formulaArg {
  12799. if argsList.Len() < 2 {
  12800. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at least 2 arguments", name))
  12801. }
  12802. if argsList.Len() > 3 {
  12803. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s allows at most 3 arguments", name))
  12804. }
  12805. findText := argsList.Front().Value.(formulaArg).Value()
  12806. withinText := argsList.Front().Next().Value.(formulaArg).Value()
  12807. startNum, result := 1, 1
  12808. if argsList.Len() == 3 {
  12809. numArg := argsList.Back().Value.(formulaArg).ToNumber()
  12810. if numArg.Type != ArgNumber {
  12811. return numArg
  12812. }
  12813. if numArg.Number < 0 {
  12814. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  12815. }
  12816. startNum = int(numArg.Number)
  12817. }
  12818. if findText == "" {
  12819. return newNumberFormulaArg(float64(startNum))
  12820. }
  12821. for idx := range withinText {
  12822. if result < startNum {
  12823. result++
  12824. }
  12825. if strings.Index(withinText[idx:], findText) == 0 {
  12826. return newNumberFormulaArg(float64(result))
  12827. }
  12828. result++
  12829. }
  12830. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  12831. }
  12832. // LEFT function returns a specified number of characters from the start of a
  12833. // supplied text string. The syntax of the function is:
  12834. //
  12835. // LEFT(text,[num_chars])
  12836. func (fn *formulaFuncs) LEFT(argsList *list.List) formulaArg {
  12837. return fn.leftRight("LEFT", argsList)
  12838. }
  12839. // LEFTB returns the first character or characters in a text string, based on
  12840. // the number of bytes you specify. The syntax of the function is:
  12841. //
  12842. // LEFTB(text,[num_bytes])
  12843. func (fn *formulaFuncs) LEFTB(argsList *list.List) formulaArg {
  12844. return fn.leftRight("LEFTB", argsList)
  12845. }
  12846. // leftRight is an implementation of the formula functions LEFT, LEFTB, RIGHT,
  12847. // RIGHTB.
  12848. func (fn *formulaFuncs) leftRight(name string, argsList *list.List) formulaArg {
  12849. if argsList.Len() < 1 {
  12850. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at least 1 argument", name))
  12851. }
  12852. if argsList.Len() > 2 {
  12853. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s allows at most 2 arguments", name))
  12854. }
  12855. text, numChars := argsList.Front().Value.(formulaArg).Value(), 1
  12856. if argsList.Len() == 2 {
  12857. numArg := argsList.Back().Value.(formulaArg).ToNumber()
  12858. if numArg.Type != ArgNumber {
  12859. return numArg
  12860. }
  12861. if numArg.Number < 0 {
  12862. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  12863. }
  12864. numChars = int(numArg.Number)
  12865. }
  12866. if name == "LEFTB" || name == "RIGHTB" {
  12867. if len(text) > numChars {
  12868. if name == "LEFTB" {
  12869. return newStringFormulaArg(text[:numChars])
  12870. }
  12871. // RIGHTB
  12872. return newStringFormulaArg(text[len(text)-numChars:])
  12873. }
  12874. return newStringFormulaArg(text)
  12875. }
  12876. // LEFT/RIGHT
  12877. if utf8.RuneCountInString(text) > numChars {
  12878. if name == "LEFT" {
  12879. return newStringFormulaArg(string([]rune(text)[:numChars]))
  12880. }
  12881. // RIGHT
  12882. return newStringFormulaArg(string([]rune(text)[utf8.RuneCountInString(text)-numChars:]))
  12883. }
  12884. return newStringFormulaArg(text)
  12885. }
  12886. // LEN returns the length of a supplied text string. The syntax of the
  12887. // function is:
  12888. //
  12889. // LEN(text)
  12890. func (fn *formulaFuncs) LEN(argsList *list.List) formulaArg {
  12891. if argsList.Len() != 1 {
  12892. return newErrorFormulaArg(formulaErrorVALUE, "LEN requires 1 string argument")
  12893. }
  12894. return newStringFormulaArg(strconv.Itoa(utf8.RuneCountInString(argsList.Front().Value.(formulaArg).String)))
  12895. }
  12896. // LENB returns the number of bytes used to represent the characters in a text
  12897. // string. LENB counts 2 bytes per character only when a DBCS language is set
  12898. // as the default language. Otherwise LENB behaves the same as LEN, counting
  12899. // 1 byte per character. The syntax of the function is:
  12900. //
  12901. // LENB(text)
  12902. func (fn *formulaFuncs) LENB(argsList *list.List) formulaArg {
  12903. if argsList.Len() != 1 {
  12904. return newErrorFormulaArg(formulaErrorVALUE, "LENB requires 1 string argument")
  12905. }
  12906. bytes := 0
  12907. for _, r := range argsList.Front().Value.(formulaArg).Value() {
  12908. b := utf8.RuneLen(r)
  12909. if b == 1 {
  12910. bytes++
  12911. } else if b > 1 {
  12912. bytes += 2
  12913. }
  12914. }
  12915. return newStringFormulaArg(strconv.Itoa(bytes))
  12916. }
  12917. // LOWER converts all characters in a supplied text string to lower case. The
  12918. // syntax of the function is:
  12919. //
  12920. // LOWER(text)
  12921. func (fn *formulaFuncs) LOWER(argsList *list.List) formulaArg {
  12922. if argsList.Len() != 1 {
  12923. return newErrorFormulaArg(formulaErrorVALUE, "LOWER requires 1 argument")
  12924. }
  12925. return newStringFormulaArg(strings.ToLower(argsList.Front().Value.(formulaArg).String))
  12926. }
  12927. // MID function returns a specified number of characters from the middle of a
  12928. // supplied text string. The syntax of the function is:
  12929. //
  12930. // MID(text,start_num,num_chars)
  12931. func (fn *formulaFuncs) MID(argsList *list.List) formulaArg {
  12932. return fn.mid("MID", argsList)
  12933. }
  12934. // MIDB returns a specific number of characters from a text string, starting
  12935. // at the position you specify, based on the number of bytes you specify. The
  12936. // syntax of the function is:
  12937. //
  12938. // MID(text,start_num,num_chars)
  12939. func (fn *formulaFuncs) MIDB(argsList *list.List) formulaArg {
  12940. return fn.mid("MIDB", argsList)
  12941. }
  12942. // mid is an implementation of the formula functions MID and MIDB.
  12943. func (fn *formulaFuncs) mid(name string, argsList *list.List) formulaArg {
  12944. if argsList.Len() != 3 {
  12945. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 3 arguments", name))
  12946. }
  12947. text := argsList.Front().Value.(formulaArg).Value()
  12948. startNumArg, numCharsArg := argsList.Front().Next().Value.(formulaArg).ToNumber(), argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  12949. if startNumArg.Type != ArgNumber {
  12950. return startNumArg
  12951. }
  12952. if numCharsArg.Type != ArgNumber {
  12953. return numCharsArg
  12954. }
  12955. startNum := int(startNumArg.Number)
  12956. if startNum < 0 {
  12957. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  12958. }
  12959. if name == "MIDB" {
  12960. textLen := len(text)
  12961. if startNum > textLen {
  12962. return newStringFormulaArg("")
  12963. }
  12964. startNum--
  12965. endNum := startNum + int(numCharsArg.Number)
  12966. if endNum > textLen+1 {
  12967. return newStringFormulaArg(text[startNum:])
  12968. }
  12969. return newStringFormulaArg(text[startNum:endNum])
  12970. }
  12971. // MID
  12972. textLen := utf8.RuneCountInString(text)
  12973. if startNum > textLen {
  12974. return newStringFormulaArg("")
  12975. }
  12976. startNum--
  12977. endNum := startNum + int(numCharsArg.Number)
  12978. if endNum > textLen+1 {
  12979. return newStringFormulaArg(string([]rune(text)[startNum:]))
  12980. }
  12981. return newStringFormulaArg(string([]rune(text)[startNum:endNum]))
  12982. }
  12983. // PROPER converts all characters in a supplied text string to proper case
  12984. // (i.e. all letters that do not immediately follow another letter are set to
  12985. // upper case and all other characters are lower case). The syntax of the
  12986. // function is:
  12987. //
  12988. // PROPER(text)
  12989. func (fn *formulaFuncs) PROPER(argsList *list.List) formulaArg {
  12990. if argsList.Len() != 1 {
  12991. return newErrorFormulaArg(formulaErrorVALUE, "PROPER requires 1 argument")
  12992. }
  12993. buf := bytes.Buffer{}
  12994. isLetter := false
  12995. for _, char := range argsList.Front().Value.(formulaArg).String {
  12996. if !isLetter && unicode.IsLetter(char) {
  12997. buf.WriteRune(unicode.ToUpper(char))
  12998. } else {
  12999. buf.WriteRune(unicode.ToLower(char))
  13000. }
  13001. isLetter = unicode.IsLetter(char)
  13002. }
  13003. return newStringFormulaArg(buf.String())
  13004. }
  13005. // REPLACE function replaces all or part of a text string with another string.
  13006. // The syntax of the function is:
  13007. //
  13008. // REPLACE(old_text,start_num,num_chars,new_text)
  13009. func (fn *formulaFuncs) REPLACE(argsList *list.List) formulaArg {
  13010. return fn.replace("REPLACE", argsList)
  13011. }
  13012. // REPLACEB replaces part of a text string, based on the number of bytes you
  13013. // specify, with a different text string.
  13014. //
  13015. // REPLACEB(old_text,start_num,num_chars,new_text)
  13016. func (fn *formulaFuncs) REPLACEB(argsList *list.List) formulaArg {
  13017. return fn.replace("REPLACEB", argsList)
  13018. }
  13019. // replace is an implementation of the formula functions REPLACE and REPLACEB.
  13020. // TODO: support DBCS include Japanese, Chinese (Simplified), Chinese
  13021. // (Traditional), and Korean.
  13022. func (fn *formulaFuncs) replace(name string, argsList *list.List) formulaArg {
  13023. if argsList.Len() != 4 {
  13024. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 4 arguments", name))
  13025. }
  13026. sourceText, targetText := argsList.Front().Value.(formulaArg).Value(), argsList.Back().Value.(formulaArg).Value()
  13027. startNumArg, numCharsArg := argsList.Front().Next().Value.(formulaArg).ToNumber(), argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  13028. if startNumArg.Type != ArgNumber {
  13029. return startNumArg
  13030. }
  13031. if numCharsArg.Type != ArgNumber {
  13032. return numCharsArg
  13033. }
  13034. sourceTextLen, startIdx := len(sourceText), int(startNumArg.Number)
  13035. if startIdx > sourceTextLen {
  13036. startIdx = sourceTextLen + 1
  13037. }
  13038. endIdx := startIdx + int(numCharsArg.Number)
  13039. if endIdx > sourceTextLen {
  13040. endIdx = sourceTextLen + 1
  13041. }
  13042. if startIdx < 1 || endIdx < 1 {
  13043. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  13044. }
  13045. result := sourceText[:startIdx-1] + targetText + sourceText[endIdx-1:]
  13046. return newStringFormulaArg(result)
  13047. }
  13048. // REPT function returns a supplied text string, repeated a specified number
  13049. // of times. The syntax of the function is:
  13050. //
  13051. // REPT(text,number_times)
  13052. func (fn *formulaFuncs) REPT(argsList *list.List) formulaArg {
  13053. if argsList.Len() != 2 {
  13054. return newErrorFormulaArg(formulaErrorVALUE, "REPT requires 2 arguments")
  13055. }
  13056. text := argsList.Front().Value.(formulaArg)
  13057. if text.Type != ArgString {
  13058. return newErrorFormulaArg(formulaErrorVALUE, "REPT requires first argument to be a string")
  13059. }
  13060. times := argsList.Back().Value.(formulaArg).ToNumber()
  13061. if times.Type != ArgNumber {
  13062. return newErrorFormulaArg(formulaErrorVALUE, "REPT requires second argument to be a number")
  13063. }
  13064. if times.Number < 0 {
  13065. return newErrorFormulaArg(formulaErrorVALUE, "REPT requires second argument to be >= 0")
  13066. }
  13067. if times.Number == 0 {
  13068. return newStringFormulaArg("")
  13069. }
  13070. buf := bytes.Buffer{}
  13071. for i := 0; i < int(times.Number); i++ {
  13072. buf.WriteString(text.String)
  13073. }
  13074. return newStringFormulaArg(buf.String())
  13075. }
  13076. // RIGHT function returns a specified number of characters from the end of a
  13077. // supplied text string. The syntax of the function is:
  13078. //
  13079. // RIGHT(text,[num_chars])
  13080. func (fn *formulaFuncs) RIGHT(argsList *list.List) formulaArg {
  13081. return fn.leftRight("RIGHT", argsList)
  13082. }
  13083. // RIGHTB returns the last character or characters in a text string, based on
  13084. // the number of bytes you specify. The syntax of the function is:
  13085. //
  13086. // RIGHTB(text,[num_bytes])
  13087. func (fn *formulaFuncs) RIGHTB(argsList *list.List) formulaArg {
  13088. return fn.leftRight("RIGHTB", argsList)
  13089. }
  13090. // SUBSTITUTE function replaces one or more instances of a given text string,
  13091. // within an original text string. The syntax of the function is:
  13092. //
  13093. // SUBSTITUTE(text,old_text,new_text,[instance_num])
  13094. func (fn *formulaFuncs) SUBSTITUTE(argsList *list.List) formulaArg {
  13095. if argsList.Len() != 3 && argsList.Len() != 4 {
  13096. return newErrorFormulaArg(formulaErrorVALUE, "SUBSTITUTE requires 3 or 4 arguments")
  13097. }
  13098. text, sourceText := argsList.Front().Value.(formulaArg), argsList.Front().Next().Value.(formulaArg)
  13099. targetText, instanceNum := argsList.Front().Next().Next().Value.(formulaArg), 0
  13100. if argsList.Len() == 3 {
  13101. return newStringFormulaArg(strings.ReplaceAll(text.Value(), sourceText.Value(), targetText.Value()))
  13102. }
  13103. instanceNumArg := argsList.Back().Value.(formulaArg).ToNumber()
  13104. if instanceNumArg.Type != ArgNumber {
  13105. return instanceNumArg
  13106. }
  13107. instanceNum = int(instanceNumArg.Number)
  13108. if instanceNum < 1 {
  13109. return newErrorFormulaArg(formulaErrorVALUE, "instance_num should be > 0")
  13110. }
  13111. str, sourceTextLen, count, chars, pos := text.Value(), len(sourceText.Value()), instanceNum, 0, -1
  13112. for {
  13113. count--
  13114. index := strings.Index(str, sourceText.Value())
  13115. if index == -1 {
  13116. pos = -1
  13117. break
  13118. } else {
  13119. pos = index + chars
  13120. if count == 0 {
  13121. break
  13122. }
  13123. idx := sourceTextLen + index
  13124. chars += idx
  13125. str = str[idx:]
  13126. }
  13127. }
  13128. if pos == -1 {
  13129. return newStringFormulaArg(text.Value())
  13130. }
  13131. pre, post := text.Value()[:pos], text.Value()[pos+sourceTextLen:]
  13132. return newStringFormulaArg(pre + targetText.Value() + post)
  13133. }
  13134. // TEXTJOIN function joins together a series of supplied text strings into one
  13135. // combined text string. The user can specify a delimiter to add between the
  13136. // individual text items, if required. The syntax of the function is:
  13137. //
  13138. // TEXTJOIN([delimiter],[ignore_empty],text1,[text2],...)
  13139. func (fn *formulaFuncs) TEXTJOIN(argsList *list.List) formulaArg {
  13140. if argsList.Len() < 3 {
  13141. return newErrorFormulaArg(formulaErrorVALUE, "TEXTJOIN requires at least 3 arguments")
  13142. }
  13143. if argsList.Len() > 252 {
  13144. return newErrorFormulaArg(formulaErrorVALUE, "TEXTJOIN accepts at most 252 arguments")
  13145. }
  13146. delimiter := argsList.Front().Value.(formulaArg)
  13147. ignoreEmpty := argsList.Front().Next().Value.(formulaArg)
  13148. if ignoreEmpty.Type != ArgNumber || !ignoreEmpty.Boolean {
  13149. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  13150. }
  13151. args, ok := textJoin(argsList.Front().Next().Next(), []string{}, ignoreEmpty.Number != 0)
  13152. if ok.Type != ArgNumber {
  13153. return ok
  13154. }
  13155. result := strings.Join(args, delimiter.Value())
  13156. if len(result) > TotalCellChars {
  13157. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("TEXTJOIN function exceeds %d characters", TotalCellChars))
  13158. }
  13159. return newStringFormulaArg(result)
  13160. }
  13161. // textJoin is an implementation of the formula function TEXTJOIN.
  13162. func textJoin(arg *list.Element, arr []string, ignoreEmpty bool) ([]string, formulaArg) {
  13163. for arg.Next(); arg != nil; arg = arg.Next() {
  13164. switch arg.Value.(formulaArg).Type {
  13165. case ArgError:
  13166. return arr, arg.Value.(formulaArg)
  13167. case ArgString, ArgEmpty:
  13168. val := arg.Value.(formulaArg).Value()
  13169. if val != "" || !ignoreEmpty {
  13170. arr = append(arr, val)
  13171. }
  13172. case ArgNumber:
  13173. arr = append(arr, arg.Value.(formulaArg).Value())
  13174. case ArgMatrix:
  13175. for _, row := range arg.Value.(formulaArg).Matrix {
  13176. argList := list.New().Init()
  13177. for _, ele := range row {
  13178. argList.PushBack(ele)
  13179. }
  13180. if argList.Len() > 0 {
  13181. args, _ := textJoin(argList.Front(), []string{}, ignoreEmpty)
  13182. arr = append(arr, args...)
  13183. }
  13184. }
  13185. }
  13186. }
  13187. return arr, newBoolFormulaArg(true)
  13188. }
  13189. // TRIM removes extra spaces (i.e. all spaces except for single spaces between
  13190. // words or characters) from a supplied text string. The syntax of the
  13191. // function is:
  13192. //
  13193. // TRIM(text)
  13194. func (fn *formulaFuncs) TRIM(argsList *list.List) formulaArg {
  13195. if argsList.Len() != 1 {
  13196. return newErrorFormulaArg(formulaErrorVALUE, "TRIM requires 1 argument")
  13197. }
  13198. return newStringFormulaArg(strings.TrimSpace(argsList.Front().Value.(formulaArg).Value()))
  13199. }
  13200. // UNICHAR returns the Unicode character that is referenced by the given
  13201. // numeric value. The syntax of the function is:
  13202. //
  13203. // UNICHAR(number)
  13204. func (fn *formulaFuncs) UNICHAR(argsList *list.List) formulaArg {
  13205. if argsList.Len() != 1 {
  13206. return newErrorFormulaArg(formulaErrorVALUE, "UNICHAR requires 1 argument")
  13207. }
  13208. numArg := argsList.Front().Value.(formulaArg).ToNumber()
  13209. if numArg.Type != ArgNumber {
  13210. return numArg
  13211. }
  13212. if numArg.Number <= 0 || numArg.Number > 55295 {
  13213. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  13214. }
  13215. return newStringFormulaArg(string(rune(numArg.Number)))
  13216. }
  13217. // UNICODE function returns the code point for the first character of a
  13218. // supplied text string. The syntax of the function is:
  13219. //
  13220. // UNICODE(text)
  13221. func (fn *formulaFuncs) UNICODE(argsList *list.List) formulaArg {
  13222. return fn.code("UNICODE", argsList)
  13223. }
  13224. // UPPER converts all characters in a supplied text string to upper case. The
  13225. // syntax of the function is:
  13226. //
  13227. // UPPER(text)
  13228. func (fn *formulaFuncs) UPPER(argsList *list.List) formulaArg {
  13229. if argsList.Len() != 1 {
  13230. return newErrorFormulaArg(formulaErrorVALUE, "UPPER requires 1 argument")
  13231. }
  13232. return newStringFormulaArg(strings.ToUpper(argsList.Front().Value.(formulaArg).String))
  13233. }
  13234. // VALUE function converts a text string into a numeric value. The syntax of
  13235. // the function is:
  13236. //
  13237. // VALUE(text)
  13238. func (fn *formulaFuncs) VALUE(argsList *list.List) formulaArg {
  13239. if argsList.Len() != 1 {
  13240. return newErrorFormulaArg(formulaErrorVALUE, "VALUE requires 1 argument")
  13241. }
  13242. text := strings.ReplaceAll(argsList.Front().Value.(formulaArg).Value(), ",", "")
  13243. percent := 1.0
  13244. if strings.HasSuffix(text, "%") {
  13245. percent, text = 0.01, strings.TrimSuffix(text, "%")
  13246. }
  13247. decimal := big.Float{}
  13248. if _, ok := decimal.SetString(text); ok {
  13249. value, _ := decimal.Float64()
  13250. return newNumberFormulaArg(value * percent)
  13251. }
  13252. dateValue, timeValue, errTime, errDate := 0.0, 0.0, false, false
  13253. if !isDateOnlyFmt(text) {
  13254. h, m, s, _, _, err := strToTime(text)
  13255. errTime = err.Type == ArgError
  13256. if !errTime {
  13257. timeValue = (float64(h)*3600 + float64(m)*60 + s) / 86400
  13258. }
  13259. }
  13260. y, m, d, _, err := strToDate(text)
  13261. errDate = err.Type == ArgError
  13262. if !errDate {
  13263. dateValue = daysBetween(excelMinTime1900.Unix(), makeDate(y, time.Month(m), d)) + 1
  13264. }
  13265. if errTime && errDate {
  13266. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  13267. }
  13268. return newNumberFormulaArg(dateValue + timeValue)
  13269. }
  13270. // Conditional Functions
  13271. // IF function tests a supplied condition and returns one result if the
  13272. // condition evaluates to TRUE, and another result if the condition evaluates
  13273. // to FALSE. The syntax of the function is:
  13274. //
  13275. // IF(logical_test,value_if_true,value_if_false)
  13276. func (fn *formulaFuncs) IF(argsList *list.List) formulaArg {
  13277. if argsList.Len() == 0 {
  13278. return newErrorFormulaArg(formulaErrorVALUE, "IF requires at least 1 argument")
  13279. }
  13280. if argsList.Len() > 3 {
  13281. return newErrorFormulaArg(formulaErrorVALUE, "IF accepts at most 3 arguments")
  13282. }
  13283. token := argsList.Front().Value.(formulaArg)
  13284. var (
  13285. cond bool
  13286. err error
  13287. result formulaArg
  13288. )
  13289. switch token.Type {
  13290. case ArgString:
  13291. if cond, err = strconv.ParseBool(token.String); err != nil {
  13292. return newErrorFormulaArg(formulaErrorVALUE, err.Error())
  13293. }
  13294. case ArgNumber:
  13295. cond = token.Number == 1
  13296. }
  13297. if argsList.Len() == 1 {
  13298. return newBoolFormulaArg(cond)
  13299. }
  13300. if cond {
  13301. value := argsList.Front().Next().Value.(formulaArg)
  13302. switch value.Type {
  13303. case ArgNumber:
  13304. result = value.ToNumber()
  13305. default:
  13306. result = newStringFormulaArg(value.String)
  13307. }
  13308. return result
  13309. }
  13310. if argsList.Len() == 3 {
  13311. value := argsList.Back().Value.(formulaArg)
  13312. switch value.Type {
  13313. case ArgNumber:
  13314. result = value.ToNumber()
  13315. default:
  13316. result = newStringFormulaArg(value.String)
  13317. }
  13318. }
  13319. return result
  13320. }
  13321. // Lookup and Reference Functions
  13322. // ADDRESS function takes a row and a column number and returns a cell
  13323. // reference as a text string. The syntax of the function is:
  13324. //
  13325. // ADDRESS(row_num,column_num,[abs_num],[a1],[sheet_text])
  13326. func (fn *formulaFuncs) ADDRESS(argsList *list.List) formulaArg {
  13327. if argsList.Len() < 2 {
  13328. return newErrorFormulaArg(formulaErrorVALUE, "ADDRESS requires at least 2 arguments")
  13329. }
  13330. if argsList.Len() > 5 {
  13331. return newErrorFormulaArg(formulaErrorVALUE, "ADDRESS requires at most 5 arguments")
  13332. }
  13333. rowNum := argsList.Front().Value.(formulaArg).ToNumber()
  13334. if rowNum.Type != ArgNumber {
  13335. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  13336. }
  13337. if rowNum.Number >= TotalRows {
  13338. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  13339. }
  13340. colNum := argsList.Front().Next().Value.(formulaArg).ToNumber()
  13341. if colNum.Type != ArgNumber {
  13342. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  13343. }
  13344. absNum := newNumberFormulaArg(1)
  13345. if argsList.Len() >= 3 {
  13346. absNum = argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  13347. if absNum.Type != ArgNumber {
  13348. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  13349. }
  13350. }
  13351. if absNum.Number < 1 || absNum.Number > 4 {
  13352. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  13353. }
  13354. a1 := newBoolFormulaArg(true)
  13355. if argsList.Len() >= 4 {
  13356. a1 = argsList.Front().Next().Next().Next().Value.(formulaArg).ToBool()
  13357. if a1.Type != ArgNumber {
  13358. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  13359. }
  13360. }
  13361. var sheetText string
  13362. if argsList.Len() == 5 {
  13363. sheetText = fmt.Sprintf("%s!", argsList.Back().Value.(formulaArg).Value())
  13364. }
  13365. formatter := addressFmtMaps[fmt.Sprintf("%d_%s", int(absNum.Number), a1.Value())]
  13366. addr, err := formatter(int(colNum.Number), int(rowNum.Number))
  13367. if err != nil {
  13368. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  13369. }
  13370. return newStringFormulaArg(fmt.Sprintf("%s%s", sheetText, addr))
  13371. }
  13372. // CHOOSE function returns a value from an array, that corresponds to a
  13373. // supplied index number (position). The syntax of the function is:
  13374. //
  13375. // CHOOSE(index_num,value1,[value2],...)
  13376. func (fn *formulaFuncs) CHOOSE(argsList *list.List) formulaArg {
  13377. if argsList.Len() < 2 {
  13378. return newErrorFormulaArg(formulaErrorVALUE, "CHOOSE requires 2 arguments")
  13379. }
  13380. idx, err := strconv.Atoi(argsList.Front().Value.(formulaArg).Value())
  13381. if err != nil {
  13382. return newErrorFormulaArg(formulaErrorVALUE, "CHOOSE requires first argument of type number")
  13383. }
  13384. if argsList.Len() <= idx {
  13385. return newErrorFormulaArg(formulaErrorVALUE, "index_num should be <= to the number of values")
  13386. }
  13387. arg := argsList.Front()
  13388. for i := 0; i < idx; i++ {
  13389. arg = arg.Next()
  13390. }
  13391. return arg.Value.(formulaArg)
  13392. }
  13393. // deepMatchRune finds whether the text deep matches/satisfies the pattern
  13394. // string.
  13395. func deepMatchRune(str, pattern []rune, simple bool) bool {
  13396. for len(pattern) > 0 {
  13397. switch pattern[0] {
  13398. default:
  13399. if len(str) == 0 || str[0] != pattern[0] {
  13400. return false
  13401. }
  13402. case '?':
  13403. if len(str) == 0 && !simple {
  13404. return false
  13405. }
  13406. case '*':
  13407. return deepMatchRune(str, pattern[1:], simple) ||
  13408. (len(str) > 0 && deepMatchRune(str[1:], pattern, simple))
  13409. }
  13410. str = str[1:]
  13411. pattern = pattern[1:]
  13412. }
  13413. return len(str) == 0 && len(pattern) == 0
  13414. }
  13415. // matchPattern finds whether the text matches or satisfies the pattern
  13416. // string. The pattern supports '*' and '?' wildcards in the pattern string.
  13417. func matchPattern(pattern, name string) (matched bool) {
  13418. if pattern == "" {
  13419. return name == pattern
  13420. }
  13421. if pattern == "*" {
  13422. return true
  13423. }
  13424. rName, rPattern := make([]rune, 0, len(name)), make([]rune, 0, len(pattern))
  13425. for _, r := range name {
  13426. rName = append(rName, r)
  13427. }
  13428. for _, r := range pattern {
  13429. rPattern = append(rPattern, r)
  13430. }
  13431. return deepMatchRune(rName, rPattern, false)
  13432. }
  13433. // compareFormulaArg compares the left-hand sides and the right-hand sides'
  13434. // formula arguments by given conditions such as case-sensitive, if exact
  13435. // match, and make compare result as formula criteria condition type.
  13436. func compareFormulaArg(lhs, rhs, matchMode formulaArg, caseSensitive bool) byte {
  13437. if lhs.Type != rhs.Type {
  13438. return criteriaNe
  13439. }
  13440. switch lhs.Type {
  13441. case ArgNumber:
  13442. if lhs.Number == rhs.Number {
  13443. return criteriaEq
  13444. }
  13445. if lhs.Number < rhs.Number {
  13446. return criteriaL
  13447. }
  13448. return criteriaG
  13449. case ArgString:
  13450. ls, rs := lhs.String, rhs.String
  13451. if !caseSensitive {
  13452. ls, rs = strings.ToLower(ls), strings.ToLower(rs)
  13453. }
  13454. if matchMode.Number == matchModeWildcard {
  13455. if matchPattern(rs, ls) {
  13456. return criteriaEq
  13457. }
  13458. }
  13459. return map[int]byte{1: criteriaG, -1: criteriaL, 0: criteriaEq}[strings.Compare(ls, rs)]
  13460. case ArgEmpty:
  13461. return criteriaEq
  13462. case ArgList:
  13463. return compareFormulaArgList(lhs, rhs, matchMode, caseSensitive)
  13464. case ArgMatrix:
  13465. return compareFormulaArgMatrix(lhs, rhs, matchMode, caseSensitive)
  13466. default:
  13467. return criteriaErr
  13468. }
  13469. }
  13470. // compareFormulaArgList compares the left-hand sides and the right-hand sides
  13471. // list type formula arguments.
  13472. func compareFormulaArgList(lhs, rhs, matchMode formulaArg, caseSensitive bool) byte {
  13473. if len(lhs.List) < len(rhs.List) {
  13474. return criteriaL
  13475. }
  13476. if len(lhs.List) > len(rhs.List) {
  13477. return criteriaG
  13478. }
  13479. for arg := range lhs.List {
  13480. criteria := compareFormulaArg(lhs.List[arg], rhs.List[arg], matchMode, caseSensitive)
  13481. if criteria != criteriaEq {
  13482. return criteria
  13483. }
  13484. }
  13485. return criteriaEq
  13486. }
  13487. // compareFormulaArgMatrix compares the left-hand sides and the right-hand sides'
  13488. // matrix type formula arguments.
  13489. func compareFormulaArgMatrix(lhs, rhs, matchMode formulaArg, caseSensitive bool) byte {
  13490. if len(lhs.Matrix) < len(rhs.Matrix) {
  13491. return criteriaL
  13492. }
  13493. if len(lhs.Matrix) > len(rhs.Matrix) {
  13494. return criteriaG
  13495. }
  13496. for i := range lhs.Matrix {
  13497. left := lhs.Matrix[i]
  13498. right := lhs.Matrix[i]
  13499. if len(left) < len(right) {
  13500. return criteriaL
  13501. }
  13502. if len(left) > len(right) {
  13503. return criteriaG
  13504. }
  13505. for arg := range left {
  13506. criteria := compareFormulaArg(left[arg], right[arg], matchMode, caseSensitive)
  13507. if criteria != criteriaEq {
  13508. return criteria
  13509. }
  13510. }
  13511. }
  13512. return criteriaEq
  13513. }
  13514. // COLUMN function returns the first column number within a supplied reference
  13515. // or the number of the current column. The syntax of the function is:
  13516. //
  13517. // COLUMN([reference])
  13518. func (fn *formulaFuncs) COLUMN(argsList *list.List) formulaArg {
  13519. if argsList.Len() > 1 {
  13520. return newErrorFormulaArg(formulaErrorVALUE, "COLUMN requires at most 1 argument")
  13521. }
  13522. if argsList.Len() == 1 {
  13523. if argsList.Front().Value.(formulaArg).cellRanges != nil && argsList.Front().Value.(formulaArg).cellRanges.Len() > 0 {
  13524. return newNumberFormulaArg(float64(argsList.Front().Value.(formulaArg).cellRanges.Front().Value.(cellRange).From.Col))
  13525. }
  13526. if argsList.Front().Value.(formulaArg).cellRefs != nil && argsList.Front().Value.(formulaArg).cellRefs.Len() > 0 {
  13527. return newNumberFormulaArg(float64(argsList.Front().Value.(formulaArg).cellRefs.Front().Value.(cellRef).Col))
  13528. }
  13529. return newErrorFormulaArg(formulaErrorVALUE, "invalid reference")
  13530. }
  13531. col, _, _ := CellNameToCoordinates(fn.cell)
  13532. return newNumberFormulaArg(float64(col))
  13533. }
  13534. // calcColumnsMinMax calculation min and max value for given formula arguments
  13535. // sequence of the formula function COLUMNS.
  13536. func calcColumnsMinMax(argsList *list.List) (min, max int) {
  13537. if argsList.Front().Value.(formulaArg).cellRanges != nil && argsList.Front().Value.(formulaArg).cellRanges.Len() > 0 {
  13538. crs := argsList.Front().Value.(formulaArg).cellRanges
  13539. for cr := crs.Front(); cr != nil; cr = cr.Next() {
  13540. if min == 0 {
  13541. min = cr.Value.(cellRange).From.Col
  13542. }
  13543. if min > cr.Value.(cellRange).From.Col {
  13544. min = cr.Value.(cellRange).From.Col
  13545. }
  13546. if min > cr.Value.(cellRange).To.Col {
  13547. min = cr.Value.(cellRange).To.Col
  13548. }
  13549. if max < cr.Value.(cellRange).To.Col {
  13550. max = cr.Value.(cellRange).To.Col
  13551. }
  13552. if max < cr.Value.(cellRange).From.Col {
  13553. max = cr.Value.(cellRange).From.Col
  13554. }
  13555. }
  13556. }
  13557. if argsList.Front().Value.(formulaArg).cellRefs != nil && argsList.Front().Value.(formulaArg).cellRefs.Len() > 0 {
  13558. cr := argsList.Front().Value.(formulaArg).cellRefs
  13559. for refs := cr.Front(); refs != nil; refs = refs.Next() {
  13560. if min == 0 {
  13561. min = refs.Value.(cellRef).Col
  13562. }
  13563. if min > refs.Value.(cellRef).Col {
  13564. min = refs.Value.(cellRef).Col
  13565. }
  13566. if max < refs.Value.(cellRef).Col {
  13567. max = refs.Value.(cellRef).Col
  13568. }
  13569. }
  13570. }
  13571. return
  13572. }
  13573. // COLUMNS function receives an Excel range and returns the number of columns
  13574. // that are contained within the range. The syntax of the function is:
  13575. //
  13576. // COLUMNS(array)
  13577. func (fn *formulaFuncs) COLUMNS(argsList *list.List) formulaArg {
  13578. if argsList.Len() != 1 {
  13579. return newErrorFormulaArg(formulaErrorVALUE, "COLUMNS requires 1 argument")
  13580. }
  13581. min, max := calcColumnsMinMax(argsList)
  13582. if max == MaxColumns {
  13583. return newNumberFormulaArg(float64(MaxColumns))
  13584. }
  13585. result := max - min + 1
  13586. if max == min {
  13587. if min == 0 {
  13588. return newErrorFormulaArg(formulaErrorVALUE, "invalid reference")
  13589. }
  13590. return newNumberFormulaArg(float64(1))
  13591. }
  13592. return newNumberFormulaArg(float64(result))
  13593. }
  13594. // FORMULATEXT function returns a formula as a text string. The syntax of the
  13595. // function is:
  13596. //
  13597. // FORMULATEXT(reference)
  13598. func (fn *formulaFuncs) FORMULATEXT(argsList *list.List) formulaArg {
  13599. if argsList.Len() != 1 {
  13600. return newErrorFormulaArg(formulaErrorVALUE, "FORMULATEXT requires 1 argument")
  13601. }
  13602. refs := argsList.Front().Value.(formulaArg).cellRefs
  13603. col, row := 0, 0
  13604. if refs != nil && refs.Len() > 0 {
  13605. col, row = refs.Front().Value.(cellRef).Col, refs.Front().Value.(cellRef).Row
  13606. }
  13607. ranges := argsList.Front().Value.(formulaArg).cellRanges
  13608. if ranges != nil && ranges.Len() > 0 {
  13609. col, row = ranges.Front().Value.(cellRange).From.Col, ranges.Front().Value.(cellRange).From.Row
  13610. }
  13611. cell, err := CoordinatesToCellName(col, row)
  13612. if err != nil {
  13613. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  13614. }
  13615. formula, _ := fn.f.GetCellFormula(fn.sheet, cell)
  13616. return newStringFormulaArg(formula)
  13617. }
  13618. // checkHVLookupArgs checking arguments, prepare extract mode, lookup value,
  13619. // and data for the formula functions HLOOKUP and VLOOKUP.
  13620. func checkHVLookupArgs(name string, argsList *list.List) (idx int, lookupValue, tableArray, matchMode, errArg formulaArg) {
  13621. unit := map[string]string{
  13622. "HLOOKUP": "row",
  13623. "VLOOKUP": "col",
  13624. }[name]
  13625. if argsList.Len() < 3 {
  13626. errArg = newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at least 3 arguments", name))
  13627. return
  13628. }
  13629. if argsList.Len() > 4 {
  13630. errArg = newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at most 4 arguments", name))
  13631. return
  13632. }
  13633. lookupValue = argsList.Front().Value.(formulaArg)
  13634. tableArray = argsList.Front().Next().Value.(formulaArg)
  13635. if tableArray.Type != ArgMatrix {
  13636. errArg = newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires second argument of table array", name))
  13637. return
  13638. }
  13639. arg := argsList.Front().Next().Next().Value.(formulaArg)
  13640. if arg.Type != ArgNumber || arg.Boolean {
  13641. errArg = newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires numeric %s argument", name, unit))
  13642. return
  13643. }
  13644. idx, matchMode = int(arg.Number)-1, newNumberFormulaArg(matchModeMaxLess)
  13645. if argsList.Len() == 4 {
  13646. rangeLookup := argsList.Back().Value.(formulaArg).ToBool()
  13647. if rangeLookup.Type == ArgError {
  13648. errArg = rangeLookup
  13649. return
  13650. }
  13651. if rangeLookup.Number == 0 {
  13652. matchMode = newNumberFormulaArg(matchModeWildcard)
  13653. }
  13654. }
  13655. return
  13656. }
  13657. // HLOOKUP function 'looks up' a given value in the top row of a data array
  13658. // (or table), and returns the corresponding value from another row of the
  13659. // array. The syntax of the function is:
  13660. //
  13661. // HLOOKUP(lookup_value,table_array,row_index_num,[range_lookup])
  13662. func (fn *formulaFuncs) HLOOKUP(argsList *list.List) formulaArg {
  13663. rowIdx, lookupValue, tableArray, matchMode, errArg := checkHVLookupArgs("HLOOKUP", argsList)
  13664. if errArg.Type == ArgError {
  13665. return errArg
  13666. }
  13667. var matchIdx int
  13668. var wasExact bool
  13669. if matchMode.Number == matchModeWildcard || len(tableArray.Matrix) == TotalRows {
  13670. matchIdx, wasExact = lookupLinearSearch(false, lookupValue, tableArray, matchMode, newNumberFormulaArg(searchModeLinear))
  13671. } else {
  13672. matchIdx, wasExact = lookupBinarySearch(false, lookupValue, tableArray, matchMode, newNumberFormulaArg(searchModeAscBinary))
  13673. }
  13674. if matchIdx == -1 {
  13675. return newErrorFormulaArg(formulaErrorNA, "HLOOKUP no result found")
  13676. }
  13677. if rowIdx < 0 || rowIdx >= len(tableArray.Matrix) {
  13678. return newErrorFormulaArg(formulaErrorNA, "HLOOKUP has invalid row index")
  13679. }
  13680. row := tableArray.Matrix[rowIdx]
  13681. if wasExact || matchMode.Number == matchModeWildcard {
  13682. return row[matchIdx]
  13683. }
  13684. return newErrorFormulaArg(formulaErrorNA, "HLOOKUP no result found")
  13685. }
  13686. // HYPERLINK function creates a hyperlink to a specified location. The syntax
  13687. // of the function is:
  13688. //
  13689. // HYPERLINK(link_location,[friendly_name])
  13690. func (fn *formulaFuncs) HYPERLINK(argsList *list.List) formulaArg {
  13691. if argsList.Len() < 1 {
  13692. return newErrorFormulaArg(formulaErrorVALUE, "HYPERLINK requires at least 1 argument")
  13693. }
  13694. if argsList.Len() > 2 {
  13695. return newErrorFormulaArg(formulaErrorVALUE, "HYPERLINK allows at most 2 arguments")
  13696. }
  13697. return newStringFormulaArg(argsList.Back().Value.(formulaArg).Value())
  13698. }
  13699. // calcMatch returns the position of the value by given match type, criteria
  13700. // and lookup array for the formula function MATCH.
  13701. func calcMatch(matchType int, criteria *formulaCriteria, lookupArray []formulaArg) formulaArg {
  13702. switch matchType {
  13703. case 0:
  13704. for i, arg := range lookupArray {
  13705. if ok, _ := formulaCriteriaEval(arg.Value(), criteria); ok {
  13706. return newNumberFormulaArg(float64(i + 1))
  13707. }
  13708. }
  13709. case -1:
  13710. for i, arg := range lookupArray {
  13711. if ok, _ := formulaCriteriaEval(arg.Value(), criteria); ok {
  13712. return newNumberFormulaArg(float64(i + 1))
  13713. }
  13714. if ok, _ := formulaCriteriaEval(arg.Value(), &formulaCriteria{
  13715. Type: criteriaL, Condition: criteria.Condition,
  13716. }); ok {
  13717. if i == 0 {
  13718. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  13719. }
  13720. return newNumberFormulaArg(float64(i))
  13721. }
  13722. }
  13723. case 1:
  13724. for i, arg := range lookupArray {
  13725. if ok, _ := formulaCriteriaEval(arg.Value(), criteria); ok {
  13726. return newNumberFormulaArg(float64(i + 1))
  13727. }
  13728. if ok, _ := formulaCriteriaEval(arg.Value(), &formulaCriteria{
  13729. Type: criteriaG, Condition: criteria.Condition,
  13730. }); ok {
  13731. if i == 0 {
  13732. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  13733. }
  13734. return newNumberFormulaArg(float64(i))
  13735. }
  13736. }
  13737. }
  13738. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  13739. }
  13740. // MATCH function looks up a value in an array, and returns the position of
  13741. // the value within the array. The user can specify that the function should
  13742. // only return a result if an exact match is found, or that the function
  13743. // should return the position of the closest match (above or below), if an
  13744. // exact match is not found. The syntax of the Match function is:
  13745. //
  13746. // MATCH(lookup_value,lookup_array,[match_type])
  13747. func (fn *formulaFuncs) MATCH(argsList *list.List) formulaArg {
  13748. if argsList.Len() != 2 && argsList.Len() != 3 {
  13749. return newErrorFormulaArg(formulaErrorVALUE, "MATCH requires 1 or 2 arguments")
  13750. }
  13751. var (
  13752. matchType = 1
  13753. lookupArray []formulaArg
  13754. lookupArrayArg = argsList.Front().Next().Value.(formulaArg)
  13755. lookupArrayErr = "MATCH arguments lookup_array should be one-dimensional array"
  13756. )
  13757. if argsList.Len() == 3 {
  13758. matchTypeArg := argsList.Back().Value.(formulaArg).ToNumber()
  13759. if matchTypeArg.Type != ArgNumber {
  13760. return newErrorFormulaArg(formulaErrorVALUE, "MATCH requires numeric match_type argument")
  13761. }
  13762. if matchTypeArg.Number == -1 || matchTypeArg.Number == 0 {
  13763. matchType = int(matchTypeArg.Number)
  13764. }
  13765. }
  13766. switch lookupArrayArg.Type {
  13767. case ArgMatrix:
  13768. if len(lookupArrayArg.Matrix[0]) != 1 {
  13769. return newErrorFormulaArg(formulaErrorNA, lookupArrayErr)
  13770. }
  13771. lookupArray = lookupArrayArg.ToList()
  13772. default:
  13773. return newErrorFormulaArg(formulaErrorNA, lookupArrayErr)
  13774. }
  13775. return calcMatch(matchType, formulaCriteriaParser(argsList.Front().Value.(formulaArg).Value()), lookupArray)
  13776. }
  13777. // TRANSPOSE function 'transposes' an array of cells (i.e. the function copies
  13778. // a horizontal range of cells into a vertical range and vice versa). The
  13779. // syntax of the function is:
  13780. //
  13781. // TRANSPOSE(array)
  13782. func (fn *formulaFuncs) TRANSPOSE(argsList *list.List) formulaArg {
  13783. if argsList.Len() != 1 {
  13784. return newErrorFormulaArg(formulaErrorVALUE, "TRANSPOSE requires 1 argument")
  13785. }
  13786. args := argsList.Back().Value.(formulaArg).ToList()
  13787. rmin, rmax := calcRowsMinMax(argsList)
  13788. cmin, cmax := calcColumnsMinMax(argsList)
  13789. cols, rows := cmax-cmin+1, rmax-rmin+1
  13790. src := make([][]formulaArg, 0)
  13791. for i := 0; i < len(args); i += cols {
  13792. src = append(src, args[i:i+cols])
  13793. }
  13794. mtx := make([][]formulaArg, cols)
  13795. for r, row := range src {
  13796. colIdx := r % rows
  13797. for c, cell := range row {
  13798. rowIdx := c % cols
  13799. if len(mtx[rowIdx]) == 0 {
  13800. mtx[rowIdx] = make([]formulaArg, rows)
  13801. }
  13802. mtx[rowIdx][colIdx] = cell
  13803. }
  13804. }
  13805. return newMatrixFormulaArg(mtx)
  13806. }
  13807. // lookupLinearSearch sequentially checks each look value of the lookup array until
  13808. // a match is found or the whole list has been searched.
  13809. func lookupLinearSearch(vertical bool, lookupValue, lookupArray, matchMode, searchMode formulaArg) (int, bool) {
  13810. var tableArray []formulaArg
  13811. if vertical {
  13812. for _, row := range lookupArray.Matrix {
  13813. tableArray = append(tableArray, row[0])
  13814. }
  13815. } else {
  13816. tableArray = lookupArray.Matrix[0]
  13817. }
  13818. matchIdx, wasExact := -1, false
  13819. start:
  13820. for i, cell := range tableArray {
  13821. lhs := cell
  13822. if lookupValue.Type == ArgNumber {
  13823. if lhs = cell.ToNumber(); lhs.Type == ArgError {
  13824. lhs = cell
  13825. }
  13826. } else if lookupValue.Type == ArgMatrix {
  13827. lhs = lookupArray
  13828. } else if lookupArray.Type == ArgString {
  13829. lhs = newStringFormulaArg(cell.Value())
  13830. }
  13831. if compareFormulaArg(lhs, lookupValue, matchMode, false) == criteriaEq {
  13832. matchIdx = i
  13833. wasExact = true
  13834. if searchMode.Number == searchModeLinear {
  13835. break start
  13836. }
  13837. }
  13838. if matchMode.Number == matchModeMinGreater || matchMode.Number == matchModeMaxLess {
  13839. matchIdx = int(calcMatch(int(matchMode.Number), formulaCriteriaParser(lookupValue.Value()), tableArray).Number)
  13840. continue
  13841. }
  13842. }
  13843. return matchIdx, wasExact
  13844. }
  13845. // VLOOKUP function 'looks up' a given value in the left-hand column of a
  13846. // data array (or table), and returns the corresponding value from another
  13847. // column of the array. The syntax of the function is:
  13848. //
  13849. // VLOOKUP(lookup_value,table_array,col_index_num,[range_lookup])
  13850. func (fn *formulaFuncs) VLOOKUP(argsList *list.List) formulaArg {
  13851. colIdx, lookupValue, tableArray, matchMode, errArg := checkHVLookupArgs("VLOOKUP", argsList)
  13852. if errArg.Type == ArgError {
  13853. return errArg
  13854. }
  13855. var matchIdx int
  13856. var wasExact bool
  13857. if matchMode.Number == matchModeWildcard || len(tableArray.Matrix) == TotalRows {
  13858. matchIdx, wasExact = lookupLinearSearch(true, lookupValue, tableArray, matchMode, newNumberFormulaArg(searchModeLinear))
  13859. } else {
  13860. matchIdx, wasExact = lookupBinarySearch(true, lookupValue, tableArray, matchMode, newNumberFormulaArg(searchModeAscBinary))
  13861. }
  13862. if matchIdx == -1 {
  13863. return newErrorFormulaArg(formulaErrorNA, "VLOOKUP no result found")
  13864. }
  13865. mtx := tableArray.Matrix[matchIdx]
  13866. if colIdx < 0 || colIdx >= len(mtx) {
  13867. return newErrorFormulaArg(formulaErrorNA, "VLOOKUP has invalid column index")
  13868. }
  13869. if wasExact || matchMode.Number == matchModeWildcard {
  13870. return mtx[colIdx]
  13871. }
  13872. return newErrorFormulaArg(formulaErrorNA, "VLOOKUP no result found")
  13873. }
  13874. // lookupBinarySearch finds the position of a target value when range lookup
  13875. // is TRUE, if the data of table array can't guarantee be sorted, it will
  13876. // return wrong result.
  13877. func lookupBinarySearch(vertical bool, lookupValue, lookupArray, matchMode, searchMode formulaArg) (matchIdx int, wasExact bool) {
  13878. var tableArray []formulaArg
  13879. if vertical {
  13880. for _, row := range lookupArray.Matrix {
  13881. tableArray = append(tableArray, row[0])
  13882. }
  13883. } else {
  13884. tableArray = lookupArray.Matrix[0]
  13885. }
  13886. low, high, lastMatchIdx := 0, len(tableArray)-1, -1
  13887. count := high
  13888. for low <= high {
  13889. mid := low + (high-low)/2
  13890. cell := tableArray[mid]
  13891. lhs := cell
  13892. if lookupValue.Type == ArgNumber {
  13893. if lhs = cell.ToNumber(); lhs.Type == ArgError {
  13894. lhs = cell
  13895. }
  13896. } else if lookupValue.Type == ArgMatrix && vertical {
  13897. lhs = lookupArray
  13898. } else if lookupValue.Type == ArgString {
  13899. lhs = newStringFormulaArg(cell.Value())
  13900. }
  13901. result := compareFormulaArg(lhs, lookupValue, matchMode, false)
  13902. if result == criteriaEq {
  13903. matchIdx, wasExact = mid, true
  13904. if searchMode.Number == searchModeDescBinary {
  13905. matchIdx = count - matchIdx
  13906. }
  13907. return
  13908. } else if result == criteriaG {
  13909. high = mid - 1
  13910. } else if result == criteriaL {
  13911. matchIdx = mid
  13912. if cell.Type != ArgEmpty {
  13913. lastMatchIdx = matchIdx
  13914. }
  13915. low = mid + 1
  13916. } else {
  13917. return -1, false
  13918. }
  13919. }
  13920. matchIdx, wasExact = lastMatchIdx, true
  13921. return
  13922. }
  13923. // checkLookupArgs checking arguments, prepare lookup value, and data for the
  13924. // formula function LOOKUP.
  13925. func checkLookupArgs(argsList *list.List) (arrayForm bool, lookupValue, lookupVector, errArg formulaArg) {
  13926. if argsList.Len() < 2 {
  13927. errArg = newErrorFormulaArg(formulaErrorVALUE, "LOOKUP requires at least 2 arguments")
  13928. return
  13929. }
  13930. if argsList.Len() > 3 {
  13931. errArg = newErrorFormulaArg(formulaErrorVALUE, "LOOKUP requires at most 3 arguments")
  13932. return
  13933. }
  13934. lookupValue = newStringFormulaArg(argsList.Front().Value.(formulaArg).Value())
  13935. lookupVector = argsList.Front().Next().Value.(formulaArg)
  13936. if lookupVector.Type != ArgMatrix && lookupVector.Type != ArgList {
  13937. errArg = newErrorFormulaArg(formulaErrorVALUE, "LOOKUP requires second argument of table array")
  13938. return
  13939. }
  13940. arrayForm = lookupVector.Type == ArgMatrix
  13941. if arrayForm && len(lookupVector.Matrix) == 0 {
  13942. errArg = newErrorFormulaArg(formulaErrorVALUE, "LOOKUP requires not empty range as second argument")
  13943. }
  13944. return
  13945. }
  13946. // iterateLookupArgs iterate arguments to extract columns and calculate match
  13947. // index for the formula function LOOKUP.
  13948. func iterateLookupArgs(lookupValue, lookupVector formulaArg) ([]formulaArg, int, bool) {
  13949. cols, matchIdx, ok := lookupCol(lookupVector, 0), -1, false
  13950. for idx, col := range cols {
  13951. lhs := lookupValue
  13952. switch col.Type {
  13953. case ArgNumber:
  13954. lhs = lhs.ToNumber()
  13955. if !col.Boolean {
  13956. if lhs.Type == ArgError {
  13957. lhs = lookupValue
  13958. }
  13959. }
  13960. }
  13961. compare := compareFormulaArg(lhs, col, newNumberFormulaArg(matchModeMaxLess), false)
  13962. // Find exact match
  13963. if compare == criteriaEq {
  13964. matchIdx = idx
  13965. break
  13966. }
  13967. // Find the nearest match if lookup value is more than or equal to the first value in lookup vector
  13968. if idx == 0 {
  13969. ok = compare == criteriaG
  13970. } else if ok && compare == criteriaL && matchIdx == -1 {
  13971. matchIdx = idx - 1
  13972. }
  13973. }
  13974. return cols, matchIdx, ok
  13975. }
  13976. // index is an implementation of the formula function INDEX.
  13977. func (fn *formulaFuncs) index(array formulaArg, rowIdx, colIdx int) formulaArg {
  13978. var cells []formulaArg
  13979. if array.Type == ArgMatrix {
  13980. cellMatrix := array.Matrix
  13981. if rowIdx < -1 || rowIdx >= len(cellMatrix) {
  13982. return newErrorFormulaArg(formulaErrorREF, "INDEX row_num out of range")
  13983. }
  13984. if rowIdx == -1 {
  13985. if colIdx >= len(cellMatrix[0]) {
  13986. return newErrorFormulaArg(formulaErrorREF, "INDEX col_num out of range")
  13987. }
  13988. var column [][]formulaArg
  13989. for _, cells = range cellMatrix {
  13990. column = append(column, []formulaArg{cells[colIdx]})
  13991. }
  13992. return newMatrixFormulaArg(column)
  13993. }
  13994. cells = cellMatrix[rowIdx]
  13995. }
  13996. if colIdx < -1 || colIdx >= len(cells) {
  13997. return newErrorFormulaArg(formulaErrorREF, "INDEX col_num out of range")
  13998. }
  13999. return newListFormulaArg(cells)
  14000. }
  14001. // validateMatchMode check the number of match mode if be equal to 0, 1, -1 or
  14002. // 2.
  14003. func validateMatchMode(mode float64) bool {
  14004. return mode == matchModeExact || mode == matchModeMinGreater || mode == matchModeMaxLess || mode == matchModeWildcard
  14005. }
  14006. // validateSearchMode check the number of search mode if be equal to 1, -1, 2
  14007. // or -2.
  14008. func validateSearchMode(mode float64) bool {
  14009. return mode == searchModeLinear || mode == searchModeReverseLinear || mode == searchModeAscBinary || mode == searchModeDescBinary
  14010. }
  14011. // prepareXlookupArgs checking and prepare arguments for the formula function
  14012. // XLOOKUP.
  14013. func (fn *formulaFuncs) prepareXlookupArgs(argsList *list.List) formulaArg {
  14014. if argsList.Len() < 3 {
  14015. return newErrorFormulaArg(formulaErrorVALUE, "XLOOKUP requires at least 3 arguments")
  14016. }
  14017. if argsList.Len() > 6 {
  14018. return newErrorFormulaArg(formulaErrorVALUE, "XLOOKUP allows at most 6 arguments")
  14019. }
  14020. lookupValue := argsList.Front().Value.(formulaArg)
  14021. lookupArray := argsList.Front().Next().Value.(formulaArg)
  14022. returnArray := argsList.Front().Next().Next().Value.(formulaArg)
  14023. ifNotFond := newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  14024. matchMode, searchMode := newNumberFormulaArg(matchModeExact), newNumberFormulaArg(searchModeLinear)
  14025. if argsList.Len() > 3 {
  14026. ifNotFond = argsList.Front().Next().Next().Next().Value.(formulaArg)
  14027. }
  14028. if argsList.Len() > 4 {
  14029. if matchMode = argsList.Front().Next().Next().Next().Next().Value.(formulaArg).ToNumber(); matchMode.Type != ArgNumber {
  14030. return matchMode
  14031. }
  14032. }
  14033. if argsList.Len() > 5 {
  14034. if searchMode = argsList.Back().Value.(formulaArg).ToNumber(); searchMode.Type != ArgNumber {
  14035. return searchMode
  14036. }
  14037. }
  14038. if lookupArray.Type != ArgMatrix || returnArray.Type != ArgMatrix {
  14039. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  14040. }
  14041. if !validateMatchMode(matchMode.Number) || !validateSearchMode(searchMode.Number) {
  14042. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  14043. }
  14044. return newListFormulaArg([]formulaArg{lookupValue, lookupArray, returnArray, ifNotFond, matchMode, searchMode})
  14045. }
  14046. // xlookup is an implementation of the formula function XLOOKUP.
  14047. func (fn *formulaFuncs) xlookup(lookupRows, lookupCols, returnArrayRows, returnArrayCols, matchIdx int,
  14048. condition1, condition2, condition3, condition4 bool, returnArray formulaArg,
  14049. ) formulaArg {
  14050. var result [][]formulaArg
  14051. for rowIdx, row := range returnArray.Matrix {
  14052. for colIdx, cell := range row {
  14053. if condition1 {
  14054. if condition2 {
  14055. result = append(result, []formulaArg{cell})
  14056. continue
  14057. }
  14058. if returnArrayRows > 1 && returnArrayCols > 1 {
  14059. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  14060. }
  14061. }
  14062. if condition3 {
  14063. if returnArrayCols != lookupCols {
  14064. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  14065. }
  14066. if colIdx == matchIdx {
  14067. result = append(result, []formulaArg{cell})
  14068. continue
  14069. }
  14070. }
  14071. if condition4 {
  14072. if returnArrayRows != lookupRows {
  14073. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  14074. }
  14075. if rowIdx == matchIdx {
  14076. if len(result) == 0 {
  14077. result = append(result, []formulaArg{cell})
  14078. continue
  14079. }
  14080. result[0] = append(result[0], cell)
  14081. }
  14082. }
  14083. }
  14084. }
  14085. array := newMatrixFormulaArg(result)
  14086. cells := array.ToList()
  14087. if len(cells) == 1 {
  14088. return cells[0]
  14089. }
  14090. return array
  14091. }
  14092. // XLOOKUP function searches a range or an array, and then returns the item
  14093. // corresponding to the first match it finds. If no match exists, then
  14094. // XLOOKUP can return the closest (approximate) match. The syntax of the
  14095. // function is:
  14096. //
  14097. // XLOOKUP(lookup_value,lookup_array,return_array,[if_not_found],[match_mode],[search_mode])
  14098. func (fn *formulaFuncs) XLOOKUP(argsList *list.List) formulaArg {
  14099. args := fn.prepareXlookupArgs(argsList)
  14100. if args.Type != ArgList {
  14101. return args
  14102. }
  14103. lookupValue, lookupArray, returnArray, ifNotFond, matchMode, searchMode := args.List[0], args.List[1], args.List[2], args.List[3], args.List[4], args.List[5]
  14104. lookupRows, lookupCols := len(lookupArray.Matrix), 0
  14105. if lookupRows > 0 {
  14106. lookupCols = len(lookupArray.Matrix[0])
  14107. }
  14108. if lookupRows != 1 && lookupCols != 1 {
  14109. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  14110. }
  14111. verticalLookup := lookupRows >= lookupCols
  14112. var matchIdx int
  14113. switch searchMode.Number {
  14114. case searchModeLinear, searchModeReverseLinear:
  14115. matchIdx, _ = lookupLinearSearch(verticalLookup, lookupValue, lookupArray, matchMode, searchMode)
  14116. default:
  14117. matchIdx, _ = lookupBinarySearch(verticalLookup, lookupValue, lookupArray, matchMode, searchMode)
  14118. }
  14119. if matchIdx == -1 {
  14120. return ifNotFond
  14121. }
  14122. returnArrayRows, returnArrayCols := len(returnArray.Matrix), len(returnArray.Matrix[0])
  14123. condition1 := lookupRows == 1 && lookupCols == 1
  14124. condition2 := returnArrayRows == 1 || returnArrayCols == 1
  14125. condition3 := lookupRows == 1 && lookupCols > 1
  14126. condition4 := lookupRows > 1 && lookupCols == 1
  14127. return fn.xlookup(lookupRows, lookupCols, returnArrayRows, returnArrayCols, matchIdx, condition1, condition2, condition3, condition4, returnArray)
  14128. }
  14129. // INDEX function returns a reference to a cell that lies in a specified row
  14130. // and column of a range of cells. The syntax of the function is:
  14131. //
  14132. // INDEX(array,row_num,[col_num])
  14133. func (fn *formulaFuncs) INDEX(argsList *list.List) formulaArg {
  14134. if argsList.Len() < 2 || argsList.Len() > 3 {
  14135. return newErrorFormulaArg(formulaErrorVALUE, "INDEX requires 2 or 3 arguments")
  14136. }
  14137. array := argsList.Front().Value.(formulaArg)
  14138. if array.Type != ArgMatrix && array.Type != ArgList {
  14139. array = newMatrixFormulaArg([][]formulaArg{{array}})
  14140. }
  14141. rowArg := argsList.Front().Next().Value.(formulaArg).ToNumber()
  14142. if rowArg.Type != ArgNumber {
  14143. return rowArg
  14144. }
  14145. rowIdx, colIdx := int(rowArg.Number)-1, -1
  14146. if argsList.Len() == 3 {
  14147. colArg := argsList.Back().Value.(formulaArg).ToNumber()
  14148. if colArg.Type != ArgNumber {
  14149. return colArg
  14150. }
  14151. colIdx = int(colArg.Number) - 1
  14152. }
  14153. if rowIdx == -1 && colIdx == -1 {
  14154. if len(array.ToList()) != 1 {
  14155. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  14156. }
  14157. return array.ToList()[0]
  14158. }
  14159. cells := fn.index(array, rowIdx, colIdx)
  14160. if cells.Type != ArgList {
  14161. return cells
  14162. }
  14163. if colIdx == -1 {
  14164. return newMatrixFormulaArg([][]formulaArg{cells.List})
  14165. }
  14166. return cells.List[colIdx]
  14167. }
  14168. // INDIRECT function converts a text string into a cell reference. The syntax
  14169. // of the Indirect function is:
  14170. //
  14171. // INDIRECT(ref_text,[a1])
  14172. func (fn *formulaFuncs) INDIRECT(argsList *list.List) formulaArg {
  14173. if argsList.Len() != 1 && argsList.Len() != 2 {
  14174. return newErrorFormulaArg(formulaErrorVALUE, "INDIRECT requires 1 or 2 arguments")
  14175. }
  14176. refText := argsList.Front().Value.(formulaArg).Value()
  14177. a1 := newBoolFormulaArg(true)
  14178. if argsList.Len() == 2 {
  14179. if a1 = argsList.Back().Value.(formulaArg).ToBool(); a1.Type != ArgNumber {
  14180. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  14181. }
  14182. }
  14183. R1C1ToA1 := func(ref string) (cell string, err error) {
  14184. parts := strings.Split(strings.TrimLeft(ref, "R"), "C")
  14185. if len(parts) != 2 {
  14186. return
  14187. }
  14188. row, err := strconv.Atoi(parts[0])
  14189. if err != nil {
  14190. return
  14191. }
  14192. col, err := strconv.Atoi(parts[1])
  14193. if err != nil {
  14194. return
  14195. }
  14196. cell, err = CoordinatesToCellName(col, row)
  14197. return
  14198. }
  14199. refs := strings.Split(refText, ":")
  14200. fromRef, toRef := refs[0], ""
  14201. if len(refs) == 2 {
  14202. toRef = refs[1]
  14203. }
  14204. if a1.Number == 0 {
  14205. from, err := R1C1ToA1(refs[0])
  14206. if err != nil {
  14207. return newErrorFormulaArg(formulaErrorREF, formulaErrorREF)
  14208. }
  14209. fromRef = from
  14210. if len(refs) == 2 {
  14211. to, err := R1C1ToA1(refs[1])
  14212. if err != nil {
  14213. return newErrorFormulaArg(formulaErrorREF, formulaErrorREF)
  14214. }
  14215. toRef = to
  14216. }
  14217. }
  14218. if len(refs) == 1 {
  14219. value, err := fn.f.GetCellValue(fn.sheet, fromRef)
  14220. if err != nil {
  14221. return newErrorFormulaArg(formulaErrorREF, formulaErrorREF)
  14222. }
  14223. return newStringFormulaArg(value)
  14224. }
  14225. arg, _ := fn.f.parseReference(fn.ctx, fn.sheet, fromRef+":"+toRef)
  14226. return arg
  14227. }
  14228. // LOOKUP function performs an approximate match lookup in a one-column or
  14229. // one-row range, and returns the corresponding value from another one-column
  14230. // or one-row range. The syntax of the function is:
  14231. //
  14232. // LOOKUP(lookup_value,lookup_vector,[result_vector])
  14233. func (fn *formulaFuncs) LOOKUP(argsList *list.List) formulaArg {
  14234. arrayForm, lookupValue, lookupVector, errArg := checkLookupArgs(argsList)
  14235. if errArg.Type == ArgError {
  14236. return errArg
  14237. }
  14238. cols, matchIdx, ok := iterateLookupArgs(lookupValue, lookupVector)
  14239. if ok && matchIdx == -1 {
  14240. matchIdx = len(cols) - 1
  14241. }
  14242. var column []formulaArg
  14243. if argsList.Len() == 3 {
  14244. column = lookupCol(argsList.Back().Value.(formulaArg), 0)
  14245. } else if arrayForm && len(lookupVector.Matrix[0]) > 1 {
  14246. column = lookupCol(lookupVector, 1)
  14247. } else {
  14248. column = cols
  14249. }
  14250. if matchIdx < 0 || matchIdx >= len(column) {
  14251. return newErrorFormulaArg(formulaErrorNA, "LOOKUP no result found")
  14252. }
  14253. return column[matchIdx]
  14254. }
  14255. // lookupCol extract columns for LOOKUP.
  14256. func lookupCol(arr formulaArg, idx int) []formulaArg {
  14257. col := arr.List
  14258. if arr.Type == ArgMatrix {
  14259. col = nil
  14260. for _, r := range arr.Matrix {
  14261. if len(r) > 0 {
  14262. col = append(col, r[idx])
  14263. continue
  14264. }
  14265. col = append(col, newEmptyFormulaArg())
  14266. }
  14267. }
  14268. return col
  14269. }
  14270. // ROW function returns the first row number within a supplied reference or
  14271. // the number of the current row. The syntax of the function is:
  14272. //
  14273. // ROW([reference])
  14274. func (fn *formulaFuncs) ROW(argsList *list.List) formulaArg {
  14275. if argsList.Len() > 1 {
  14276. return newErrorFormulaArg(formulaErrorVALUE, "ROW requires at most 1 argument")
  14277. }
  14278. if argsList.Len() == 1 {
  14279. if argsList.Front().Value.(formulaArg).cellRanges != nil && argsList.Front().Value.(formulaArg).cellRanges.Len() > 0 {
  14280. return newNumberFormulaArg(float64(argsList.Front().Value.(formulaArg).cellRanges.Front().Value.(cellRange).From.Row))
  14281. }
  14282. if argsList.Front().Value.(formulaArg).cellRefs != nil && argsList.Front().Value.(formulaArg).cellRefs.Len() > 0 {
  14283. return newNumberFormulaArg(float64(argsList.Front().Value.(formulaArg).cellRefs.Front().Value.(cellRef).Row))
  14284. }
  14285. return newErrorFormulaArg(formulaErrorVALUE, "invalid reference")
  14286. }
  14287. _, row, _ := CellNameToCoordinates(fn.cell)
  14288. return newNumberFormulaArg(float64(row))
  14289. }
  14290. // calcRowsMinMax calculation min and max value for given formula arguments
  14291. // sequence of the formula function ROWS.
  14292. func calcRowsMinMax(argsList *list.List) (min, max int) {
  14293. if argsList.Front().Value.(formulaArg).cellRanges != nil && argsList.Front().Value.(formulaArg).cellRanges.Len() > 0 {
  14294. crs := argsList.Front().Value.(formulaArg).cellRanges
  14295. for cr := crs.Front(); cr != nil; cr = cr.Next() {
  14296. if min == 0 {
  14297. min = cr.Value.(cellRange).From.Row
  14298. }
  14299. if min > cr.Value.(cellRange).From.Row {
  14300. min = cr.Value.(cellRange).From.Row
  14301. }
  14302. if min > cr.Value.(cellRange).To.Row {
  14303. min = cr.Value.(cellRange).To.Row
  14304. }
  14305. if max < cr.Value.(cellRange).To.Row {
  14306. max = cr.Value.(cellRange).To.Row
  14307. }
  14308. if max < cr.Value.(cellRange).From.Row {
  14309. max = cr.Value.(cellRange).From.Row
  14310. }
  14311. }
  14312. }
  14313. if argsList.Front().Value.(formulaArg).cellRefs != nil && argsList.Front().Value.(formulaArg).cellRefs.Len() > 0 {
  14314. cr := argsList.Front().Value.(formulaArg).cellRefs
  14315. for refs := cr.Front(); refs != nil; refs = refs.Next() {
  14316. if min == 0 {
  14317. min = refs.Value.(cellRef).Row
  14318. }
  14319. if min > refs.Value.(cellRef).Row {
  14320. min = refs.Value.(cellRef).Row
  14321. }
  14322. if max < refs.Value.(cellRef).Row {
  14323. max = refs.Value.(cellRef).Row
  14324. }
  14325. }
  14326. }
  14327. return
  14328. }
  14329. // ROWS function takes an Excel range and returns the number of rows that are
  14330. // contained within the range. The syntax of the function is:
  14331. //
  14332. // ROWS(array)
  14333. func (fn *formulaFuncs) ROWS(argsList *list.List) formulaArg {
  14334. if argsList.Len() != 1 {
  14335. return newErrorFormulaArg(formulaErrorVALUE, "ROWS requires 1 argument")
  14336. }
  14337. min, max := calcRowsMinMax(argsList)
  14338. if max == TotalRows {
  14339. return newStringFormulaArg(strconv.Itoa(TotalRows))
  14340. }
  14341. result := max - min + 1
  14342. if max == min {
  14343. if min == 0 {
  14344. return newErrorFormulaArg(formulaErrorVALUE, "invalid reference")
  14345. }
  14346. return newNumberFormulaArg(float64(1))
  14347. }
  14348. return newStringFormulaArg(strconv.Itoa(result))
  14349. }
  14350. // Web Functions
  14351. // ENCODEURL function returns a URL-encoded string, replacing certain
  14352. // non-alphanumeric characters with the percentage symbol (%) and a
  14353. // hexadecimal number. The syntax of the function is:
  14354. //
  14355. // ENCODEURL(url)
  14356. func (fn *formulaFuncs) ENCODEURL(argsList *list.List) formulaArg {
  14357. if argsList.Len() != 1 {
  14358. return newErrorFormulaArg(formulaErrorVALUE, "ENCODEURL requires 1 argument")
  14359. }
  14360. token := argsList.Front().Value.(formulaArg).Value()
  14361. return newStringFormulaArg(strings.ReplaceAll(url.QueryEscape(token), "+", "%20"))
  14362. }
  14363. // Financial Functions
  14364. // validateFrequency check the number of coupon payments per year if be equal to 1, 2 or 4.
  14365. func validateFrequency(freq float64) bool {
  14366. return freq == 1 || freq == 2 || freq == 4
  14367. }
  14368. // ACCRINT function returns the accrued interest in a security that pays
  14369. // periodic interest. The syntax of the function is:
  14370. //
  14371. // ACCRINT(issue,first_interest,settlement,rate,par,frequency,[basis],[calc_method])
  14372. func (fn *formulaFuncs) ACCRINT(argsList *list.List) formulaArg {
  14373. if argsList.Len() < 6 {
  14374. return newErrorFormulaArg(formulaErrorVALUE, "ACCRINT requires at least 6 arguments")
  14375. }
  14376. if argsList.Len() > 8 {
  14377. return newErrorFormulaArg(formulaErrorVALUE, "ACCRINT allows at most 8 arguments")
  14378. }
  14379. args := fn.prepareDataValueArgs(3, argsList)
  14380. if args.Type != ArgList {
  14381. return args
  14382. }
  14383. issue, settlement := args.List[0], args.List[2]
  14384. rate := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  14385. par := argsList.Front().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  14386. frequency := argsList.Front().Next().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  14387. if rate.Type != ArgNumber || par.Type != ArgNumber || frequency.Type != ArgNumber {
  14388. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14389. }
  14390. if !validateFrequency(frequency.Number) {
  14391. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14392. }
  14393. basis := newNumberFormulaArg(0)
  14394. if argsList.Len() >= 7 {
  14395. if basis = argsList.Front().Next().Next().Next().Next().Next().Next().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  14396. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14397. }
  14398. }
  14399. if argsList.Len() == 8 {
  14400. if cm := argsList.Back().Value.(formulaArg).ToBool(); cm.Type != ArgNumber {
  14401. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  14402. }
  14403. }
  14404. frac1 := yearFrac(issue.Number, settlement.Number, int(basis.Number))
  14405. if frac1.Type != ArgNumber {
  14406. return frac1
  14407. }
  14408. return newNumberFormulaArg(par.Number * rate.Number * frac1.Number)
  14409. }
  14410. // ACCRINTM function returns the accrued interest in a security that pays
  14411. // interest at maturity. The syntax of the function is:
  14412. //
  14413. // ACCRINTM(issue,settlement,rate,[par],[basis])
  14414. func (fn *formulaFuncs) ACCRINTM(argsList *list.List) formulaArg {
  14415. if argsList.Len() != 4 && argsList.Len() != 5 {
  14416. return newErrorFormulaArg(formulaErrorVALUE, "ACCRINTM requires 4 or 5 arguments")
  14417. }
  14418. args := fn.prepareDataValueArgs(2, argsList)
  14419. if args.Type != ArgList {
  14420. return args
  14421. }
  14422. issue, settlement := args.List[0], args.List[1]
  14423. if settlement.Number < issue.Number {
  14424. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14425. }
  14426. rate := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  14427. par := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  14428. if rate.Type != ArgNumber || par.Type != ArgNumber {
  14429. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14430. }
  14431. if par.Number <= 0 {
  14432. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14433. }
  14434. basis := newNumberFormulaArg(0)
  14435. if argsList.Len() == 5 {
  14436. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  14437. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14438. }
  14439. }
  14440. frac := yearFrac(issue.Number, settlement.Number, int(basis.Number))
  14441. if frac.Type != ArgNumber {
  14442. return frac
  14443. }
  14444. return newNumberFormulaArg(frac.Number * rate.Number * par.Number)
  14445. }
  14446. // prepareAmorArgs checking and prepare arguments for the formula functions
  14447. // AMORDEGRC and AMORLINC.
  14448. func (fn *formulaFuncs) prepareAmorArgs(name string, argsList *list.List) formulaArg {
  14449. cost := argsList.Front().Value.(formulaArg).ToNumber()
  14450. if cost.Type != ArgNumber {
  14451. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires cost to be number argument", name))
  14452. }
  14453. if cost.Number < 0 {
  14454. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires cost >= 0", name))
  14455. }
  14456. args := list.New().Init()
  14457. args.PushBack(argsList.Front().Next().Value.(formulaArg))
  14458. datePurchased := fn.DATEVALUE(args)
  14459. if datePurchased.Type != ArgNumber {
  14460. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  14461. }
  14462. args.Init()
  14463. args.PushBack(argsList.Front().Next().Next().Value.(formulaArg))
  14464. firstPeriod := fn.DATEVALUE(args)
  14465. if firstPeriod.Type != ArgNumber {
  14466. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  14467. }
  14468. if firstPeriod.Number < datePurchased.Number {
  14469. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14470. }
  14471. salvage := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  14472. if salvage.Type != ArgNumber {
  14473. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14474. }
  14475. if salvage.Number < 0 || salvage.Number > cost.Number {
  14476. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14477. }
  14478. period := argsList.Front().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  14479. if period.Type != ArgNumber || period.Number < 0 {
  14480. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14481. }
  14482. rate := argsList.Front().Next().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  14483. if rate.Type != ArgNumber || rate.Number < 0 {
  14484. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14485. }
  14486. basis := newNumberFormulaArg(0)
  14487. if argsList.Len() == 7 {
  14488. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  14489. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14490. }
  14491. }
  14492. return newListFormulaArg([]formulaArg{cost, datePurchased, firstPeriod, salvage, period, rate, basis})
  14493. }
  14494. // AMORDEGRC function is provided for users of the French accounting system.
  14495. // The function calculates the prorated linear depreciation of an asset for a
  14496. // specified accounting period. The syntax of the function is:
  14497. //
  14498. // AMORDEGRC(cost,date_purchased,first_period,salvage,period,rate,[basis])
  14499. func (fn *formulaFuncs) AMORDEGRC(argsList *list.List) formulaArg {
  14500. if argsList.Len() != 6 && argsList.Len() != 7 {
  14501. return newErrorFormulaArg(formulaErrorVALUE, "AMORDEGRC requires 6 or 7 arguments")
  14502. }
  14503. args := fn.prepareAmorArgs("AMORDEGRC", argsList)
  14504. if args.Type != ArgList {
  14505. return args
  14506. }
  14507. cost, datePurchased, firstPeriod, salvage, period, rate, basis := args.List[0], args.List[1], args.List[2], args.List[3], args.List[4], args.List[5], args.List[6]
  14508. if rate.Number >= 0.5 {
  14509. return newErrorFormulaArg(formulaErrorNUM, "AMORDEGRC requires rate to be < 0.5")
  14510. }
  14511. assetsLife, amorCoeff := 1/rate.Number, 2.5
  14512. if assetsLife < 3 {
  14513. amorCoeff = 1
  14514. } else if assetsLife < 5 {
  14515. amorCoeff = 1.5
  14516. } else if assetsLife <= 6 {
  14517. amorCoeff = 2
  14518. }
  14519. rate.Number *= amorCoeff
  14520. frac := yearFrac(datePurchased.Number, firstPeriod.Number, int(basis.Number))
  14521. if frac.Type != ArgNumber {
  14522. return frac
  14523. }
  14524. nRate := float64(int((frac.Number * cost.Number * rate.Number) + 0.5))
  14525. cost.Number -= nRate
  14526. rest := cost.Number - salvage.Number
  14527. for n := 0; n < int(period.Number); n++ {
  14528. nRate = float64(int((cost.Number * rate.Number) + 0.5))
  14529. rest -= nRate
  14530. if rest < 0 {
  14531. switch int(period.Number) - n {
  14532. case 0:
  14533. case 1:
  14534. return newNumberFormulaArg(float64(int((cost.Number * 0.5) + 0.5)))
  14535. default:
  14536. return newNumberFormulaArg(0)
  14537. }
  14538. }
  14539. cost.Number -= nRate
  14540. }
  14541. return newNumberFormulaArg(nRate)
  14542. }
  14543. // AMORLINC function is provided for users of the French accounting system.
  14544. // The function calculates the prorated linear depreciation of an asset for a
  14545. // specified accounting period. The syntax of the function is:
  14546. //
  14547. // AMORLINC(cost,date_purchased,first_period,salvage,period,rate,[basis])
  14548. func (fn *formulaFuncs) AMORLINC(argsList *list.List) formulaArg {
  14549. if argsList.Len() != 6 && argsList.Len() != 7 {
  14550. return newErrorFormulaArg(formulaErrorVALUE, "AMORLINC requires 6 or 7 arguments")
  14551. }
  14552. args := fn.prepareAmorArgs("AMORLINC", argsList)
  14553. if args.Type != ArgList {
  14554. return args
  14555. }
  14556. cost, datePurchased, firstPeriod, salvage, period, rate, basis := args.List[0], args.List[1], args.List[2], args.List[3], args.List[4], args.List[5], args.List[6]
  14557. frac := yearFrac(datePurchased.Number, firstPeriod.Number, int(basis.Number))
  14558. if frac.Type != ArgNumber {
  14559. return frac
  14560. }
  14561. rate1 := frac.Number * cost.Number * rate.Number
  14562. if period.Number == 0 {
  14563. return newNumberFormulaArg(rate1)
  14564. }
  14565. rate2 := cost.Number * rate.Number
  14566. delta := cost.Number - salvage.Number
  14567. periods := int((delta - rate1) / rate2)
  14568. if int(period.Number) <= periods {
  14569. return newNumberFormulaArg(rate2)
  14570. } else if int(period.Number)-1 == periods {
  14571. return newNumberFormulaArg(delta - rate2*float64(periods) - math.Nextafter(rate1, rate1))
  14572. }
  14573. return newNumberFormulaArg(0)
  14574. }
  14575. // prepareCouponArgs checking and prepare arguments for the formula functions
  14576. // COUPDAYBS, COUPDAYS, COUPDAYSNC, COUPPCD, COUPNUM and COUPNCD.
  14577. func (fn *formulaFuncs) prepareCouponArgs(name string, argsList *list.List) formulaArg {
  14578. if argsList.Len() != 3 && argsList.Len() != 4 {
  14579. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 3 or 4 arguments", name))
  14580. }
  14581. args := fn.prepareDataValueArgs(2, argsList)
  14582. if args.Type != ArgList {
  14583. return args
  14584. }
  14585. settlement, maturity := args.List[0], args.List[1]
  14586. if settlement.Number >= maturity.Number {
  14587. return newErrorFormulaArg(formulaErrorNUM, fmt.Sprintf("%s requires maturity > settlement", name))
  14588. }
  14589. frequency := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  14590. if frequency.Type != ArgNumber {
  14591. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  14592. }
  14593. if !validateFrequency(frequency.Number) {
  14594. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14595. }
  14596. basis := newNumberFormulaArg(0)
  14597. if argsList.Len() == 4 {
  14598. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  14599. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  14600. }
  14601. }
  14602. return newListFormulaArg([]formulaArg{settlement, maturity, frequency, basis})
  14603. }
  14604. // is30BasisMethod determine if the financial day count basis rules is 30/360
  14605. // methods.
  14606. func is30BasisMethod(basis int) bool {
  14607. return basis == 0 || basis == 4
  14608. }
  14609. // getDaysInMonthRange return the day by given year, month range and day count
  14610. // basis.
  14611. func getDaysInMonthRange(fromMonth, toMonth int) int {
  14612. if fromMonth > toMonth {
  14613. return 0
  14614. }
  14615. return (toMonth - fromMonth + 1) * 30
  14616. }
  14617. // getDayOnBasis returns the day by given date and day count basis.
  14618. func getDayOnBasis(y, m, d, basis int) int {
  14619. if !is30BasisMethod(basis) {
  14620. return d
  14621. }
  14622. day := d
  14623. dim := getDaysInMonth(y, m)
  14624. if day > 30 || d >= dim || day >= dim {
  14625. day = 30
  14626. }
  14627. return day
  14628. }
  14629. // coupdays returns the number of days that base on date range and the day
  14630. // count basis to be used.
  14631. func coupdays(from, to time.Time, basis int) float64 {
  14632. days := 0
  14633. fromY, fromM, fromD := from.Date()
  14634. toY, toM, toD := to.Date()
  14635. fromDay, toDay := getDayOnBasis(fromY, int(fromM), fromD, basis), getDayOnBasis(toY, int(toM), toD, basis)
  14636. if !is30BasisMethod(basis) {
  14637. return (daysBetween(excelMinTime1900.Unix(), makeDate(toY, toM, toDay)) + 1) - (daysBetween(excelMinTime1900.Unix(), makeDate(fromY, fromM, fromDay)) + 1)
  14638. }
  14639. if basis == 0 {
  14640. if (int(fromM) == 2 || fromDay < 30) && toD == 31 {
  14641. toDay = 31
  14642. }
  14643. } else {
  14644. if int(fromM) == 2 && fromDay == 30 {
  14645. fromDay = getDaysInMonth(fromY, 2)
  14646. }
  14647. if int(toM) == 2 && toDay == 30 {
  14648. toDay = getDaysInMonth(toY, 2)
  14649. }
  14650. }
  14651. if fromY < toY || (fromY == toY && int(fromM) < int(toM)) {
  14652. days = 30 - fromDay + 1
  14653. fromD = 1
  14654. fromDay = 1
  14655. date := time.Date(fromY, fromM, fromD, 0, 0, 0, 0, time.UTC).AddDate(0, 1, 0)
  14656. if date.Year() < toY {
  14657. days += getDaysInMonthRange(int(date.Month()), 12)
  14658. date = date.AddDate(0, 13-int(date.Month()), 0)
  14659. }
  14660. days += getDaysInMonthRange(int(date.Month()), int(toM)-1)
  14661. }
  14662. if days += toDay - fromDay; days > 0 {
  14663. return float64(days)
  14664. }
  14665. return 0
  14666. }
  14667. // COUPDAYBS function calculates the number of days from the beginning of a
  14668. // coupon's period to the settlement date. The syntax of the function is:
  14669. //
  14670. // COUPDAYBS(settlement,maturity,frequency,[basis])
  14671. func (fn *formulaFuncs) COUPDAYBS(argsList *list.List) formulaArg {
  14672. args := fn.prepareCouponArgs("COUPDAYBS", argsList)
  14673. if args.Type != ArgList {
  14674. return args
  14675. }
  14676. settlement := timeFromExcelTime(args.List[0].Number, false)
  14677. pcd := timeFromExcelTime(fn.COUPPCD(argsList).Number, false)
  14678. return newNumberFormulaArg(coupdays(pcd, settlement, int(args.List[3].Number)))
  14679. }
  14680. // COUPDAYS function calculates the number of days in a coupon period that
  14681. // contains the settlement date. The syntax of the function is:
  14682. //
  14683. // COUPDAYS(settlement,maturity,frequency,[basis])
  14684. func (fn *formulaFuncs) COUPDAYS(argsList *list.List) formulaArg {
  14685. args := fn.prepareCouponArgs("COUPDAYS", argsList)
  14686. if args.Type != ArgList {
  14687. return args
  14688. }
  14689. freq := args.List[2].Number
  14690. basis := int(args.List[3].Number)
  14691. if basis == 1 {
  14692. pcd := timeFromExcelTime(fn.COUPPCD(argsList).Number, false)
  14693. next := pcd.AddDate(0, 12/int(freq), 0)
  14694. return newNumberFormulaArg(coupdays(pcd, next, basis))
  14695. }
  14696. return newNumberFormulaArg(float64(getYearDays(0, basis)) / freq)
  14697. }
  14698. // COUPDAYSNC function calculates the number of days from the settlement date
  14699. // to the next coupon date. The syntax of the function is:
  14700. //
  14701. // COUPDAYSNC(settlement,maturity,frequency,[basis])
  14702. func (fn *formulaFuncs) COUPDAYSNC(argsList *list.List) formulaArg {
  14703. args := fn.prepareCouponArgs("COUPDAYSNC", argsList)
  14704. if args.Type != ArgList {
  14705. return args
  14706. }
  14707. settlement := timeFromExcelTime(args.List[0].Number, false)
  14708. basis := int(args.List[3].Number)
  14709. ncd := timeFromExcelTime(fn.COUPNCD(argsList).Number, false)
  14710. return newNumberFormulaArg(coupdays(settlement, ncd, basis))
  14711. }
  14712. // coupons is an implementation of the formula functions COUPNCD and COUPPCD.
  14713. func (fn *formulaFuncs) coupons(name string, arg formulaArg) formulaArg {
  14714. settlement := timeFromExcelTime(arg.List[0].Number, false)
  14715. maturity := timeFromExcelTime(arg.List[1].Number, false)
  14716. maturityDays := (maturity.Year()-settlement.Year())*12 + (int(maturity.Month()) - int(settlement.Month()))
  14717. coupon := 12 / int(arg.List[2].Number)
  14718. mod := maturityDays % coupon
  14719. year := settlement.Year()
  14720. month := int(settlement.Month())
  14721. if mod == 0 && settlement.Day() >= maturity.Day() {
  14722. month += coupon
  14723. } else {
  14724. month += mod
  14725. }
  14726. if name != "COUPNCD" {
  14727. month -= coupon
  14728. }
  14729. if month > 11 {
  14730. year++
  14731. month -= 12
  14732. } else if month < 0 {
  14733. year--
  14734. month += 12
  14735. }
  14736. day, lastDay := maturity.Day(), time.Date(year, time.Month(month), 1, 0, 0, 0, 0, time.UTC)
  14737. days := getDaysInMonth(lastDay.Year(), int(lastDay.Month()))
  14738. if getDaysInMonth(maturity.Year(), int(maturity.Month())) == maturity.Day() {
  14739. day = days
  14740. } else if day > 27 && day > days {
  14741. day = days
  14742. }
  14743. return newNumberFormulaArg(daysBetween(excelMinTime1900.Unix(), makeDate(year, time.Month(month), day)) + 1)
  14744. }
  14745. // COUPNCD function calculates the number of coupons payable, between a
  14746. // security's settlement date and maturity date, rounded up to the nearest
  14747. // whole coupon. The syntax of the function is:
  14748. //
  14749. // COUPNCD(settlement,maturity,frequency,[basis])
  14750. func (fn *formulaFuncs) COUPNCD(argsList *list.List) formulaArg {
  14751. args := fn.prepareCouponArgs("COUPNCD", argsList)
  14752. if args.Type != ArgList {
  14753. return args
  14754. }
  14755. return fn.coupons("COUPNCD", args)
  14756. }
  14757. // COUPNUM function calculates the number of coupons payable, between a
  14758. // security's settlement date and maturity date, rounded up to the nearest
  14759. // whole coupon. The syntax of the function is:
  14760. //
  14761. // COUPNUM(settlement,maturity,frequency,[basis])
  14762. func (fn *formulaFuncs) COUPNUM(argsList *list.List) formulaArg {
  14763. args := fn.prepareCouponArgs("COUPNUM", argsList)
  14764. if args.Type != ArgList {
  14765. return args
  14766. }
  14767. frac := yearFrac(args.List[0].Number, args.List[1].Number, 0)
  14768. return newNumberFormulaArg(math.Ceil(frac.Number * args.List[2].Number))
  14769. }
  14770. // COUPPCD function returns the previous coupon date, before the settlement
  14771. // date for a security. The syntax of the function is:
  14772. //
  14773. // COUPPCD(settlement,maturity,frequency,[basis])
  14774. func (fn *formulaFuncs) COUPPCD(argsList *list.List) formulaArg {
  14775. args := fn.prepareCouponArgs("COUPPCD", argsList)
  14776. if args.Type != ArgList {
  14777. return args
  14778. }
  14779. return fn.coupons("COUPPCD", args)
  14780. }
  14781. // CUMIPMT function calculates the cumulative interest paid on a loan or
  14782. // investment, between two specified periods. The syntax of the function is:
  14783. //
  14784. // CUMIPMT(rate,nper,pv,start_period,end_period,type)
  14785. func (fn *formulaFuncs) CUMIPMT(argsList *list.List) formulaArg {
  14786. return fn.cumip("CUMIPMT", argsList)
  14787. }
  14788. // CUMPRINC function calculates the cumulative payment on the principal of a
  14789. // loan or investment, between two specified periods. The syntax of the
  14790. // function is:
  14791. //
  14792. // CUMPRINC(rate,nper,pv,start_period,end_period,type)
  14793. func (fn *formulaFuncs) CUMPRINC(argsList *list.List) formulaArg {
  14794. return fn.cumip("CUMPRINC", argsList)
  14795. }
  14796. // cumip is an implementation of the formula functions CUMIPMT and CUMPRINC.
  14797. func (fn *formulaFuncs) cumip(name string, argsList *list.List) formulaArg {
  14798. if argsList.Len() != 6 {
  14799. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 6 arguments", name))
  14800. }
  14801. rate := argsList.Front().Value.(formulaArg).ToNumber()
  14802. if rate.Type != ArgNumber {
  14803. return rate
  14804. }
  14805. nper := argsList.Front().Next().Value.(formulaArg).ToNumber()
  14806. if nper.Type != ArgNumber {
  14807. return nper
  14808. }
  14809. pv := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  14810. if pv.Type != ArgNumber {
  14811. return pv
  14812. }
  14813. start := argsList.Back().Prev().Prev().Value.(formulaArg).ToNumber()
  14814. if start.Type != ArgNumber {
  14815. return start
  14816. }
  14817. end := argsList.Back().Prev().Value.(formulaArg).ToNumber()
  14818. if end.Type != ArgNumber {
  14819. return end
  14820. }
  14821. typ := argsList.Back().Value.(formulaArg).ToNumber()
  14822. if typ.Type != ArgNumber {
  14823. return typ
  14824. }
  14825. if typ.Number != 0 && typ.Number != 1 {
  14826. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  14827. }
  14828. if start.Number < 1 || start.Number > end.Number {
  14829. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  14830. }
  14831. num := 0.0
  14832. for per := start.Number; per <= end.Number; per++ {
  14833. args := list.New().Init()
  14834. args.PushBack(rate)
  14835. args.PushBack(newNumberFormulaArg(per))
  14836. args.PushBack(nper)
  14837. args.PushBack(pv)
  14838. args.PushBack(newNumberFormulaArg(0))
  14839. args.PushBack(typ)
  14840. if name == "CUMIPMT" {
  14841. num += fn.IPMT(args).Number
  14842. continue
  14843. }
  14844. num += fn.PPMT(args).Number
  14845. }
  14846. return newNumberFormulaArg(num)
  14847. }
  14848. // calcDbArgsCompare implements common arguments' comparison for DB and DDB.
  14849. func calcDbArgsCompare(cost, salvage, life, period formulaArg) bool {
  14850. return (cost.Number <= 0) || ((salvage.Number / cost.Number) < 0) || (life.Number <= 0) || (period.Number < 1)
  14851. }
  14852. // DB function calculates the depreciation of an asset, using the Fixed
  14853. // Declining Balance Method, for each period of the asset's lifetime. The
  14854. // syntax of the function is:
  14855. //
  14856. // DB(cost,salvage,life,period,[month])
  14857. func (fn *formulaFuncs) DB(argsList *list.List) formulaArg {
  14858. if argsList.Len() < 4 {
  14859. return newErrorFormulaArg(formulaErrorVALUE, "DB requires at least 4 arguments")
  14860. }
  14861. if argsList.Len() > 5 {
  14862. return newErrorFormulaArg(formulaErrorVALUE, "DB allows at most 5 arguments")
  14863. }
  14864. cost := argsList.Front().Value.(formulaArg).ToNumber()
  14865. if cost.Type != ArgNumber {
  14866. return cost
  14867. }
  14868. salvage := argsList.Front().Next().Value.(formulaArg).ToNumber()
  14869. if salvage.Type != ArgNumber {
  14870. return salvage
  14871. }
  14872. life := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  14873. if life.Type != ArgNumber {
  14874. return life
  14875. }
  14876. period := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  14877. if period.Type != ArgNumber {
  14878. return period
  14879. }
  14880. month := newNumberFormulaArg(12)
  14881. if argsList.Len() == 5 {
  14882. if month = argsList.Back().Value.(formulaArg).ToNumber(); month.Type != ArgNumber {
  14883. return month
  14884. }
  14885. }
  14886. if cost.Number == 0 {
  14887. return newNumberFormulaArg(0)
  14888. }
  14889. if calcDbArgsCompare(cost, salvage, life, period) || (month.Number < 1) {
  14890. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  14891. }
  14892. dr := 1 - math.Pow(salvage.Number/cost.Number, 1/life.Number)
  14893. dr = math.Round(dr*1000) / 1000
  14894. pd, depreciation := 0.0, 0.0
  14895. for per := 1; per <= int(period.Number); per++ {
  14896. if per == 1 {
  14897. depreciation = cost.Number * dr * month.Number / 12
  14898. } else if per == int(life.Number+1) {
  14899. depreciation = (cost.Number - pd) * dr * (12 - month.Number) / 12
  14900. } else {
  14901. depreciation = (cost.Number - pd) * dr
  14902. }
  14903. pd += depreciation
  14904. }
  14905. return newNumberFormulaArg(depreciation)
  14906. }
  14907. // DDB function calculates the depreciation of an asset, using the Double
  14908. // Declining Balance Method, or another specified depreciation rate. The
  14909. // syntax of the function is:
  14910. //
  14911. // DDB(cost,salvage,life,period,[factor])
  14912. func (fn *formulaFuncs) DDB(argsList *list.List) formulaArg {
  14913. if argsList.Len() < 4 {
  14914. return newErrorFormulaArg(formulaErrorVALUE, "DDB requires at least 4 arguments")
  14915. }
  14916. if argsList.Len() > 5 {
  14917. return newErrorFormulaArg(formulaErrorVALUE, "DDB allows at most 5 arguments")
  14918. }
  14919. cost := argsList.Front().Value.(formulaArg).ToNumber()
  14920. if cost.Type != ArgNumber {
  14921. return cost
  14922. }
  14923. salvage := argsList.Front().Next().Value.(formulaArg).ToNumber()
  14924. if salvage.Type != ArgNumber {
  14925. return salvage
  14926. }
  14927. life := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  14928. if life.Type != ArgNumber {
  14929. return life
  14930. }
  14931. period := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  14932. if period.Type != ArgNumber {
  14933. return period
  14934. }
  14935. factor := newNumberFormulaArg(2)
  14936. if argsList.Len() == 5 {
  14937. if factor = argsList.Back().Value.(formulaArg).ToNumber(); factor.Type != ArgNumber {
  14938. return factor
  14939. }
  14940. }
  14941. if cost.Number == 0 {
  14942. return newNumberFormulaArg(0)
  14943. }
  14944. if calcDbArgsCompare(cost, salvage, life, period) || (factor.Number <= 0.0) || (period.Number > life.Number) {
  14945. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  14946. }
  14947. pd, depreciation := 0.0, 0.0
  14948. for per := 1; per <= int(period.Number); per++ {
  14949. depreciation = math.Min((cost.Number-pd)*(factor.Number/life.Number), cost.Number-salvage.Number-pd)
  14950. pd += depreciation
  14951. }
  14952. return newNumberFormulaArg(depreciation)
  14953. }
  14954. // prepareDataValueArgs convert first N arguments to data value for the
  14955. // formula functions.
  14956. func (fn *formulaFuncs) prepareDataValueArgs(n int, argsList *list.List) formulaArg {
  14957. l := list.New()
  14958. var dataValues []formulaArg
  14959. getDateValue := func(arg formulaArg, l *list.List) formulaArg {
  14960. switch arg.Type {
  14961. case ArgNumber:
  14962. break
  14963. case ArgString:
  14964. num := arg.ToNumber()
  14965. if num.Type == ArgNumber {
  14966. arg = num
  14967. break
  14968. }
  14969. l.Init()
  14970. l.PushBack(arg)
  14971. arg = fn.DATEVALUE(l)
  14972. if arg.Type == ArgError {
  14973. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  14974. }
  14975. default:
  14976. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  14977. }
  14978. return arg
  14979. }
  14980. for i, arg := 0, argsList.Front(); i < n; arg = arg.Next() {
  14981. dataValue := getDateValue(arg.Value.(formulaArg), l)
  14982. if dataValue.Type != ArgNumber {
  14983. return dataValue
  14984. }
  14985. dataValues = append(dataValues, dataValue)
  14986. i++
  14987. }
  14988. return newListFormulaArg(dataValues)
  14989. }
  14990. // DISC function calculates the Discount Rate for a security. The syntax of
  14991. // the function is:
  14992. //
  14993. // DISC(settlement,maturity,pr,redemption,[basis])
  14994. func (fn *formulaFuncs) DISC(argsList *list.List) formulaArg {
  14995. if argsList.Len() != 4 && argsList.Len() != 5 {
  14996. return newErrorFormulaArg(formulaErrorVALUE, "DISC requires 4 or 5 arguments")
  14997. }
  14998. args := fn.prepareDataValueArgs(2, argsList)
  14999. if args.Type != ArgList {
  15000. return args
  15001. }
  15002. settlement, maturity := args.List[0], args.List[1]
  15003. if maturity.Number <= settlement.Number {
  15004. return newErrorFormulaArg(formulaErrorNUM, "DISC requires maturity > settlement")
  15005. }
  15006. pr := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  15007. if pr.Type != ArgNumber {
  15008. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  15009. }
  15010. if pr.Number <= 0 {
  15011. return newErrorFormulaArg(formulaErrorNUM, "DISC requires pr > 0")
  15012. }
  15013. redemption := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  15014. if redemption.Type != ArgNumber {
  15015. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  15016. }
  15017. if redemption.Number <= 0 {
  15018. return newErrorFormulaArg(formulaErrorNUM, "DISC requires redemption > 0")
  15019. }
  15020. basis := newNumberFormulaArg(0)
  15021. if argsList.Len() == 5 {
  15022. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  15023. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  15024. }
  15025. }
  15026. frac := yearFrac(settlement.Number, maturity.Number, int(basis.Number))
  15027. if frac.Type != ArgNumber {
  15028. return frac
  15029. }
  15030. return newNumberFormulaArg((redemption.Number - pr.Number) / redemption.Number / frac.Number)
  15031. }
  15032. // DOLLARDE function converts a dollar value in fractional notation, into a
  15033. // dollar value expressed as a decimal. The syntax of the function is:
  15034. //
  15035. // DOLLARDE(fractional_dollar,fraction)
  15036. func (fn *formulaFuncs) DOLLARDE(argsList *list.List) formulaArg {
  15037. return fn.dollar("DOLLARDE", argsList)
  15038. }
  15039. // DOLLARFR function converts a dollar value in decimal notation, into a
  15040. // dollar value that is expressed in fractional notation. The syntax of the
  15041. // function is:
  15042. //
  15043. // DOLLARFR(decimal_dollar,fraction)
  15044. func (fn *formulaFuncs) DOLLARFR(argsList *list.List) formulaArg {
  15045. return fn.dollar("DOLLARFR", argsList)
  15046. }
  15047. // dollar is an implementation of the formula functions DOLLARDE and DOLLARFR.
  15048. func (fn *formulaFuncs) dollar(name string, argsList *list.List) formulaArg {
  15049. if argsList.Len() != 2 {
  15050. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 2 arguments", name))
  15051. }
  15052. dollar := argsList.Front().Value.(formulaArg).ToNumber()
  15053. if dollar.Type != ArgNumber {
  15054. return dollar
  15055. }
  15056. frac := argsList.Back().Value.(formulaArg).ToNumber()
  15057. if frac.Type != ArgNumber {
  15058. return frac
  15059. }
  15060. if frac.Number < 0 {
  15061. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  15062. }
  15063. if frac.Number == 0 {
  15064. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  15065. }
  15066. cents := math.Mod(dollar.Number, 1)
  15067. if name == "DOLLARDE" {
  15068. cents /= frac.Number
  15069. cents *= math.Pow(10, math.Ceil(math.Log10(frac.Number)))
  15070. } else {
  15071. cents *= frac.Number
  15072. cents *= math.Pow(10, -math.Ceil(math.Log10(frac.Number)))
  15073. }
  15074. return newNumberFormulaArg(math.Floor(dollar.Number) + cents)
  15075. }
  15076. // prepareDurationArgs checking and prepare arguments for the formula
  15077. // functions DURATION and MDURATION.
  15078. func (fn *formulaFuncs) prepareDurationArgs(name string, argsList *list.List) formulaArg {
  15079. if argsList.Len() != 5 && argsList.Len() != 6 {
  15080. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 5 or 6 arguments", name))
  15081. }
  15082. args := fn.prepareDataValueArgs(2, argsList)
  15083. if args.Type != ArgList {
  15084. return args
  15085. }
  15086. settlement, maturity := args.List[0], args.List[1]
  15087. if settlement.Number >= maturity.Number {
  15088. return newErrorFormulaArg(formulaErrorNUM, fmt.Sprintf("%s requires maturity > settlement", name))
  15089. }
  15090. coupon := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  15091. if coupon.Type != ArgNumber {
  15092. return coupon
  15093. }
  15094. if coupon.Number < 0 {
  15095. return newErrorFormulaArg(formulaErrorNUM, fmt.Sprintf("%s requires coupon >= 0", name))
  15096. }
  15097. yld := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  15098. if yld.Type != ArgNumber {
  15099. return yld
  15100. }
  15101. if yld.Number < 0 {
  15102. return newErrorFormulaArg(formulaErrorNUM, fmt.Sprintf("%s requires yld >= 0", name))
  15103. }
  15104. frequency := argsList.Front().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  15105. if frequency.Type != ArgNumber {
  15106. return frequency
  15107. }
  15108. if !validateFrequency(frequency.Number) {
  15109. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  15110. }
  15111. basis := newNumberFormulaArg(0)
  15112. if argsList.Len() == 6 {
  15113. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  15114. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  15115. }
  15116. }
  15117. return newListFormulaArg([]formulaArg{settlement, maturity, coupon, yld, frequency, basis})
  15118. }
  15119. // duration is an implementation of the formula function DURATION.
  15120. func (fn *formulaFuncs) duration(settlement, maturity, coupon, yld, frequency, basis formulaArg) formulaArg {
  15121. frac := yearFrac(settlement.Number, maturity.Number, int(basis.Number))
  15122. if frac.Type != ArgNumber {
  15123. return frac
  15124. }
  15125. argumments := list.New().Init()
  15126. argumments.PushBack(settlement)
  15127. argumments.PushBack(maturity)
  15128. argumments.PushBack(frequency)
  15129. argumments.PushBack(basis)
  15130. coups := fn.COUPNUM(argumments)
  15131. duration := 0.0
  15132. p := 0.0
  15133. coupon.Number *= 100 / frequency.Number
  15134. yld.Number /= frequency.Number
  15135. yld.Number++
  15136. diff := frac.Number*frequency.Number - coups.Number
  15137. for t := 1.0; t < coups.Number; t++ {
  15138. tDiff := t + diff
  15139. add := coupon.Number / math.Pow(yld.Number, tDiff)
  15140. p += add
  15141. duration += tDiff * add
  15142. }
  15143. add := (coupon.Number + 100) / math.Pow(yld.Number, coups.Number+diff)
  15144. p += add
  15145. duration += (coups.Number + diff) * add
  15146. duration /= p
  15147. duration /= frequency.Number
  15148. return newNumberFormulaArg(duration)
  15149. }
  15150. // DURATION function calculates the Duration (specifically, the Macaulay
  15151. // Duration) of a security that pays periodic interest, assuming a par value
  15152. // of $100. The syntax of the function is:
  15153. //
  15154. // DURATION(settlement,maturity,coupon,yld,frequency,[basis])
  15155. func (fn *formulaFuncs) DURATION(argsList *list.List) formulaArg {
  15156. args := fn.prepareDurationArgs("DURATION", argsList)
  15157. if args.Type != ArgList {
  15158. return args
  15159. }
  15160. return fn.duration(args.List[0], args.List[1], args.List[2], args.List[3], args.List[4], args.List[5])
  15161. }
  15162. // EFFECT function returns the effective annual interest rate for a given
  15163. // nominal interest rate and number of compounding periods per year. The
  15164. // syntax of the function is:
  15165. //
  15166. // EFFECT(nominal_rate,npery)
  15167. func (fn *formulaFuncs) EFFECT(argsList *list.List) formulaArg {
  15168. if argsList.Len() != 2 {
  15169. return newErrorFormulaArg(formulaErrorVALUE, "EFFECT requires 2 arguments")
  15170. }
  15171. rate := argsList.Front().Value.(formulaArg).ToNumber()
  15172. if rate.Type != ArgNumber {
  15173. return rate
  15174. }
  15175. npery := argsList.Back().Value.(formulaArg).ToNumber()
  15176. if npery.Type != ArgNumber {
  15177. return npery
  15178. }
  15179. if rate.Number <= 0 || npery.Number < 1 {
  15180. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  15181. }
  15182. return newNumberFormulaArg(math.Pow(1+rate.Number/npery.Number, npery.Number) - 1)
  15183. }
  15184. // EUROCONVERT function convert a number to euro or from euro to a
  15185. // participating currency. You can also use it to convert a number from one
  15186. // participating currency to another by using the euro as an intermediary
  15187. // (triangulation). The syntax of the function is:
  15188. //
  15189. // EUROCONVERT(number,sourcecurrency,targetcurrency[,fullprecision,triangulationprecision])
  15190. func (fn *formulaFuncs) EUROCONVERT(argsList *list.List) formulaArg {
  15191. if argsList.Len() < 3 {
  15192. return newErrorFormulaArg(formulaErrorVALUE, "EUROCONVERT requires at least 3 arguments")
  15193. }
  15194. if argsList.Len() > 5 {
  15195. return newErrorFormulaArg(formulaErrorVALUE, "EUROCONVERT allows at most 5 arguments")
  15196. }
  15197. number := argsList.Front().Value.(formulaArg).ToNumber()
  15198. if number.Type != ArgNumber {
  15199. return number
  15200. }
  15201. sourceCurrency := argsList.Front().Next().Value.(formulaArg).Value()
  15202. targetCurrency := argsList.Front().Next().Next().Value.(formulaArg).Value()
  15203. fullPrec, triangulationPrec := newBoolFormulaArg(false), newNumberFormulaArg(0)
  15204. if argsList.Len() >= 4 {
  15205. if fullPrec = argsList.Front().Next().Next().Next().Value.(formulaArg).ToBool(); fullPrec.Type != ArgNumber {
  15206. return fullPrec
  15207. }
  15208. }
  15209. if argsList.Len() == 5 {
  15210. if triangulationPrec = argsList.Back().Value.(formulaArg).ToNumber(); triangulationPrec.Type != ArgNumber {
  15211. return triangulationPrec
  15212. }
  15213. }
  15214. convertTable := map[string][]float64{
  15215. "EUR": {1.0, 2},
  15216. "ATS": {13.7603, 2},
  15217. "BEF": {40.3399, 0},
  15218. "DEM": {1.95583, 2},
  15219. "ESP": {166.386, 0},
  15220. "FIM": {5.94573, 2},
  15221. "FRF": {6.55957, 2},
  15222. "IEP": {0.787564, 2},
  15223. "ITL": {1936.27, 0},
  15224. "LUF": {40.3399, 0},
  15225. "NLG": {2.20371, 2},
  15226. "PTE": {200.482, 2},
  15227. "GRD": {340.750, 2},
  15228. "SIT": {239.640, 2},
  15229. "MTL": {0.429300, 2},
  15230. "CYP": {0.585274, 2},
  15231. "SKK": {30.1260, 2},
  15232. "EEK": {15.6466, 2},
  15233. "LVL": {0.702804, 2},
  15234. "LTL": {3.45280, 2},
  15235. }
  15236. source, ok := convertTable[sourceCurrency]
  15237. if !ok {
  15238. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  15239. }
  15240. target, ok := convertTable[targetCurrency]
  15241. if !ok {
  15242. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  15243. }
  15244. if sourceCurrency == targetCurrency {
  15245. return number
  15246. }
  15247. var res float64
  15248. if sourceCurrency == "EUR" {
  15249. res = number.Number * target[0]
  15250. } else {
  15251. intermediate := number.Number / source[0]
  15252. if triangulationPrec.Number != 0 {
  15253. ratio := math.Pow(10, triangulationPrec.Number)
  15254. intermediate = math.Round(intermediate*ratio) / ratio
  15255. }
  15256. res = intermediate * target[0]
  15257. }
  15258. if fullPrec.Number != 1 {
  15259. ratio := math.Pow(10, target[1])
  15260. res = math.Round(res*ratio) / ratio
  15261. }
  15262. return newNumberFormulaArg(res)
  15263. }
  15264. // FV function calculates the Future Value of an investment with periodic
  15265. // constant payments and a constant interest rate. The syntax of the function
  15266. // is:
  15267. //
  15268. // FV(rate,nper,[pmt],[pv],[type])
  15269. func (fn *formulaFuncs) FV(argsList *list.List) formulaArg {
  15270. if argsList.Len() < 3 {
  15271. return newErrorFormulaArg(formulaErrorVALUE, "FV requires at least 3 arguments")
  15272. }
  15273. if argsList.Len() > 5 {
  15274. return newErrorFormulaArg(formulaErrorVALUE, "FV allows at most 5 arguments")
  15275. }
  15276. rate := argsList.Front().Value.(formulaArg).ToNumber()
  15277. if rate.Type != ArgNumber {
  15278. return rate
  15279. }
  15280. nper := argsList.Front().Next().Value.(formulaArg).ToNumber()
  15281. if nper.Type != ArgNumber {
  15282. return nper
  15283. }
  15284. pmt := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  15285. if pmt.Type != ArgNumber {
  15286. return pmt
  15287. }
  15288. pv, typ := newNumberFormulaArg(0), newNumberFormulaArg(0)
  15289. if argsList.Len() >= 4 {
  15290. if pv = argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber(); pv.Type != ArgNumber {
  15291. return pv
  15292. }
  15293. }
  15294. if argsList.Len() == 5 {
  15295. if typ = argsList.Back().Value.(formulaArg).ToNumber(); typ.Type != ArgNumber {
  15296. return typ
  15297. }
  15298. }
  15299. if typ.Number != 0 && typ.Number != 1 {
  15300. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  15301. }
  15302. if rate.Number != 0 {
  15303. return newNumberFormulaArg(-pv.Number*math.Pow(1+rate.Number, nper.Number) - pmt.Number*(1+rate.Number*typ.Number)*(math.Pow(1+rate.Number, nper.Number)-1)/rate.Number)
  15304. }
  15305. return newNumberFormulaArg(-pv.Number - pmt.Number*nper.Number)
  15306. }
  15307. // FVSCHEDULE function calculates the Future Value of an investment with a
  15308. // variable interest rate. The syntax of the function is:
  15309. //
  15310. // FVSCHEDULE(principal,schedule)
  15311. func (fn *formulaFuncs) FVSCHEDULE(argsList *list.List) formulaArg {
  15312. if argsList.Len() != 2 {
  15313. return newErrorFormulaArg(formulaErrorVALUE, "FVSCHEDULE requires 2 arguments")
  15314. }
  15315. pri := argsList.Front().Value.(formulaArg).ToNumber()
  15316. if pri.Type != ArgNumber {
  15317. return pri
  15318. }
  15319. principal := pri.Number
  15320. for _, arg := range argsList.Back().Value.(formulaArg).ToList() {
  15321. if arg.Value() == "" {
  15322. continue
  15323. }
  15324. rate := arg.ToNumber()
  15325. if rate.Type != ArgNumber {
  15326. return rate
  15327. }
  15328. principal *= 1 + rate.Number
  15329. }
  15330. return newNumberFormulaArg(principal)
  15331. }
  15332. // INTRATE function calculates the interest rate for a fully invested
  15333. // security. The syntax of the function is:
  15334. //
  15335. // INTRATE(settlement,maturity,investment,redemption,[basis])
  15336. func (fn *formulaFuncs) INTRATE(argsList *list.List) formulaArg {
  15337. if argsList.Len() != 4 && argsList.Len() != 5 {
  15338. return newErrorFormulaArg(formulaErrorVALUE, "INTRATE requires 4 or 5 arguments")
  15339. }
  15340. args := fn.prepareDataValueArgs(2, argsList)
  15341. if args.Type != ArgList {
  15342. return args
  15343. }
  15344. settlement, maturity := args.List[0], args.List[1]
  15345. if maturity.Number <= settlement.Number {
  15346. return newErrorFormulaArg(formulaErrorNUM, "INTRATE requires maturity > settlement")
  15347. }
  15348. investment := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  15349. if investment.Type != ArgNumber {
  15350. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  15351. }
  15352. if investment.Number <= 0 {
  15353. return newErrorFormulaArg(formulaErrorNUM, "INTRATE requires investment > 0")
  15354. }
  15355. redemption := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  15356. if redemption.Type != ArgNumber {
  15357. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  15358. }
  15359. if redemption.Number <= 0 {
  15360. return newErrorFormulaArg(formulaErrorNUM, "INTRATE requires redemption > 0")
  15361. }
  15362. basis := newNumberFormulaArg(0)
  15363. if argsList.Len() == 5 {
  15364. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  15365. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  15366. }
  15367. }
  15368. frac := yearFrac(settlement.Number, maturity.Number, int(basis.Number))
  15369. if frac.Type != ArgNumber {
  15370. return frac
  15371. }
  15372. return newNumberFormulaArg((redemption.Number - investment.Number) / investment.Number / frac.Number)
  15373. }
  15374. // IPMT function calculates the interest payment, during a specific period of a
  15375. // loan or investment that is paid in constant periodic payments, with a
  15376. // constant interest rate. The syntax of the function is:
  15377. //
  15378. // IPMT(rate,per,nper,pv,[fv],[type])
  15379. func (fn *formulaFuncs) IPMT(argsList *list.List) formulaArg {
  15380. return fn.ipmt("IPMT", argsList)
  15381. }
  15382. // calcIpmt is part of the implementation ipmt.
  15383. func calcIpmt(name string, typ, per, pmt, pv, rate formulaArg) formulaArg {
  15384. capital, interest, principal := pv.Number, 0.0, 0.0
  15385. for i := 1; i <= int(per.Number); i++ {
  15386. if typ.Number != 0 && i == 1 {
  15387. interest = 0
  15388. } else {
  15389. interest = -capital * rate.Number
  15390. }
  15391. principal = pmt.Number - interest
  15392. capital += principal
  15393. }
  15394. if name == "IPMT" {
  15395. return newNumberFormulaArg(interest)
  15396. }
  15397. return newNumberFormulaArg(principal)
  15398. }
  15399. // ipmt is an implementation of the formula functions IPMT and PPMT.
  15400. func (fn *formulaFuncs) ipmt(name string, argsList *list.List) formulaArg {
  15401. if argsList.Len() < 4 {
  15402. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at least 4 arguments", name))
  15403. }
  15404. if argsList.Len() > 6 {
  15405. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s allows at most 6 arguments", name))
  15406. }
  15407. rate := argsList.Front().Value.(formulaArg).ToNumber()
  15408. if rate.Type != ArgNumber {
  15409. return rate
  15410. }
  15411. per := argsList.Front().Next().Value.(formulaArg).ToNumber()
  15412. if per.Type != ArgNumber {
  15413. return per
  15414. }
  15415. nper := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  15416. if nper.Type != ArgNumber {
  15417. return nper
  15418. }
  15419. pv := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  15420. if pv.Type != ArgNumber {
  15421. return pv
  15422. }
  15423. fv, typ := newNumberFormulaArg(0), newNumberFormulaArg(0)
  15424. if argsList.Len() >= 5 {
  15425. if fv = argsList.Front().Next().Next().Next().Next().Value.(formulaArg).ToNumber(); fv.Type != ArgNumber {
  15426. return fv
  15427. }
  15428. }
  15429. if argsList.Len() == 6 {
  15430. if typ = argsList.Back().Value.(formulaArg).ToNumber(); typ.Type != ArgNumber {
  15431. return typ
  15432. }
  15433. }
  15434. if typ.Number != 0 && typ.Number != 1 {
  15435. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  15436. }
  15437. if per.Number <= 0 || per.Number > nper.Number {
  15438. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  15439. }
  15440. args := list.New().Init()
  15441. args.PushBack(rate)
  15442. args.PushBack(nper)
  15443. args.PushBack(pv)
  15444. args.PushBack(fv)
  15445. args.PushBack(typ)
  15446. pmt := fn.PMT(args)
  15447. return calcIpmt(name, typ, per, pmt, pv, rate)
  15448. }
  15449. // IRR function returns the Internal Rate of Return for a supplied series of
  15450. // periodic cash flows (i.e. an initial investment value and a series of net
  15451. // income values). The syntax of the function is:
  15452. //
  15453. // IRR(values,[guess])
  15454. func (fn *formulaFuncs) IRR(argsList *list.List) formulaArg {
  15455. if argsList.Len() < 1 {
  15456. return newErrorFormulaArg(formulaErrorVALUE, "IRR requires at least 1 argument")
  15457. }
  15458. if argsList.Len() > 2 {
  15459. return newErrorFormulaArg(formulaErrorVALUE, "IRR allows at most 2 arguments")
  15460. }
  15461. values, guess := argsList.Front().Value.(formulaArg).ToList(), newNumberFormulaArg(0.1)
  15462. if argsList.Len() > 1 {
  15463. if guess = argsList.Back().Value.(formulaArg).ToNumber(); guess.Type != ArgNumber {
  15464. return guess
  15465. }
  15466. }
  15467. x1, x2 := newNumberFormulaArg(0), guess
  15468. args := list.New().Init()
  15469. args.PushBack(x1)
  15470. for _, v := range values {
  15471. args.PushBack(v)
  15472. }
  15473. f1 := fn.NPV(args)
  15474. args.Front().Value = x2
  15475. f2 := fn.NPV(args)
  15476. for i := 0; i < maxFinancialIterations; i++ {
  15477. if f1.Number*f2.Number < 0 {
  15478. break
  15479. }
  15480. if math.Abs(f1.Number) < math.Abs(f2.Number) {
  15481. x1.Number += 1.6 * (x1.Number - x2.Number)
  15482. args.Front().Value = x1
  15483. f1 = fn.NPV(args)
  15484. continue
  15485. }
  15486. x2.Number += 1.6 * (x2.Number - x1.Number)
  15487. args.Front().Value = x2
  15488. f2 = fn.NPV(args)
  15489. }
  15490. if f1.Number*f2.Number > 0 {
  15491. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  15492. }
  15493. args.Front().Value = x1
  15494. f := fn.NPV(args)
  15495. var rtb, dx, xMid, fMid float64
  15496. if f.Number < 0 {
  15497. rtb = x1.Number
  15498. dx = x2.Number - x1.Number
  15499. } else {
  15500. rtb = x2.Number
  15501. dx = x1.Number - x2.Number
  15502. }
  15503. for i := 0; i < maxFinancialIterations; i++ {
  15504. dx *= 0.5
  15505. xMid = rtb + dx
  15506. args.Front().Value = newNumberFormulaArg(xMid)
  15507. fMid = fn.NPV(args).Number
  15508. if fMid <= 0 {
  15509. rtb = xMid
  15510. }
  15511. if math.Abs(fMid) < financialPrecision || math.Abs(dx) < financialPrecision {
  15512. break
  15513. }
  15514. }
  15515. return newNumberFormulaArg(xMid)
  15516. }
  15517. // ISPMT function calculates the interest paid during a specific period of a
  15518. // loan or investment. The syntax of the function is:
  15519. //
  15520. // ISPMT(rate,per,nper,pv)
  15521. func (fn *formulaFuncs) ISPMT(argsList *list.List) formulaArg {
  15522. if argsList.Len() != 4 {
  15523. return newErrorFormulaArg(formulaErrorVALUE, "ISPMT requires 4 arguments")
  15524. }
  15525. rate := argsList.Front().Value.(formulaArg).ToNumber()
  15526. if rate.Type != ArgNumber {
  15527. return rate
  15528. }
  15529. per := argsList.Front().Next().Value.(formulaArg).ToNumber()
  15530. if per.Type != ArgNumber {
  15531. return per
  15532. }
  15533. nper := argsList.Back().Prev().Value.(formulaArg).ToNumber()
  15534. if nper.Type != ArgNumber {
  15535. return nper
  15536. }
  15537. pv := argsList.Back().Value.(formulaArg).ToNumber()
  15538. if pv.Type != ArgNumber {
  15539. return pv
  15540. }
  15541. pr, payment, num := pv.Number, pv.Number/nper.Number, 0.0
  15542. for i := 0; i <= int(per.Number); i++ {
  15543. num = rate.Number * pr * -1
  15544. pr -= payment
  15545. if i == int(nper.Number) {
  15546. num = 0
  15547. }
  15548. }
  15549. return newNumberFormulaArg(num)
  15550. }
  15551. // MDURATION function calculates the Modified Macaulay Duration of a security
  15552. // that pays periodic interest, assuming a par value of $100. The syntax of
  15553. // the function is:
  15554. //
  15555. // MDURATION(settlement,maturity,coupon,yld,frequency,[basis])
  15556. func (fn *formulaFuncs) MDURATION(argsList *list.List) formulaArg {
  15557. args := fn.prepareDurationArgs("MDURATION", argsList)
  15558. if args.Type != ArgList {
  15559. return args
  15560. }
  15561. duration := fn.duration(args.List[0], args.List[1], args.List[2], args.List[3], args.List[4], args.List[5])
  15562. if duration.Type != ArgNumber {
  15563. return duration
  15564. }
  15565. return newNumberFormulaArg(duration.Number / (1 + args.List[3].Number/args.List[4].Number))
  15566. }
  15567. // MIRR function returns the Modified Internal Rate of Return for a supplied
  15568. // series of periodic cash flows (i.e. a set of values, which includes an
  15569. // initial investment value and a series of net income values). The syntax of
  15570. // the function is:
  15571. //
  15572. // MIRR(values,finance_rate,reinvest_rate)
  15573. func (fn *formulaFuncs) MIRR(argsList *list.List) formulaArg {
  15574. if argsList.Len() != 3 {
  15575. return newErrorFormulaArg(formulaErrorVALUE, "MIRR requires 3 arguments")
  15576. }
  15577. values := argsList.Front().Value.(formulaArg).ToList()
  15578. financeRate := argsList.Front().Next().Value.(formulaArg).ToNumber()
  15579. if financeRate.Type != ArgNumber {
  15580. return financeRate
  15581. }
  15582. reinvestRate := argsList.Back().Value.(formulaArg).ToNumber()
  15583. if reinvestRate.Type != ArgNumber {
  15584. return reinvestRate
  15585. }
  15586. n, fr, rr, npvPos, npvNeg := len(values), 1+financeRate.Number, 1+reinvestRate.Number, 0.0, 0.0
  15587. for i, v := range values {
  15588. val := v.ToNumber()
  15589. if val.Number >= 0 {
  15590. npvPos += val.Number / math.Pow(rr, float64(i))
  15591. continue
  15592. }
  15593. npvNeg += val.Number / math.Pow(fr, float64(i))
  15594. }
  15595. if npvNeg == 0 || npvPos == 0 || reinvestRate.Number <= -1 {
  15596. return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
  15597. }
  15598. return newNumberFormulaArg(math.Pow(-npvPos*math.Pow(rr, float64(n))/(npvNeg*rr), 1/(float64(n)-1)) - 1)
  15599. }
  15600. // NOMINAL function returns the nominal interest rate for a given effective
  15601. // interest rate and number of compounding periods per year. The syntax of
  15602. // the function is:
  15603. //
  15604. // NOMINAL(effect_rate,npery)
  15605. func (fn *formulaFuncs) NOMINAL(argsList *list.List) formulaArg {
  15606. if argsList.Len() != 2 {
  15607. return newErrorFormulaArg(formulaErrorVALUE, "NOMINAL requires 2 arguments")
  15608. }
  15609. rate := argsList.Front().Value.(formulaArg).ToNumber()
  15610. if rate.Type != ArgNumber {
  15611. return rate
  15612. }
  15613. npery := argsList.Back().Value.(formulaArg).ToNumber()
  15614. if npery.Type != ArgNumber {
  15615. return npery
  15616. }
  15617. if rate.Number <= 0 || npery.Number < 1 {
  15618. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  15619. }
  15620. return newNumberFormulaArg(npery.Number * (math.Pow(rate.Number+1, 1/npery.Number) - 1))
  15621. }
  15622. // NPER function calculates the number of periods required to pay off a loan,
  15623. // for a constant periodic payment and a constant interest rate. The syntax
  15624. // of the function is:
  15625. //
  15626. // NPER(rate,pmt,pv,[fv],[type])
  15627. func (fn *formulaFuncs) NPER(argsList *list.List) formulaArg {
  15628. if argsList.Len() < 3 {
  15629. return newErrorFormulaArg(formulaErrorVALUE, "NPER requires at least 3 arguments")
  15630. }
  15631. if argsList.Len() > 5 {
  15632. return newErrorFormulaArg(formulaErrorVALUE, "NPER allows at most 5 arguments")
  15633. }
  15634. rate := argsList.Front().Value.(formulaArg).ToNumber()
  15635. if rate.Type != ArgNumber {
  15636. return rate
  15637. }
  15638. pmt := argsList.Front().Next().Value.(formulaArg).ToNumber()
  15639. if pmt.Type != ArgNumber {
  15640. return pmt
  15641. }
  15642. pv := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  15643. if pv.Type != ArgNumber {
  15644. return pv
  15645. }
  15646. fv, typ := newNumberFormulaArg(0), newNumberFormulaArg(0)
  15647. if argsList.Len() >= 4 {
  15648. if fv = argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber(); fv.Type != ArgNumber {
  15649. return fv
  15650. }
  15651. }
  15652. if argsList.Len() == 5 {
  15653. if typ = argsList.Back().Value.(formulaArg).ToNumber(); typ.Type != ArgNumber {
  15654. return typ
  15655. }
  15656. }
  15657. if typ.Number != 0 && typ.Number != 1 {
  15658. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  15659. }
  15660. if pmt.Number == 0 {
  15661. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  15662. }
  15663. if rate.Number != 0 {
  15664. p := math.Log((pmt.Number*(1+rate.Number*typ.Number)/rate.Number-fv.Number)/(pv.Number+pmt.Number*(1+rate.Number*typ.Number)/rate.Number)) / math.Log(1+rate.Number)
  15665. return newNumberFormulaArg(p)
  15666. }
  15667. return newNumberFormulaArg((-pv.Number - fv.Number) / pmt.Number)
  15668. }
  15669. // NPV function calculates the Net Present Value of an investment, based on a
  15670. // supplied discount rate, and a series of future payments and income. The
  15671. // syntax of the function is:
  15672. //
  15673. // NPV(rate,value1,[value2],[value3],...)
  15674. func (fn *formulaFuncs) NPV(argsList *list.List) formulaArg {
  15675. if argsList.Len() < 2 {
  15676. return newErrorFormulaArg(formulaErrorVALUE, "NPV requires at least 2 arguments")
  15677. }
  15678. rate := argsList.Front().Value.(formulaArg).ToNumber()
  15679. if rate.Type != ArgNumber {
  15680. return rate
  15681. }
  15682. val, i := 0.0, 1
  15683. for arg := argsList.Front().Next(); arg != nil; arg = arg.Next() {
  15684. num := arg.Value.(formulaArg).ToNumber()
  15685. if num.Type != ArgNumber {
  15686. continue
  15687. }
  15688. val += num.Number / math.Pow(1+rate.Number, float64(i))
  15689. i++
  15690. }
  15691. return newNumberFormulaArg(val)
  15692. }
  15693. // aggrBetween is a part of implementation of the formula function ODDFPRICE.
  15694. func aggrBetween(startPeriod, endPeriod float64, initialValue []float64, f func(acc []float64, index float64) []float64) []float64 {
  15695. var s []float64
  15696. if startPeriod <= endPeriod {
  15697. for i := startPeriod; i <= endPeriod; i++ {
  15698. s = append(s, i)
  15699. }
  15700. } else {
  15701. for i := startPeriod; i >= endPeriod; i-- {
  15702. s = append(s, i)
  15703. }
  15704. }
  15705. return fold(f, initialValue, s)
  15706. }
  15707. // fold is a part of implementation of the formula function ODDFPRICE.
  15708. func fold(f func(acc []float64, index float64) []float64, state []float64, source []float64) []float64 {
  15709. length, value := len(source), state
  15710. for index := 0; length > index; index++ {
  15711. value = f(value, source[index])
  15712. }
  15713. return value
  15714. }
  15715. // changeMonth is a part of implementation of the formula function ODDFPRICE.
  15716. func changeMonth(date time.Time, numMonths float64, returnLastMonth bool) time.Time {
  15717. offsetDay := 0
  15718. if returnLastMonth && date.Day() == getDaysInMonth(date.Year(), int(date.Month())) {
  15719. offsetDay--
  15720. }
  15721. newDate := date.AddDate(0, int(numMonths), offsetDay)
  15722. if returnLastMonth {
  15723. lastDay := getDaysInMonth(newDate.Year(), int(newDate.Month()))
  15724. return timeFromExcelTime(daysBetween(excelMinTime1900.Unix(), makeDate(newDate.Year(), newDate.Month(), lastDay))+1, false)
  15725. }
  15726. return newDate
  15727. }
  15728. // datesAggregate is a part of implementation of the formula function
  15729. // ODDFPRICE.
  15730. func datesAggregate(startDate, endDate time.Time, numMonths float64, f func(pcd, ncd time.Time) float64, acc float64, returnLastMonth bool) (time.Time, time.Time, float64) {
  15731. frontDate, trailingDate := startDate, endDate
  15732. s1 := frontDate.After(endDate) || frontDate.Equal(endDate)
  15733. s2 := endDate.After(frontDate) || endDate.Equal(frontDate)
  15734. stop := s2
  15735. if numMonths > 0 {
  15736. stop = s1
  15737. }
  15738. for !stop {
  15739. trailingDate = frontDate
  15740. frontDate = changeMonth(frontDate, numMonths, returnLastMonth)
  15741. fn := f(frontDate, trailingDate)
  15742. acc += fn
  15743. s1 = frontDate.After(endDate) || frontDate.Equal(endDate)
  15744. s2 = endDate.After(frontDate) || endDate.Equal(frontDate)
  15745. stop = s2
  15746. if numMonths > 0 {
  15747. stop = s1
  15748. }
  15749. }
  15750. return frontDate, trailingDate, acc
  15751. }
  15752. // coupNumber is a part of implementation of the formula function ODDFPRICE.
  15753. func coupNumber(maturity, settlement, numMonths float64) float64 {
  15754. maturityTime, settlementTime := timeFromExcelTime(maturity, false), timeFromExcelTime(settlement, false)
  15755. my, mm, md := maturityTime.Year(), maturityTime.Month(), maturityTime.Day()
  15756. sy, sm, sd := settlementTime.Year(), settlementTime.Month(), settlementTime.Day()
  15757. couponsTemp, endOfMonthTemp := 0.0, getDaysInMonth(my, int(mm)) == md
  15758. endOfMonth := endOfMonthTemp
  15759. if !endOfMonthTemp && mm != 2 && md > 28 && md < getDaysInMonth(my, int(mm)) {
  15760. endOfMonth = getDaysInMonth(sy, int(sm)) == sd
  15761. }
  15762. startDate := changeMonth(settlementTime, 0, endOfMonth)
  15763. coupons := couponsTemp
  15764. if startDate.After(settlementTime) {
  15765. coupons++
  15766. }
  15767. date := changeMonth(startDate, numMonths, endOfMonth)
  15768. f := func(pcd, ncd time.Time) float64 {
  15769. return 1
  15770. }
  15771. _, _, result := datesAggregate(date, maturityTime, numMonths, f, coupons, endOfMonth)
  15772. return result
  15773. }
  15774. // prepareOddfpriceArgs checking and prepare arguments for the formula
  15775. // function ODDFPRICE.
  15776. func (fn *formulaFuncs) prepareOddfpriceArgs(argsList *list.List) formulaArg {
  15777. dateValues := fn.prepareDataValueArgs(4, argsList)
  15778. if dateValues.Type != ArgList {
  15779. return dateValues
  15780. }
  15781. settlement, maturity, issue, firstCoupon := dateValues.List[0], dateValues.List[1], dateValues.List[2], dateValues.List[3]
  15782. if issue.Number >= settlement.Number {
  15783. return newErrorFormulaArg(formulaErrorNUM, "ODDFPRICE requires settlement > issue")
  15784. }
  15785. if settlement.Number >= firstCoupon.Number {
  15786. return newErrorFormulaArg(formulaErrorNUM, "ODDFPRICE requires first_coupon > settlement")
  15787. }
  15788. if firstCoupon.Number >= maturity.Number {
  15789. return newErrorFormulaArg(formulaErrorNUM, "ODDFPRICE requires maturity > first_coupon")
  15790. }
  15791. rate := argsList.Front().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  15792. if rate.Type != ArgNumber {
  15793. return rate
  15794. }
  15795. if rate.Number < 0 {
  15796. return newErrorFormulaArg(formulaErrorNUM, "ODDFPRICE requires rate >= 0")
  15797. }
  15798. yld := argsList.Front().Next().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  15799. if yld.Type != ArgNumber {
  15800. return yld
  15801. }
  15802. if yld.Number < 0 {
  15803. return newErrorFormulaArg(formulaErrorNUM, "ODDFPRICE requires yld >= 0")
  15804. }
  15805. redemption := argsList.Front().Next().Next().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  15806. if redemption.Type != ArgNumber {
  15807. return redemption
  15808. }
  15809. if redemption.Number <= 0 {
  15810. return newErrorFormulaArg(formulaErrorNUM, "ODDFPRICE requires redemption > 0")
  15811. }
  15812. frequency := argsList.Front().Next().Next().Next().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  15813. if frequency.Type != ArgNumber {
  15814. return frequency
  15815. }
  15816. if !validateFrequency(frequency.Number) {
  15817. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  15818. }
  15819. basis := newNumberFormulaArg(0)
  15820. if argsList.Len() == 9 {
  15821. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  15822. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  15823. }
  15824. }
  15825. return newListFormulaArg([]formulaArg{settlement, maturity, issue, firstCoupon, rate, yld, redemption, frequency, basis})
  15826. }
  15827. // ODDFPRICE function calculates the price per $100 face value of a security
  15828. // with an odd (short or long) first period. The syntax of the function is:
  15829. //
  15830. // ODDFPRICE(settlement,maturity,issue,first_coupon,rate,yld,redemption,frequency,[basis])
  15831. func (fn *formulaFuncs) ODDFPRICE(argsList *list.List) formulaArg {
  15832. if argsList.Len() != 8 && argsList.Len() != 9 {
  15833. return newErrorFormulaArg(formulaErrorVALUE, "ODDFPRICE requires 8 or 9 arguments")
  15834. }
  15835. args := fn.prepareOddfpriceArgs(argsList)
  15836. if args.Type != ArgList {
  15837. return args
  15838. }
  15839. settlement, maturity, issue, firstCoupon, rate, yld, redemption, frequency, basisArg := args.List[0], args.List[1], args.List[2], args.List[3], args.List[4], args.List[5], args.List[6], args.List[7], args.List[8]
  15840. if basisArg.Number < 0 || basisArg.Number > 4 {
  15841. return newErrorFormulaArg(formulaErrorNUM, "invalid basis")
  15842. }
  15843. issueTime := timeFromExcelTime(issue.Number, false)
  15844. settlementTime := timeFromExcelTime(settlement.Number, false)
  15845. maturityTime := timeFromExcelTime(maturity.Number, false)
  15846. firstCouponTime := timeFromExcelTime(firstCoupon.Number, false)
  15847. basis := int(basisArg.Number)
  15848. monthDays := getDaysInMonth(maturityTime.Year(), int(maturityTime.Month()))
  15849. returnLastMonth := monthDays == maturityTime.Day()
  15850. numMonths := 12 / frequency.Number
  15851. numMonthsNeg := -numMonths
  15852. mat := changeMonth(maturityTime, numMonthsNeg, returnLastMonth)
  15853. pcd, _, _ := datesAggregate(mat, firstCouponTime, numMonthsNeg, func(d1, d2 time.Time) float64 {
  15854. return 0
  15855. }, 0, returnLastMonth)
  15856. if !pcd.Equal(firstCouponTime) {
  15857. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  15858. }
  15859. fnArgs := list.New().Init()
  15860. fnArgs.PushBack(settlement)
  15861. fnArgs.PushBack(maturity)
  15862. fnArgs.PushBack(frequency)
  15863. fnArgs.PushBack(basisArg)
  15864. e := fn.COUPDAYS(fnArgs)
  15865. n := fn.COUPNUM(fnArgs)
  15866. m := frequency.Number
  15867. dfc := coupdays(issueTime, firstCouponTime, basis)
  15868. if dfc < e.Number {
  15869. dsc := coupdays(settlementTime, firstCouponTime, basis)
  15870. a := coupdays(issueTime, settlementTime, basis)
  15871. x := yld.Number/m + 1
  15872. y := dsc / e.Number
  15873. p1 := x
  15874. p3 := math.Pow(p1, n.Number-1+y)
  15875. term1 := redemption.Number / p3
  15876. term2 := 100 * rate.Number / m * dfc / e.Number / math.Pow(p1, y)
  15877. f := func(acc []float64, index float64) []float64 {
  15878. return []float64{acc[0] + 100*rate.Number/m/math.Pow(p1, index-1+y)}
  15879. }
  15880. term3 := aggrBetween(2, math.Floor(n.Number), []float64{0}, f)
  15881. p2 := rate.Number / m
  15882. term4 := a / e.Number * p2 * 100
  15883. return newNumberFormulaArg(term1 + term2 + term3[0] - term4)
  15884. }
  15885. fnArgs.Init()
  15886. fnArgs.PushBack(issue)
  15887. fnArgs.PushBack(firstCoupon)
  15888. fnArgs.PushBack(frequency)
  15889. nc := fn.COUPNUM(fnArgs)
  15890. lastCoupon := firstCoupon.Number
  15891. aggrFunc := func(acc []float64, index float64) []float64 {
  15892. lastCouponTime := timeFromExcelTime(lastCoupon, false)
  15893. earlyCoupon := daysBetween(excelMinTime1900.Unix(), makeDate(lastCouponTime.Year(), time.Month(float64(lastCouponTime.Month())+numMonthsNeg), lastCouponTime.Day())) + 1
  15894. earlyCouponTime := timeFromExcelTime(earlyCoupon, false)
  15895. nl := e.Number
  15896. if basis == 1 {
  15897. nl = coupdays(earlyCouponTime, lastCouponTime, basis)
  15898. }
  15899. dci := coupdays(issueTime, lastCouponTime, basis)
  15900. if index > 1 {
  15901. dci = nl
  15902. }
  15903. startDate := earlyCoupon
  15904. if issue.Number > earlyCoupon {
  15905. startDate = issue.Number
  15906. }
  15907. endDate := lastCoupon
  15908. if settlement.Number < lastCoupon {
  15909. endDate = settlement.Number
  15910. }
  15911. startDateTime := timeFromExcelTime(startDate, false)
  15912. endDateTime := timeFromExcelTime(endDate, false)
  15913. a := coupdays(startDateTime, endDateTime, basis)
  15914. lastCoupon = earlyCoupon
  15915. dcnl := acc[0]
  15916. anl := acc[1]
  15917. return []float64{dcnl + dci/nl, anl + a/nl}
  15918. }
  15919. ag := aggrBetween(math.Floor(nc.Number), 1, []float64{0, 0}, aggrFunc)
  15920. dcnl, anl := ag[0], ag[1]
  15921. dsc := 0.0
  15922. fnArgs.Init()
  15923. fnArgs.PushBack(settlement)
  15924. fnArgs.PushBack(firstCoupon)
  15925. fnArgs.PushBack(frequency)
  15926. if basis == 2 || basis == 3 {
  15927. d := timeFromExcelTime(fn.COUPNCD(fnArgs).Number, false)
  15928. dsc = coupdays(settlementTime, d, basis)
  15929. } else {
  15930. d := timeFromExcelTime(fn.COUPPCD(fnArgs).Number, false)
  15931. a := coupdays(d, settlementTime, basis)
  15932. dsc = e.Number - a
  15933. }
  15934. nq := coupNumber(firstCoupon.Number, settlement.Number, numMonths)
  15935. fnArgs.Init()
  15936. fnArgs.PushBack(firstCoupon)
  15937. fnArgs.PushBack(maturity)
  15938. fnArgs.PushBack(frequency)
  15939. fnArgs.PushBack(basisArg)
  15940. n = fn.COUPNUM(fnArgs)
  15941. x := yld.Number/m + 1
  15942. y := dsc / e.Number
  15943. p1 := x
  15944. p3 := math.Pow(p1, y+nq+n.Number)
  15945. term1 := redemption.Number / p3
  15946. term2 := 100 * rate.Number / m * dcnl / math.Pow(p1, nq+y)
  15947. f := func(acc []float64, index float64) []float64 {
  15948. return []float64{acc[0] + 100*rate.Number/m/math.Pow(p1, index+nq+y)}
  15949. }
  15950. term3 := aggrBetween(1, math.Floor(n.Number), []float64{0}, f)
  15951. term4 := 100 * rate.Number / m * anl
  15952. return newNumberFormulaArg(term1 + term2 + term3[0] - term4)
  15953. }
  15954. // PDURATION function calculates the number of periods required for an
  15955. // investment to reach a specified future value. The syntax of the function
  15956. // is:
  15957. //
  15958. // PDURATION(rate,pv,fv)
  15959. func (fn *formulaFuncs) PDURATION(argsList *list.List) formulaArg {
  15960. if argsList.Len() != 3 {
  15961. return newErrorFormulaArg(formulaErrorVALUE, "PDURATION requires 3 arguments")
  15962. }
  15963. rate := argsList.Front().Value.(formulaArg).ToNumber()
  15964. if rate.Type != ArgNumber {
  15965. return rate
  15966. }
  15967. pv := argsList.Front().Next().Value.(formulaArg).ToNumber()
  15968. if pv.Type != ArgNumber {
  15969. return pv
  15970. }
  15971. fv := argsList.Back().Value.(formulaArg).ToNumber()
  15972. if fv.Type != ArgNumber {
  15973. return fv
  15974. }
  15975. if rate.Number <= 0 || pv.Number <= 0 || fv.Number <= 0 {
  15976. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  15977. }
  15978. return newNumberFormulaArg((math.Log(fv.Number) - math.Log(pv.Number)) / math.Log(1+rate.Number))
  15979. }
  15980. // PMT function calculates the constant periodic payment required to pay off
  15981. // (or partially pay off) a loan or investment, with a constant interest
  15982. // rate, over a specified period. The syntax of the function is:
  15983. //
  15984. // PMT(rate,nper,pv,[fv],[type])
  15985. func (fn *formulaFuncs) PMT(argsList *list.List) formulaArg {
  15986. if argsList.Len() < 3 {
  15987. return newErrorFormulaArg(formulaErrorVALUE, "PMT requires at least 3 arguments")
  15988. }
  15989. if argsList.Len() > 5 {
  15990. return newErrorFormulaArg(formulaErrorVALUE, "PMT allows at most 5 arguments")
  15991. }
  15992. rate := argsList.Front().Value.(formulaArg).ToNumber()
  15993. if rate.Type != ArgNumber {
  15994. return rate
  15995. }
  15996. nper := argsList.Front().Next().Value.(formulaArg).ToNumber()
  15997. if nper.Type != ArgNumber {
  15998. return nper
  15999. }
  16000. pv := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  16001. if pv.Type != ArgNumber {
  16002. return pv
  16003. }
  16004. fv, typ := newNumberFormulaArg(0), newNumberFormulaArg(0)
  16005. if argsList.Len() >= 4 {
  16006. if fv = argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber(); fv.Type != ArgNumber {
  16007. return fv
  16008. }
  16009. }
  16010. if argsList.Len() == 5 {
  16011. if typ = argsList.Back().Value.(formulaArg).ToNumber(); typ.Type != ArgNumber {
  16012. return typ
  16013. }
  16014. }
  16015. if typ.Number != 0 && typ.Number != 1 {
  16016. return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
  16017. }
  16018. if rate.Number != 0 {
  16019. p := (-fv.Number - pv.Number*math.Pow(1+rate.Number, nper.Number)) / (1 + rate.Number*typ.Number) / ((math.Pow(1+rate.Number, nper.Number) - 1) / rate.Number)
  16020. return newNumberFormulaArg(p)
  16021. }
  16022. return newNumberFormulaArg((-pv.Number - fv.Number) / nper.Number)
  16023. }
  16024. // PPMT function calculates the payment on the principal, during a specific
  16025. // period of a loan or investment that is paid in constant periodic payments,
  16026. // with a constant interest rate. The syntax of the function is:
  16027. //
  16028. // PPMT(rate,per,nper,pv,[fv],[type])
  16029. func (fn *formulaFuncs) PPMT(argsList *list.List) formulaArg {
  16030. return fn.ipmt("PPMT", argsList)
  16031. }
  16032. // price is an implementation of the formula function PRICE.
  16033. func (fn *formulaFuncs) price(settlement, maturity, rate, yld, redemption, frequency, basis formulaArg) formulaArg {
  16034. if basis.Number < 0 || basis.Number > 4 {
  16035. return newErrorFormulaArg(formulaErrorNUM, "invalid basis")
  16036. }
  16037. argsList := list.New().Init()
  16038. argsList.PushBack(settlement)
  16039. argsList.PushBack(maturity)
  16040. argsList.PushBack(frequency)
  16041. argsList.PushBack(basis)
  16042. e := fn.COUPDAYS(argsList)
  16043. dsc := fn.COUPDAYSNC(argsList).Number / e.Number
  16044. n := fn.COUPNUM(argsList)
  16045. a := fn.COUPDAYBS(argsList)
  16046. ret := 0.0
  16047. if n.Number > 1 {
  16048. ret = redemption.Number / math.Pow(1+yld.Number/frequency.Number, n.Number-1+dsc)
  16049. ret -= 100 * rate.Number / frequency.Number * a.Number / e.Number
  16050. t1 := 100 * rate.Number / frequency.Number
  16051. t2 := 1 + yld.Number/frequency.Number
  16052. for k := 0.0; k < n.Number; k++ {
  16053. ret += t1 / math.Pow(t2, k+dsc)
  16054. }
  16055. } else {
  16056. dsc = e.Number - a.Number
  16057. t1 := 100*(rate.Number/frequency.Number) + redemption.Number
  16058. t2 := (yld.Number/frequency.Number)*(dsc/e.Number) + 1
  16059. t3 := 100 * (rate.Number / frequency.Number) * (a.Number / e.Number)
  16060. ret = t1/t2 - t3
  16061. }
  16062. return newNumberFormulaArg(ret)
  16063. }
  16064. // PRICE function calculates the price, per $100 face value of a security that
  16065. // pays periodic interest. The syntax of the function is:
  16066. //
  16067. // PRICE(settlement,maturity,rate,yld,redemption,frequency,[basis])
  16068. func (fn *formulaFuncs) PRICE(argsList *list.List) formulaArg {
  16069. if argsList.Len() != 6 && argsList.Len() != 7 {
  16070. return newErrorFormulaArg(formulaErrorVALUE, "PRICE requires 6 or 7 arguments")
  16071. }
  16072. args := fn.prepareDataValueArgs(2, argsList)
  16073. if args.Type != ArgList {
  16074. return args
  16075. }
  16076. settlement, maturity := args.List[0], args.List[1]
  16077. rate := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  16078. if rate.Type != ArgNumber {
  16079. return rate
  16080. }
  16081. if rate.Number < 0 {
  16082. return newErrorFormulaArg(formulaErrorNUM, "PRICE requires rate >= 0")
  16083. }
  16084. yld := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  16085. if yld.Type != ArgNumber {
  16086. return yld
  16087. }
  16088. if yld.Number < 0 {
  16089. return newErrorFormulaArg(formulaErrorNUM, "PRICE requires yld >= 0")
  16090. }
  16091. redemption := argsList.Front().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  16092. if redemption.Type != ArgNumber {
  16093. return redemption
  16094. }
  16095. if redemption.Number <= 0 {
  16096. return newErrorFormulaArg(formulaErrorNUM, "PRICE requires redemption > 0")
  16097. }
  16098. frequency := argsList.Front().Next().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  16099. if frequency.Type != ArgNumber {
  16100. return frequency
  16101. }
  16102. if !validateFrequency(frequency.Number) {
  16103. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16104. }
  16105. basis := newNumberFormulaArg(0)
  16106. if argsList.Len() == 7 {
  16107. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  16108. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16109. }
  16110. }
  16111. return fn.price(settlement, maturity, rate, yld, redemption, frequency, basis)
  16112. }
  16113. // PRICEDISC function calculates the price, per $100 face value of a
  16114. // discounted security. The syntax of the function is:
  16115. //
  16116. // PRICEDISC(settlement,maturity,discount,redemption,[basis])
  16117. func (fn *formulaFuncs) PRICEDISC(argsList *list.List) formulaArg {
  16118. if argsList.Len() != 4 && argsList.Len() != 5 {
  16119. return newErrorFormulaArg(formulaErrorVALUE, "PRICEDISC requires 4 or 5 arguments")
  16120. }
  16121. args := fn.prepareDataValueArgs(2, argsList)
  16122. if args.Type != ArgList {
  16123. return args
  16124. }
  16125. settlement, maturity := args.List[0], args.List[1]
  16126. if maturity.Number <= settlement.Number {
  16127. return newErrorFormulaArg(formulaErrorNUM, "PRICEDISC requires maturity > settlement")
  16128. }
  16129. discount := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  16130. if discount.Type != ArgNumber {
  16131. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  16132. }
  16133. if discount.Number <= 0 {
  16134. return newErrorFormulaArg(formulaErrorNUM, "PRICEDISC requires discount > 0")
  16135. }
  16136. redemption := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  16137. if redemption.Type != ArgNumber {
  16138. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  16139. }
  16140. if redemption.Number <= 0 {
  16141. return newErrorFormulaArg(formulaErrorNUM, "PRICEDISC requires redemption > 0")
  16142. }
  16143. basis := newNumberFormulaArg(0)
  16144. if argsList.Len() == 5 {
  16145. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  16146. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16147. }
  16148. }
  16149. frac := yearFrac(settlement.Number, maturity.Number, int(basis.Number))
  16150. if frac.Type != ArgNumber {
  16151. return frac
  16152. }
  16153. return newNumberFormulaArg(redemption.Number * (1 - discount.Number*frac.Number))
  16154. }
  16155. // PRICEMAT function calculates the price, per $100 face value of a security
  16156. // that pays interest at maturity. The syntax of the function is:
  16157. //
  16158. // PRICEMAT(settlement,maturity,issue,rate,yld,[basis])
  16159. func (fn *formulaFuncs) PRICEMAT(argsList *list.List) formulaArg {
  16160. if argsList.Len() != 5 && argsList.Len() != 6 {
  16161. return newErrorFormulaArg(formulaErrorVALUE, "PRICEMAT requires 5 or 6 arguments")
  16162. }
  16163. args := fn.prepareDataValueArgs(3, argsList)
  16164. if args.Type != ArgList {
  16165. return args
  16166. }
  16167. settlement, maturity, issue := args.List[0], args.List[1], args.List[2]
  16168. if settlement.Number >= maturity.Number {
  16169. return newErrorFormulaArg(formulaErrorNUM, "PRICEMAT requires maturity > settlement")
  16170. }
  16171. if issue.Number >= settlement.Number {
  16172. return newErrorFormulaArg(formulaErrorNUM, "PRICEMAT requires settlement > issue")
  16173. }
  16174. rate := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  16175. if rate.Type != ArgNumber {
  16176. return rate
  16177. }
  16178. if rate.Number < 0 {
  16179. return newErrorFormulaArg(formulaErrorNUM, "PRICEMAT requires rate >= 0")
  16180. }
  16181. yld := argsList.Front().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  16182. if yld.Type != ArgNumber {
  16183. return yld
  16184. }
  16185. if yld.Number < 0 {
  16186. return newErrorFormulaArg(formulaErrorNUM, "PRICEMAT requires yld >= 0")
  16187. }
  16188. basis := newNumberFormulaArg(0)
  16189. if argsList.Len() == 6 {
  16190. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  16191. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16192. }
  16193. }
  16194. dsm := yearFrac(settlement.Number, maturity.Number, int(basis.Number))
  16195. if dsm.Type != ArgNumber {
  16196. return dsm
  16197. }
  16198. dis := yearFrac(issue.Number, settlement.Number, int(basis.Number))
  16199. dim := yearFrac(issue.Number, maturity.Number, int(basis.Number))
  16200. return newNumberFormulaArg(((1+dim.Number*rate.Number)/(1+dsm.Number*yld.Number) - dis.Number*rate.Number) * 100)
  16201. }
  16202. // PV function calculates the Present Value of an investment, based on a
  16203. // series of future payments. The syntax of the function is:
  16204. //
  16205. // PV(rate,nper,pmt,[fv],[type])
  16206. func (fn *formulaFuncs) PV(argsList *list.List) formulaArg {
  16207. if argsList.Len() < 3 {
  16208. return newErrorFormulaArg(formulaErrorVALUE, "PV requires at least 3 arguments")
  16209. }
  16210. if argsList.Len() > 5 {
  16211. return newErrorFormulaArg(formulaErrorVALUE, "PV allows at most 5 arguments")
  16212. }
  16213. rate := argsList.Front().Value.(formulaArg).ToNumber()
  16214. if rate.Type != ArgNumber {
  16215. return rate
  16216. }
  16217. nper := argsList.Front().Next().Value.(formulaArg).ToNumber()
  16218. if nper.Type != ArgNumber {
  16219. return nper
  16220. }
  16221. pmt := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  16222. if pmt.Type != ArgNumber {
  16223. return pmt
  16224. }
  16225. fv := newNumberFormulaArg(0)
  16226. if argsList.Len() >= 4 {
  16227. if fv = argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber(); fv.Type != ArgNumber {
  16228. return fv
  16229. }
  16230. }
  16231. t := newNumberFormulaArg(0)
  16232. if argsList.Len() == 5 {
  16233. if t = argsList.Back().Value.(formulaArg).ToNumber(); t.Type != ArgNumber {
  16234. return t
  16235. }
  16236. if t.Number != 0 {
  16237. t.Number = 1
  16238. }
  16239. }
  16240. if rate.Number == 0 {
  16241. return newNumberFormulaArg(-pmt.Number*nper.Number - fv.Number)
  16242. }
  16243. return newNumberFormulaArg((((1-math.Pow(1+rate.Number, nper.Number))/rate.Number)*pmt.Number*(1+rate.Number*t.Number) - fv.Number) / math.Pow(1+rate.Number, nper.Number))
  16244. }
  16245. // rate is an implementation of the formula function RATE.
  16246. func (fn *formulaFuncs) rate(nper, pmt, pv, fv, t, guess formulaArg) formulaArg {
  16247. maxIter, iter, isClose, epsMax, rate := 100, 0, false, 1e-6, guess.Number
  16248. for iter < maxIter && !isClose {
  16249. t1 := math.Pow(rate+1, nper.Number)
  16250. t2 := math.Pow(rate+1, nper.Number-1)
  16251. rt := rate*t.Number + 1
  16252. p0 := pmt.Number * (t1 - 1)
  16253. f1 := fv.Number + t1*pv.Number + p0*rt/rate
  16254. n1 := nper.Number * t2 * pv.Number
  16255. n2 := p0 * rt / math.Pow(rate, 2)
  16256. f2 := math.Nextafter(n1, n1) - math.Nextafter(n2, n2)
  16257. f3 := (nper.Number*pmt.Number*t2*rt + p0*t.Number) / rate
  16258. delta := f1 / (f2 + f3)
  16259. if math.Abs(delta) < epsMax {
  16260. isClose = true
  16261. }
  16262. iter++
  16263. rate -= delta
  16264. }
  16265. return newNumberFormulaArg(rate)
  16266. }
  16267. // RATE function calculates the interest rate required to pay off a specified
  16268. // amount of a loan, or to reach a target amount on an investment, over a
  16269. // given period. The syntax of the function is:
  16270. //
  16271. // RATE(nper,pmt,pv,[fv],[type],[guess])
  16272. func (fn *formulaFuncs) RATE(argsList *list.List) formulaArg {
  16273. if argsList.Len() < 3 {
  16274. return newErrorFormulaArg(formulaErrorVALUE, "RATE requires at least 3 arguments")
  16275. }
  16276. if argsList.Len() > 6 {
  16277. return newErrorFormulaArg(formulaErrorVALUE, "RATE allows at most 6 arguments")
  16278. }
  16279. nper := argsList.Front().Value.(formulaArg).ToNumber()
  16280. if nper.Type != ArgNumber {
  16281. return nper
  16282. }
  16283. pmt := argsList.Front().Next().Value.(formulaArg).ToNumber()
  16284. if pmt.Type != ArgNumber {
  16285. return pmt
  16286. }
  16287. pv := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  16288. if pv.Type != ArgNumber {
  16289. return pv
  16290. }
  16291. fv := newNumberFormulaArg(0)
  16292. if argsList.Len() >= 4 {
  16293. if fv = argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber(); fv.Type != ArgNumber {
  16294. return fv
  16295. }
  16296. }
  16297. t := newNumberFormulaArg(0)
  16298. if argsList.Len() >= 5 {
  16299. if t = argsList.Front().Next().Next().Next().Next().Value.(formulaArg).ToNumber(); t.Type != ArgNumber {
  16300. return t
  16301. }
  16302. if t.Number != 0 {
  16303. t.Number = 1
  16304. }
  16305. }
  16306. guess := newNumberFormulaArg(0.1)
  16307. if argsList.Len() == 6 {
  16308. if guess = argsList.Back().Value.(formulaArg).ToNumber(); guess.Type != ArgNumber {
  16309. return guess
  16310. }
  16311. }
  16312. return fn.rate(nper, pmt, pv, fv, t, guess)
  16313. }
  16314. // RECEIVED function calculates the amount received at maturity for a fully
  16315. // invested security. The syntax of the function is:
  16316. //
  16317. // RECEIVED(settlement,maturity,investment,discount,[basis])
  16318. func (fn *formulaFuncs) RECEIVED(argsList *list.List) formulaArg {
  16319. if argsList.Len() < 4 {
  16320. return newErrorFormulaArg(formulaErrorVALUE, "RECEIVED requires at least 4 arguments")
  16321. }
  16322. if argsList.Len() > 5 {
  16323. return newErrorFormulaArg(formulaErrorVALUE, "RECEIVED allows at most 5 arguments")
  16324. }
  16325. args := fn.prepareDataValueArgs(2, argsList)
  16326. if args.Type != ArgList {
  16327. return args
  16328. }
  16329. settlement, maturity := args.List[0], args.List[1]
  16330. investment := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  16331. if investment.Type != ArgNumber {
  16332. return investment
  16333. }
  16334. discount := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  16335. if discount.Type != ArgNumber {
  16336. return discount
  16337. }
  16338. if discount.Number <= 0 {
  16339. return newErrorFormulaArg(formulaErrorNUM, "RECEIVED requires discount > 0")
  16340. }
  16341. basis := newNumberFormulaArg(0)
  16342. if argsList.Len() == 5 {
  16343. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  16344. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16345. }
  16346. }
  16347. frac := yearFrac(settlement.Number, maturity.Number, int(basis.Number))
  16348. if frac.Type != ArgNumber {
  16349. return frac
  16350. }
  16351. return newNumberFormulaArg(investment.Number / (1 - discount.Number*frac.Number))
  16352. }
  16353. // RRI function calculates the equivalent interest rate for an investment with
  16354. // specified present value, future value and duration. The syntax of the
  16355. // function is:
  16356. //
  16357. // RRI(nper,pv,fv)
  16358. func (fn *formulaFuncs) RRI(argsList *list.List) formulaArg {
  16359. if argsList.Len() != 3 {
  16360. return newErrorFormulaArg(formulaErrorVALUE, "RRI requires 3 arguments")
  16361. }
  16362. nper := argsList.Front().Value.(formulaArg).ToNumber()
  16363. pv := argsList.Front().Next().Value.(formulaArg).ToNumber()
  16364. fv := argsList.Back().Value.(formulaArg).ToNumber()
  16365. if nper.Type != ArgNumber || pv.Type != ArgNumber || fv.Type != ArgNumber {
  16366. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16367. }
  16368. if nper.Number <= 0 {
  16369. return newErrorFormulaArg(formulaErrorNUM, "RRI requires nper argument to be > 0")
  16370. }
  16371. if pv.Number <= 0 {
  16372. return newErrorFormulaArg(formulaErrorNUM, "RRI requires pv argument to be > 0")
  16373. }
  16374. if fv.Number < 0 {
  16375. return newErrorFormulaArg(formulaErrorNUM, "RRI requires fv argument to be >= 0")
  16376. }
  16377. return newNumberFormulaArg(math.Pow(fv.Number/pv.Number, 1/nper.Number) - 1)
  16378. }
  16379. // SLN function calculates the straight line depreciation of an asset for one
  16380. // period. The syntax of the function is:
  16381. //
  16382. // SLN(cost,salvage,life)
  16383. func (fn *formulaFuncs) SLN(argsList *list.List) formulaArg {
  16384. if argsList.Len() != 3 {
  16385. return newErrorFormulaArg(formulaErrorVALUE, "SLN requires 3 arguments")
  16386. }
  16387. cost := argsList.Front().Value.(formulaArg).ToNumber()
  16388. salvage := argsList.Front().Next().Value.(formulaArg).ToNumber()
  16389. life := argsList.Back().Value.(formulaArg).ToNumber()
  16390. if cost.Type != ArgNumber || salvage.Type != ArgNumber || life.Type != ArgNumber {
  16391. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16392. }
  16393. if life.Number == 0 {
  16394. return newErrorFormulaArg(formulaErrorNUM, "SLN requires life argument to be > 0")
  16395. }
  16396. return newNumberFormulaArg((cost.Number - salvage.Number) / life.Number)
  16397. }
  16398. // SYD function calculates the sum-of-years' digits depreciation for a
  16399. // specified period in the lifetime of an asset. The syntax of the function
  16400. // is:
  16401. //
  16402. // SYD(cost,salvage,life,per)
  16403. func (fn *formulaFuncs) SYD(argsList *list.List) formulaArg {
  16404. if argsList.Len() != 4 {
  16405. return newErrorFormulaArg(formulaErrorVALUE, "SYD requires 4 arguments")
  16406. }
  16407. cost := argsList.Front().Value.(formulaArg).ToNumber()
  16408. salvage := argsList.Front().Next().Value.(formulaArg).ToNumber()
  16409. life := argsList.Back().Prev().Value.(formulaArg).ToNumber()
  16410. per := argsList.Back().Value.(formulaArg).ToNumber()
  16411. if cost.Type != ArgNumber || salvage.Type != ArgNumber || life.Type != ArgNumber || per.Type != ArgNumber {
  16412. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16413. }
  16414. if life.Number <= 0 {
  16415. return newErrorFormulaArg(formulaErrorNUM, "SYD requires life argument to be > 0")
  16416. }
  16417. if per.Number <= 0 {
  16418. return newErrorFormulaArg(formulaErrorNUM, "SYD requires per argument to be > 0")
  16419. }
  16420. if per.Number > life.Number {
  16421. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16422. }
  16423. return newNumberFormulaArg(((cost.Number - salvage.Number) * (life.Number - per.Number + 1) * 2) / (life.Number * (life.Number + 1)))
  16424. }
  16425. // TBILLEQ function calculates the bond-equivalent yield for a Treasury Bill.
  16426. // The syntax of the function is:
  16427. //
  16428. // TBILLEQ(settlement,maturity,discount)
  16429. func (fn *formulaFuncs) TBILLEQ(argsList *list.List) formulaArg {
  16430. if argsList.Len() != 3 {
  16431. return newErrorFormulaArg(formulaErrorVALUE, "TBILLEQ requires 3 arguments")
  16432. }
  16433. args := fn.prepareDataValueArgs(2, argsList)
  16434. if args.Type != ArgList {
  16435. return args
  16436. }
  16437. settlement, maturity := args.List[0], args.List[1]
  16438. dsm := maturity.Number - settlement.Number
  16439. if dsm > 365 || maturity.Number <= settlement.Number {
  16440. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16441. }
  16442. discount := argsList.Back().Value.(formulaArg).ToNumber()
  16443. if discount.Type != ArgNumber {
  16444. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  16445. }
  16446. if discount.Number <= 0 {
  16447. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16448. }
  16449. return newNumberFormulaArg((365 * discount.Number) / (360 - discount.Number*dsm))
  16450. }
  16451. // TBILLPRICE function returns the price, per $100 face value, of a Treasury
  16452. // Bill. The syntax of the function is:
  16453. //
  16454. // TBILLPRICE(settlement,maturity,discount)
  16455. func (fn *formulaFuncs) TBILLPRICE(argsList *list.List) formulaArg {
  16456. if argsList.Len() != 3 {
  16457. return newErrorFormulaArg(formulaErrorVALUE, "TBILLPRICE requires 3 arguments")
  16458. }
  16459. args := fn.prepareDataValueArgs(2, argsList)
  16460. if args.Type != ArgList {
  16461. return args
  16462. }
  16463. settlement, maturity := args.List[0], args.List[1]
  16464. dsm := maturity.Number - settlement.Number
  16465. if dsm > 365 || maturity.Number <= settlement.Number {
  16466. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16467. }
  16468. discount := argsList.Back().Value.(formulaArg).ToNumber()
  16469. if discount.Type != ArgNumber {
  16470. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  16471. }
  16472. if discount.Number <= 0 {
  16473. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16474. }
  16475. return newNumberFormulaArg(100 * (1 - discount.Number*dsm/360))
  16476. }
  16477. // TBILLYIELD function calculates the yield of a Treasury Bill. The syntax of
  16478. // the function is:
  16479. //
  16480. // TBILLYIELD(settlement,maturity,pr)
  16481. func (fn *formulaFuncs) TBILLYIELD(argsList *list.List) formulaArg {
  16482. if argsList.Len() != 3 {
  16483. return newErrorFormulaArg(formulaErrorVALUE, "TBILLYIELD requires 3 arguments")
  16484. }
  16485. args := fn.prepareDataValueArgs(2, argsList)
  16486. if args.Type != ArgList {
  16487. return args
  16488. }
  16489. settlement, maturity := args.List[0], args.List[1]
  16490. dsm := maturity.Number - settlement.Number
  16491. if dsm > 365 || maturity.Number <= settlement.Number {
  16492. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16493. }
  16494. pr := argsList.Back().Value.(formulaArg).ToNumber()
  16495. if pr.Type != ArgNumber {
  16496. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  16497. }
  16498. if pr.Number <= 0 {
  16499. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16500. }
  16501. return newNumberFormulaArg(((100 - pr.Number) / pr.Number) * (360 / dsm))
  16502. }
  16503. // prepareVdbArgs checking and prepare arguments for the formula function
  16504. // VDB.
  16505. func (fn *formulaFuncs) prepareVdbArgs(argsList *list.List) formulaArg {
  16506. cost := argsList.Front().Value.(formulaArg).ToNumber()
  16507. if cost.Type != ArgNumber {
  16508. return cost
  16509. }
  16510. if cost.Number < 0 {
  16511. return newErrorFormulaArg(formulaErrorNUM, "VDB requires cost >= 0")
  16512. }
  16513. salvage := argsList.Front().Next().Value.(formulaArg).ToNumber()
  16514. if salvage.Type != ArgNumber {
  16515. return salvage
  16516. }
  16517. if salvage.Number < 0 {
  16518. return newErrorFormulaArg(formulaErrorNUM, "VDB requires salvage >= 0")
  16519. }
  16520. life := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  16521. if life.Type != ArgNumber {
  16522. return life
  16523. }
  16524. if life.Number <= 0 {
  16525. return newErrorFormulaArg(formulaErrorNUM, "VDB requires life > 0")
  16526. }
  16527. startPeriod := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  16528. if startPeriod.Type != ArgNumber {
  16529. return startPeriod
  16530. }
  16531. if startPeriod.Number < 0 {
  16532. return newErrorFormulaArg(formulaErrorNUM, "VDB requires start_period > 0")
  16533. }
  16534. endPeriod := argsList.Front().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  16535. if endPeriod.Type != ArgNumber {
  16536. return endPeriod
  16537. }
  16538. if startPeriod.Number > endPeriod.Number {
  16539. return newErrorFormulaArg(formulaErrorNUM, "VDB requires start_period <= end_period")
  16540. }
  16541. if endPeriod.Number > life.Number {
  16542. return newErrorFormulaArg(formulaErrorNUM, "VDB requires end_period <= life")
  16543. }
  16544. factor := newNumberFormulaArg(2)
  16545. if argsList.Len() > 5 {
  16546. if factor = argsList.Front().Next().Next().Next().Next().Next().Value.(formulaArg).ToNumber(); factor.Type != ArgNumber {
  16547. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16548. }
  16549. if factor.Number < 0 {
  16550. return newErrorFormulaArg(formulaErrorVALUE, "VDB requires factor >= 0")
  16551. }
  16552. }
  16553. return newListFormulaArg([]formulaArg{cost, salvage, life, startPeriod, endPeriod, factor})
  16554. }
  16555. // vdb is a part of implementation of the formula function VDB.
  16556. func (fn *formulaFuncs) vdb(cost, salvage, life, life1, period, factor formulaArg) formulaArg {
  16557. var ddb, vdb, sln, term float64
  16558. endInt, cs, nowSln := math.Ceil(period.Number), cost.Number-salvage.Number, false
  16559. ddbArgs := list.New()
  16560. for i := 1.0; i <= endInt; i++ {
  16561. if !nowSln {
  16562. ddbArgs.Init()
  16563. ddbArgs.PushBack(cost)
  16564. ddbArgs.PushBack(salvage)
  16565. ddbArgs.PushBack(life)
  16566. ddbArgs.PushBack(newNumberFormulaArg(i))
  16567. ddbArgs.PushBack(factor)
  16568. ddb = fn.DDB(ddbArgs).Number
  16569. sln = cs / (life1.Number - i + 1)
  16570. if sln > ddb {
  16571. term = sln
  16572. nowSln = true
  16573. } else {
  16574. term = ddb
  16575. cs -= ddb
  16576. }
  16577. } else {
  16578. term = sln
  16579. }
  16580. if i == endInt {
  16581. term *= period.Number + 1 - endInt
  16582. }
  16583. vdb += term
  16584. }
  16585. return newNumberFormulaArg(vdb)
  16586. }
  16587. // VDB function calculates the depreciation of an asset, using the Double
  16588. // Declining Balance Method, or another specified depreciation rate, for a
  16589. // specified period (including partial periods). The syntax of the function
  16590. // is:
  16591. //
  16592. // VDB(cost,salvage,life,start_period,end_period,[factor],[no_switch])
  16593. func (fn *formulaFuncs) VDB(argsList *list.List) formulaArg {
  16594. if argsList.Len() < 5 || argsList.Len() > 7 {
  16595. return newErrorFormulaArg(formulaErrorVALUE, "VDB requires 5 or 7 arguments")
  16596. }
  16597. args := fn.prepareVdbArgs(argsList)
  16598. if args.Type != ArgList {
  16599. return args
  16600. }
  16601. cost, salvage, life, startPeriod, endPeriod, factor := args.List[0], args.List[1], args.List[2], args.List[3], args.List[4], args.List[5]
  16602. noSwitch := newBoolFormulaArg(false)
  16603. if argsList.Len() > 6 {
  16604. if noSwitch = argsList.Back().Value.(formulaArg).ToBool(); noSwitch.Type != ArgNumber {
  16605. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16606. }
  16607. }
  16608. startInt, endInt, vdb, ddbArgs := math.Floor(startPeriod.Number), math.Ceil(endPeriod.Number), newNumberFormulaArg(0), list.New()
  16609. if noSwitch.Number == 1 {
  16610. for i := startInt + 1; i <= endInt; i++ {
  16611. ddbArgs.Init()
  16612. ddbArgs.PushBack(cost)
  16613. ddbArgs.PushBack(salvage)
  16614. ddbArgs.PushBack(life)
  16615. ddbArgs.PushBack(newNumberFormulaArg(i))
  16616. ddbArgs.PushBack(factor)
  16617. term := fn.DDB(ddbArgs)
  16618. if i == startInt+1 {
  16619. term.Number *= math.Min(endPeriod.Number, startInt+1) - startPeriod.Number
  16620. } else if i == endInt {
  16621. term.Number *= endPeriod.Number + 1 - endInt
  16622. }
  16623. vdb.Number += term.Number
  16624. }
  16625. return vdb
  16626. }
  16627. life1, part := life, 0.0
  16628. if startPeriod.Number != math.Floor(startPeriod.Number) && factor.Number > 1.0 && startPeriod.Number >= life.Number/2.0 {
  16629. part = startPeriod.Number - life.Number/2.0
  16630. startPeriod.Number = life.Number / 2.0
  16631. endPeriod.Number -= part
  16632. }
  16633. cost.Number -= fn.vdb(cost, salvage, life, life1, startPeriod, factor).Number
  16634. return fn.vdb(cost, salvage, life, newNumberFormulaArg(life.Number-startPeriod.Number), newNumberFormulaArg(endPeriod.Number-startPeriod.Number), factor)
  16635. }
  16636. // prepareXArgs prepare arguments for the formula function XIRR and XNPV.
  16637. func (fn *formulaFuncs) prepareXArgs(values, dates formulaArg) (valuesArg, datesArg []float64, err formulaArg) {
  16638. for _, arg := range values.ToList() {
  16639. if numArg := arg.ToNumber(); numArg.Type == ArgNumber {
  16640. valuesArg = append(valuesArg, numArg.Number)
  16641. continue
  16642. }
  16643. err = newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16644. return
  16645. }
  16646. if len(valuesArg) < 2 {
  16647. err = newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16648. return
  16649. }
  16650. args, date := list.New(), 0.0
  16651. for _, arg := range dates.ToList() {
  16652. args.Init()
  16653. args.PushBack(arg)
  16654. dateValue := fn.DATEVALUE(args)
  16655. if dateValue.Type != ArgNumber {
  16656. err = newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16657. return
  16658. }
  16659. if dateValue.Number < date {
  16660. err = newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  16661. return
  16662. }
  16663. datesArg = append(datesArg, dateValue.Number)
  16664. date = dateValue.Number
  16665. }
  16666. if len(valuesArg) != len(datesArg) {
  16667. err = newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16668. return
  16669. }
  16670. err = newEmptyFormulaArg()
  16671. return
  16672. }
  16673. // xirr is an implementation of the formula function XIRR.
  16674. func (fn *formulaFuncs) xirr(values, dates []float64, guess float64) formulaArg {
  16675. positive, negative := false, false
  16676. for i := 0; i < len(values); i++ {
  16677. if values[i] > 0 {
  16678. positive = true
  16679. }
  16680. if values[i] < 0 {
  16681. negative = true
  16682. }
  16683. }
  16684. if !positive || !negative {
  16685. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16686. }
  16687. result, epsMax, count, maxIterate, err := guess, 1e-10, 0, 50, false
  16688. for {
  16689. resultValue := xirrPart1(values, dates, result)
  16690. newRate := result - resultValue/xirrPart2(values, dates, result)
  16691. epsRate := math.Abs(newRate - result)
  16692. result = newRate
  16693. count++
  16694. if epsRate <= epsMax || math.Abs(resultValue) <= epsMax {
  16695. break
  16696. }
  16697. if count > maxIterate {
  16698. err = true
  16699. break
  16700. }
  16701. }
  16702. if err || math.IsNaN(result) || math.IsInf(result, 0) {
  16703. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16704. }
  16705. return newNumberFormulaArg(result)
  16706. }
  16707. // xirrPart1 is a part of implementation of the formula function XIRR.
  16708. func xirrPart1(values, dates []float64, rate float64) float64 {
  16709. r := rate + 1
  16710. result := values[0]
  16711. vlen := len(values)
  16712. firstDate := dates[0]
  16713. for i := 1; i < vlen; i++ {
  16714. result += values[i] / math.Pow(r, (dates[i]-firstDate)/365)
  16715. }
  16716. return result
  16717. }
  16718. // xirrPart2 is a part of implementation of the formula function XIRR.
  16719. func xirrPart2(values, dates []float64, rate float64) float64 {
  16720. r := rate + 1
  16721. result := 0.0
  16722. vlen := len(values)
  16723. firstDate := dates[0]
  16724. for i := 1; i < vlen; i++ {
  16725. frac := (dates[i] - firstDate) / 365
  16726. result -= frac * values[i] / math.Pow(r, frac+1)
  16727. }
  16728. return result
  16729. }
  16730. // XIRR function returns the Internal Rate of Return for a supplied series of
  16731. // cash flows (i.e. a set of values, which includes an initial investment
  16732. // value and a series of net income values) occurring at a series of supplied
  16733. // dates. The syntax of the function is:
  16734. //
  16735. // XIRR(values,dates,[guess])
  16736. func (fn *formulaFuncs) XIRR(argsList *list.List) formulaArg {
  16737. if argsList.Len() != 2 && argsList.Len() != 3 {
  16738. return newErrorFormulaArg(formulaErrorVALUE, "XIRR requires 2 or 3 arguments")
  16739. }
  16740. values, dates, err := fn.prepareXArgs(argsList.Front().Value.(formulaArg), argsList.Front().Next().Value.(formulaArg))
  16741. if err.Type != ArgEmpty {
  16742. return err
  16743. }
  16744. guess := newNumberFormulaArg(0)
  16745. if argsList.Len() == 3 {
  16746. if guess = argsList.Back().Value.(formulaArg).ToNumber(); guess.Type != ArgNumber {
  16747. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16748. }
  16749. if guess.Number <= -1 {
  16750. return newErrorFormulaArg(formulaErrorVALUE, "XIRR requires guess > -1")
  16751. }
  16752. }
  16753. return fn.xirr(values, dates, guess.Number)
  16754. }
  16755. // XNPV function calculates the Net Present Value for a schedule of cash flows
  16756. // that is not necessarily periodic. The syntax of the function is:
  16757. //
  16758. // XNPV(rate,values,dates)
  16759. func (fn *formulaFuncs) XNPV(argsList *list.List) formulaArg {
  16760. if argsList.Len() != 3 {
  16761. return newErrorFormulaArg(formulaErrorVALUE, "XNPV requires 3 arguments")
  16762. }
  16763. rate := argsList.Front().Value.(formulaArg).ToNumber()
  16764. if rate.Type != ArgNumber {
  16765. return rate
  16766. }
  16767. if rate.Number <= 0 {
  16768. return newErrorFormulaArg(formulaErrorVALUE, "XNPV requires rate > 0")
  16769. }
  16770. values, dates, err := fn.prepareXArgs(argsList.Front().Next().Value.(formulaArg), argsList.Back().Value.(formulaArg))
  16771. if err.Type != ArgEmpty {
  16772. return err
  16773. }
  16774. date1, xnpv := dates[0], 0.0
  16775. for idx, value := range values {
  16776. xnpv += value / math.Pow(1+rate.Number, (dates[idx]-date1)/365)
  16777. }
  16778. return newNumberFormulaArg(xnpv)
  16779. }
  16780. // yield is an implementation of the formula function YIELD.
  16781. func (fn *formulaFuncs) yield(settlement, maturity, rate, pr, redemption, frequency, basis formulaArg) formulaArg {
  16782. priceN, yield1, yield2 := newNumberFormulaArg(0), newNumberFormulaArg(0), newNumberFormulaArg(1)
  16783. price1 := fn.price(settlement, maturity, rate, yield1, redemption, frequency, basis)
  16784. if price1.Type != ArgNumber {
  16785. return price1
  16786. }
  16787. price2 := fn.price(settlement, maturity, rate, yield2, redemption, frequency, basis)
  16788. yieldN := newNumberFormulaArg((yield2.Number - yield1.Number) * 0.5)
  16789. for iter := 0; iter < 100 && priceN.Number != pr.Number; iter++ {
  16790. priceN = fn.price(settlement, maturity, rate, yieldN, redemption, frequency, basis)
  16791. if pr.Number == price1.Number {
  16792. return yield1
  16793. } else if pr.Number == price2.Number {
  16794. return yield2
  16795. } else if pr.Number == priceN.Number {
  16796. return yieldN
  16797. } else if pr.Number < price2.Number {
  16798. yield2.Number *= 2.0
  16799. price2 = fn.price(settlement, maturity, rate, yield2, redemption, frequency, basis)
  16800. yieldN.Number = (yield2.Number - yield1.Number) * 0.5
  16801. } else {
  16802. if pr.Number < priceN.Number {
  16803. yield1 = yieldN
  16804. price1 = priceN
  16805. } else {
  16806. yield2 = yieldN
  16807. price2 = priceN
  16808. }
  16809. f1 := (yield2.Number - yield1.Number) * ((pr.Number - price2.Number) / (price1.Number - price2.Number))
  16810. yieldN.Number = yield2.Number - math.Nextafter(f1, f1)
  16811. }
  16812. }
  16813. return yieldN
  16814. }
  16815. // YIELD function calculates the Yield of a security that pays periodic
  16816. // interest. The syntax of the function is:
  16817. //
  16818. // YIELD(settlement,maturity,rate,pr,redemption,frequency,[basis])
  16819. func (fn *formulaFuncs) YIELD(argsList *list.List) formulaArg {
  16820. if argsList.Len() != 6 && argsList.Len() != 7 {
  16821. return newErrorFormulaArg(formulaErrorVALUE, "YIELD requires 6 or 7 arguments")
  16822. }
  16823. args := fn.prepareDataValueArgs(2, argsList)
  16824. if args.Type != ArgList {
  16825. return args
  16826. }
  16827. settlement, maturity := args.List[0], args.List[1]
  16828. rate := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  16829. if rate.Type != ArgNumber {
  16830. return rate
  16831. }
  16832. if rate.Number < 0 {
  16833. return newErrorFormulaArg(formulaErrorNUM, "PRICE requires rate >= 0")
  16834. }
  16835. pr := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  16836. if pr.Type != ArgNumber {
  16837. return pr
  16838. }
  16839. if pr.Number <= 0 {
  16840. return newErrorFormulaArg(formulaErrorNUM, "PRICE requires pr > 0")
  16841. }
  16842. redemption := argsList.Front().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  16843. if redemption.Type != ArgNumber {
  16844. return redemption
  16845. }
  16846. if redemption.Number < 0 {
  16847. return newErrorFormulaArg(formulaErrorNUM, "PRICE requires redemption >= 0")
  16848. }
  16849. frequency := argsList.Front().Next().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  16850. if frequency.Type != ArgNumber {
  16851. return frequency
  16852. }
  16853. if !validateFrequency(frequency.Number) {
  16854. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16855. }
  16856. basis := newNumberFormulaArg(0)
  16857. if argsList.Len() == 7 {
  16858. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  16859. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16860. }
  16861. }
  16862. return fn.yield(settlement, maturity, rate, pr, redemption, frequency, basis)
  16863. }
  16864. // YIELDDISC function calculates the annual yield of a discounted security.
  16865. // The syntax of the function is:
  16866. //
  16867. // YIELDDISC(settlement,maturity,pr,redemption,[basis])
  16868. func (fn *formulaFuncs) YIELDDISC(argsList *list.List) formulaArg {
  16869. if argsList.Len() != 4 && argsList.Len() != 5 {
  16870. return newErrorFormulaArg(formulaErrorVALUE, "YIELDDISC requires 4 or 5 arguments")
  16871. }
  16872. args := fn.prepareDataValueArgs(2, argsList)
  16873. if args.Type != ArgList {
  16874. return args
  16875. }
  16876. settlement, maturity := args.List[0], args.List[1]
  16877. pr := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  16878. if pr.Type != ArgNumber {
  16879. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  16880. }
  16881. if pr.Number <= 0 {
  16882. return newErrorFormulaArg(formulaErrorNUM, "YIELDDISC requires pr > 0")
  16883. }
  16884. redemption := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  16885. if redemption.Type != ArgNumber {
  16886. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  16887. }
  16888. if redemption.Number <= 0 {
  16889. return newErrorFormulaArg(formulaErrorNUM, "YIELDDISC requires redemption > 0")
  16890. }
  16891. basis := newNumberFormulaArg(0)
  16892. if argsList.Len() == 5 {
  16893. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  16894. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16895. }
  16896. }
  16897. frac := yearFrac(settlement.Number, maturity.Number, int(basis.Number))
  16898. if frac.Type != ArgNumber {
  16899. return frac
  16900. }
  16901. return newNumberFormulaArg((redemption.Number/pr.Number - 1) / frac.Number)
  16902. }
  16903. // YIELDMAT function calculates the annual yield of a security that pays
  16904. // interest at maturity. The syntax of the function is:
  16905. //
  16906. // YIELDMAT(settlement,maturity,issue,rate,pr,[basis])
  16907. func (fn *formulaFuncs) YIELDMAT(argsList *list.List) formulaArg {
  16908. if argsList.Len() != 5 && argsList.Len() != 6 {
  16909. return newErrorFormulaArg(formulaErrorVALUE, "YIELDMAT requires 5 or 6 arguments")
  16910. }
  16911. args := fn.prepareDataValueArgs(2, argsList)
  16912. if args.Type != ArgList {
  16913. return args
  16914. }
  16915. settlement, maturity := args.List[0], args.List[1]
  16916. arg := list.New().Init()
  16917. issue := argsList.Front().Next().Next().Value.(formulaArg).ToNumber()
  16918. if issue.Type != ArgNumber {
  16919. arg.PushBack(argsList.Front().Next().Next().Value.(formulaArg))
  16920. issue = fn.DATEVALUE(arg)
  16921. if issue.Type != ArgNumber {
  16922. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  16923. }
  16924. }
  16925. if issue.Number >= settlement.Number {
  16926. return newErrorFormulaArg(formulaErrorNUM, "YIELDMAT requires settlement > issue")
  16927. }
  16928. rate := argsList.Front().Next().Next().Next().Value.(formulaArg).ToNumber()
  16929. if rate.Type != ArgNumber {
  16930. return rate
  16931. }
  16932. if rate.Number < 0 {
  16933. return newErrorFormulaArg(formulaErrorNUM, "YIELDMAT requires rate >= 0")
  16934. }
  16935. pr := argsList.Front().Next().Next().Next().Next().Value.(formulaArg).ToNumber()
  16936. if pr.Type != ArgNumber {
  16937. return pr
  16938. }
  16939. if pr.Number <= 0 {
  16940. return newErrorFormulaArg(formulaErrorNUM, "YIELDMAT requires pr > 0")
  16941. }
  16942. basis := newNumberFormulaArg(0)
  16943. if argsList.Len() == 6 {
  16944. if basis = argsList.Back().Value.(formulaArg).ToNumber(); basis.Type != ArgNumber {
  16945. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  16946. }
  16947. }
  16948. dim := yearFrac(issue.Number, maturity.Number, int(basis.Number))
  16949. if dim.Type != ArgNumber {
  16950. return dim
  16951. }
  16952. dis := yearFrac(issue.Number, settlement.Number, int(basis.Number))
  16953. dsm := yearFrac(settlement.Number, maturity.Number, int(basis.Number))
  16954. f1 := dim.Number * rate.Number
  16955. result := 1 + math.Nextafter(f1, f1)
  16956. result /= pr.Number/100 + dis.Number*rate.Number
  16957. result--
  16958. result /= dsm.Number
  16959. return newNumberFormulaArg(result)
  16960. }
  16961. // Database Functions
  16962. // calcDatabase defines the structure for formula database.
  16963. type calcDatabase struct {
  16964. col, row int
  16965. indexMap map[int]int
  16966. database [][]formulaArg
  16967. criteria [][]formulaArg
  16968. }
  16969. // newCalcDatabase function returns formula database by given data range of
  16970. // cells containing the database, field and criteria range.
  16971. func newCalcDatabase(database, field, criteria formulaArg) *calcDatabase {
  16972. db := calcDatabase{
  16973. indexMap: make(map[int]int),
  16974. database: database.Matrix,
  16975. criteria: criteria.Matrix,
  16976. }
  16977. exp := len(database.Matrix) < 2 || len(database.Matrix[0]) < 1 ||
  16978. len(criteria.Matrix) < 2 || len(criteria.Matrix[0]) < 1
  16979. if field.Type != ArgEmpty {
  16980. if db.col = db.columnIndex(database.Matrix, field); exp || db.col < 0 || len(db.database[0]) <= db.col {
  16981. return nil
  16982. }
  16983. return &db
  16984. }
  16985. if db.col = -1; exp {
  16986. return nil
  16987. }
  16988. return &db
  16989. }
  16990. // columnIndex return index by specifies column field within the database for
  16991. // which user want to return the count of non-blank cells.
  16992. func (db *calcDatabase) columnIndex(database [][]formulaArg, field formulaArg) int {
  16993. num := field.ToNumber()
  16994. if num.Type != ArgNumber && len(database) > 0 {
  16995. for i := 0; i < len(database[0]); i++ {
  16996. if title := database[0][i]; strings.EqualFold(title.Value(), field.Value()) {
  16997. return i
  16998. }
  16999. }
  17000. return -1
  17001. }
  17002. return int(num.Number - 1)
  17003. }
  17004. // criteriaEval evaluate formula criteria expression.
  17005. func (db *calcDatabase) criteriaEval() bool {
  17006. var (
  17007. columns, rows = len(db.criteria[0]), len(db.criteria)
  17008. criteria = db.criteria
  17009. k int
  17010. matched bool
  17011. )
  17012. if len(db.indexMap) == 0 {
  17013. fields := criteria[0]
  17014. for j := 0; j < columns; j++ {
  17015. if k = db.columnIndex(db.database, fields[j]); k < 0 {
  17016. return false
  17017. }
  17018. db.indexMap[j] = k
  17019. }
  17020. }
  17021. for i := 1; !matched && i < rows; i++ {
  17022. matched = true
  17023. for j := 0; matched && j < columns; j++ {
  17024. criteriaExp := db.criteria[i][j].Value()
  17025. if criteriaExp == "" {
  17026. continue
  17027. }
  17028. criteria := formulaCriteriaParser(criteriaExp)
  17029. cell := db.database[db.row][db.indexMap[j]].Value()
  17030. matched, _ = formulaCriteriaEval(cell, criteria)
  17031. }
  17032. }
  17033. return matched
  17034. }
  17035. // value returns the current cell value.
  17036. func (db *calcDatabase) value() formulaArg {
  17037. if db.col == -1 {
  17038. return db.database[db.row][len(db.database[db.row])-1]
  17039. }
  17040. return db.database[db.row][db.col]
  17041. }
  17042. // next will return true if find the matched cell in the database.
  17043. func (db *calcDatabase) next() bool {
  17044. matched, rows := false, len(db.database)
  17045. for !matched && db.row < rows {
  17046. if db.row++; db.row < rows {
  17047. matched = db.criteriaEval()
  17048. }
  17049. }
  17050. return matched
  17051. }
  17052. // database is an implementation of the formula functions DAVERAGE, DMAX and DMIN.
  17053. func (fn *formulaFuncs) database(name string, argsList *list.List) formulaArg {
  17054. if argsList.Len() != 3 {
  17055. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 3 arguments", name))
  17056. }
  17057. database := argsList.Front().Value.(formulaArg)
  17058. field := argsList.Front().Next().Value.(formulaArg)
  17059. criteria := argsList.Back().Value.(formulaArg)
  17060. db := newCalcDatabase(database, field, criteria)
  17061. if db == nil {
  17062. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  17063. }
  17064. args := list.New()
  17065. for db.next() {
  17066. args.PushBack(db.value())
  17067. }
  17068. switch name {
  17069. case "DMAX":
  17070. return fn.MAX(args)
  17071. case "DMIN":
  17072. return fn.MIN(args)
  17073. case "DPRODUCT":
  17074. return fn.PRODUCT(args)
  17075. case "DSTDEV":
  17076. return fn.STDEV(args)
  17077. case "DSTDEVP":
  17078. return fn.STDEVP(args)
  17079. case "DSUM":
  17080. return fn.SUM(args)
  17081. case "DVAR":
  17082. return fn.VAR(args)
  17083. case "DVARP":
  17084. return fn.VARP(args)
  17085. default:
  17086. return fn.AVERAGE(args)
  17087. }
  17088. }
  17089. // DAVERAGE function calculates the average (statistical mean) of values in a
  17090. // field (column) in a database for selected records, that satisfy
  17091. // user-specified criteria. The syntax of the Excel Daverage function is:
  17092. //
  17093. // DAVERAGE(database,field,criteria)
  17094. func (fn *formulaFuncs) DAVERAGE(argsList *list.List) formulaArg {
  17095. return fn.database("DAVERAGE", argsList)
  17096. }
  17097. // dcount is an implementation of the formula functions DCOUNT and DCOUNTA.
  17098. func (fn *formulaFuncs) dcount(name string, argsList *list.List) formulaArg {
  17099. if argsList.Len() < 2 {
  17100. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at least 2 arguments", name))
  17101. }
  17102. if argsList.Len() > 3 {
  17103. return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s allows at most 3 arguments", name))
  17104. }
  17105. field := newEmptyFormulaArg()
  17106. criteria := argsList.Back().Value.(formulaArg)
  17107. if argsList.Len() > 2 {
  17108. field = argsList.Front().Next().Value.(formulaArg)
  17109. }
  17110. database := argsList.Front().Value.(formulaArg)
  17111. db := newCalcDatabase(database, field, criteria)
  17112. if db == nil {
  17113. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  17114. }
  17115. args := list.New()
  17116. for db.next() {
  17117. args.PushBack(db.value())
  17118. }
  17119. if name == "DCOUNT" {
  17120. return fn.COUNT(args)
  17121. }
  17122. return fn.COUNTA(args)
  17123. }
  17124. // DCOUNT function returns the number of cells containing numeric values, in a
  17125. // field (column) of a database for selected records only. The records to be
  17126. // included in the count are those that satisfy a set of one or more
  17127. // user-specified criteria. The syntax of the function is:
  17128. //
  17129. // DCOUNT(database,[field],criteria)
  17130. func (fn *formulaFuncs) DCOUNT(argsList *list.List) formulaArg {
  17131. return fn.dcount("DCOUNT", argsList)
  17132. }
  17133. // DCOUNTA function returns the number of non-blank cells, in a field
  17134. // (column) of a database for selected records only. The records to be
  17135. // included in the count are those that satisfy a set of one or more
  17136. // user-specified criteria. The syntax of the function is:
  17137. //
  17138. // DCOUNTA(database,[field],criteria)
  17139. func (fn *formulaFuncs) DCOUNTA(argsList *list.List) formulaArg {
  17140. return fn.dcount("DCOUNTA", argsList)
  17141. }
  17142. // DGET function returns a single value from a column of a database. The record
  17143. // is selected via a set of one or more user-specified criteria. The syntax of
  17144. // the function is:
  17145. //
  17146. // DGET(database,field,criteria)
  17147. func (fn *formulaFuncs) DGET(argsList *list.List) formulaArg {
  17148. if argsList.Len() != 3 {
  17149. return newErrorFormulaArg(formulaErrorVALUE, "DGET requires 3 arguments")
  17150. }
  17151. database := argsList.Front().Value.(formulaArg)
  17152. field := argsList.Front().Next().Value.(formulaArg)
  17153. criteria := argsList.Back().Value.(formulaArg)
  17154. db := newCalcDatabase(database, field, criteria)
  17155. if db == nil {
  17156. return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  17157. }
  17158. value := newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
  17159. if db.next() {
  17160. if value = db.value(); db.next() {
  17161. return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
  17162. }
  17163. }
  17164. return value
  17165. }
  17166. // DMAX function finds the maximum value in a field (column) in a database for
  17167. // selected records only. The records to be included in the calculation are
  17168. // defined by a set of one or more user-specified criteria. The syntax of the
  17169. // function is:
  17170. //
  17171. // DMAX(database,field,criteria)
  17172. func (fn *formulaFuncs) DMAX(argsList *list.List) formulaArg {
  17173. return fn.database("DMAX", argsList)
  17174. }
  17175. // DMIN function finds the minimum value in a field (column) in a database for
  17176. // selected records only. The records to be included in the calculation are
  17177. // defined by a set of one or more user-specified criteria. The syntax of the
  17178. // function is:
  17179. //
  17180. // DMIN(database,field,criteria)
  17181. func (fn *formulaFuncs) DMIN(argsList *list.List) formulaArg {
  17182. return fn.database("DMIN", argsList)
  17183. }
  17184. // DPRODUCT function calculates the product of a field (column) in a database
  17185. // for selected records, that satisfy user-specified criteria. The syntax of
  17186. // the function is:
  17187. //
  17188. // DPRODUCT(database,field,criteria)
  17189. func (fn *formulaFuncs) DPRODUCT(argsList *list.List) formulaArg {
  17190. return fn.database("DPRODUCT", argsList)
  17191. }
  17192. // DSTDEV function calculates the sample standard deviation of a field
  17193. // (column) in a database for selected records only. The records to be
  17194. // included in the calculation are defined by a set of one or more
  17195. // user-specified criteria. The syntax of the function is:
  17196. //
  17197. // DSTDEV(database,field,criteria)
  17198. func (fn *formulaFuncs) DSTDEV(argsList *list.List) formulaArg {
  17199. return fn.database("DSTDEV", argsList)
  17200. }
  17201. // DSTDEVP function calculates the standard deviation of a field (column) in a
  17202. // database for selected records only. The records to be included in the
  17203. // calculation are defined by a set of one or more user-specified criteria.
  17204. // The syntax of the function is:
  17205. //
  17206. // DSTDEVP(database,field,criteria)
  17207. func (fn *formulaFuncs) DSTDEVP(argsList *list.List) formulaArg {
  17208. return fn.database("DSTDEVP", argsList)
  17209. }
  17210. // DSUM function calculates the sum of a field (column) in a database for
  17211. // selected records, that satisfy user-specified criteria. The syntax of the
  17212. // function is:
  17213. //
  17214. // DSUM(database,field,criteria)
  17215. func (fn *formulaFuncs) DSUM(argsList *list.List) formulaArg {
  17216. return fn.database("DSUM", argsList)
  17217. }
  17218. // DVAR function calculates the sample variance of a field (column) in a
  17219. // database for selected records only. The records to be included in the
  17220. // calculation are defined by a set of one or more user-specified criteria.
  17221. // The syntax of the function is:
  17222. //
  17223. // DVAR(database,field,criteria)
  17224. func (fn *formulaFuncs) DVAR(argsList *list.List) formulaArg {
  17225. return fn.database("DVAR", argsList)
  17226. }
  17227. // DVARP function calculates the variance (for an entire population), of the
  17228. // values in a field (column) in a database for selected records only. The
  17229. // records to be included in the calculation are defined by a set of one or
  17230. // more user-specified criteria. The syntax of the function is:
  17231. //
  17232. // DVARP(database,field,criteria)
  17233. func (fn *formulaFuncs) DVARP(argsList *list.List) formulaArg {
  17234. return fn.database("DVARP", argsList)
  17235. }