ASF Bugzilla – Attachment 24192 Details for
Bug 47768
[PATCH] Implementation of Excel "Days360" and "Npv" functions
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
Patch with implementation of functions.
patch.txt (text/plain), 5.32 KB, created by
Petr.Udalau
on 2009-08-31 04:43:24 UTC
(
hide
)
Description:
Patch with implementation of functions.
Filename:
MIME Type:
Creator:
Petr.Udalau
Created:
2009-08-31 04:43:24 UTC
Size:
5.32 KB
patch
obsolete
>Index: java/org/apache/poi/hssf/record/formula/functions/Days360.java >=================================================================== >--- java/org/apache/poi/hssf/record/formula/functions/Days360.java (revision 0) >+++ java/org/apache/poi/hssf/record/formula/functions/Days360.java (revision 0) >@@ -0,0 +1,74 @@ >+package org.apache.poi.hssf.record.formula.functions; >+ >+import java.util.Calendar; >+import java.util.GregorianCalendar; >+ >+import org.apache.poi.hssf.record.formula.eval.EvaluationException; >+import org.apache.poi.ss.usermodel.DateUtil; >+ >+/** >+ * Calculates the number of days between two dates based on a 360-day year >+ * (twelve 30-day months), which is used in some accounting calculations. Use >+ * this function to help compute payments if your accounting system is based on >+ * twelve 30-day months. >+ * >+ * >+ * @author PUdalau >+ */ >+public class Days360 extends NumericFunction.TwoArg { >+ >+ @Override >+ protected double evaluate(double d0, double d1) throws EvaluationException { >+ Calendar startingDate = getStartingDate(d0); >+ Calendar endingDate = getEndingDateAccordingToStartingDate(d1, startingDate); >+ long startingDay = startingDate.get(Calendar.MONTH) * 30 + startingDate.get(Calendar.DAY_OF_MONTH); >+ long endingDay = (endingDate.get(Calendar.YEAR) - startingDate.get(Calendar.YEAR)) * 360 >+ + endingDate.get(Calendar.MONTH) * 30 + endingDate.get(Calendar.DAY_OF_MONTH); >+ return endingDay - startingDay; >+ } >+ >+ private Calendar getDate(double date) { >+ Calendar processedDate = new GregorianCalendar(); >+ processedDate.setTime(DateUtil.getJavaDate(date, false)); >+ return processedDate; >+ } >+ >+ private Calendar getStartingDate(double date) { >+ Calendar startingDate = getDate(date); >+ if (isLastDayOfMonth(startingDate)) { >+ startingDate.set(Calendar.DAY_OF_MONTH, 30); >+ } >+ return startingDate; >+ } >+ >+ private Calendar getEndingDateAccordingToStartingDate(double date, Calendar startingDate) { >+ Calendar endingDate = getDate(date); >+ endingDate.setTime(DateUtil.getJavaDate(date, false)); >+ if (isLastDayOfMonth(endingDate)) { >+ if (startingDate.get(Calendar.DATE) < 30) { >+ endingDate = getFirstDayOfNextMonth(endingDate); >+ } >+ } >+ return endingDate; >+ } >+ >+ private boolean isLastDayOfMonth(Calendar date) { >+ Calendar clone = (Calendar) date.clone(); >+ clone.add(java.util.Calendar.MONTH, 1); >+ clone.add(java.util.Calendar.DAY_OF_MONTH, -1); >+ int lastDayOfMonth = clone.get(Calendar.DAY_OF_MONTH); >+ return date.get(Calendar.DAY_OF_MONTH) == lastDayOfMonth; >+ } >+ >+ private Calendar getFirstDayOfNextMonth(Calendar date) { >+ Calendar newDate = (Calendar) date.clone(); >+ if (date.get(Calendar.MONTH) < Calendar.DECEMBER) { >+ newDate.set(Calendar.MONTH, date.get(Calendar.MONTH) + 1); >+ } else { >+ newDate.set(Calendar.MONTH, 1); >+ newDate.set(Calendar.YEAR, date.get(Calendar.YEAR) + 1); >+ } >+ newDate.set(Calendar.DATE, 1); >+ return newDate; >+ } >+} >Index: java/org/apache/poi/hssf/record/formula/functions/Npv.java >=================================================================== >--- java/org/apache/poi/hssf/record/formula/functions/Npv.java (revision 0) >+++ java/org/apache/poi/hssf/record/formula/functions/Npv.java (revision 0) >@@ -0,0 +1,47 @@ >+/* ==================================================================== >+ Licensed to the Apache Software Foundation (ASF) under one or more >+ contributor license agreements. See the NOTICE file distributed with >+ this work for additional information regarding copyright ownership. >+ The ASF licenses this file to You under the Apache License, Version 2.0 >+ (the "License"); you may not use this file except in compliance with >+ the License. You may obtain a copy of the License at >+ >+ http://www.apache.org/licenses/LICENSE-2.0 >+ >+ Unless required by applicable law or agreed to in writing, software >+ distributed under the License is distributed on an "AS IS" BASIS, >+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. >+ See the License for the specific language governing permissions and >+ limitations under the License. >+==================================================================== */ >+ >+package org.apache.poi.hssf.record.formula.functions; >+ >+import org.apache.poi.hssf.record.formula.eval.EvaluationException; >+ >+/** >+ * Calculates the net present value of an investment by using a discount rate >+ * and a series of future payments (negative values) and income (positive >+ * values). Minimum 2 arguments, first arg is the rate of discount over the >+ * length of one period others up to 254 arguments representing the payments and >+ * income. >+ * >+ * @author SPetrakovsky >+ */ >+public class Npv extends NumericFunction.MultiArg { >+ >+ public Npv() { >+ super(2, 255); >+ } >+ >+ @Override >+ protected double evaluate(double[] ds) throws EvaluationException { >+ double rate = ds[0]; >+ double sum = 0; >+ for (int i = 1; i < ds.length; i++) { >+ sum += ds[i] / Math.pow(rate + 1, i); >+ } >+ return sum; >+ } >+ >+}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 47768
: 24192 |
24234