if (param1 instanceof Number) {
int scale;
try {
scale = getInteger(param2);
} catch (ParseException e) {
throw new ParseException(PARAM_EXCEPTION);
}
if (scale < 0) {
return ZERO;
}
if (param1 instanceof BigDecimal) { // BigInteger is not supported
return ((BigDecimal)param1).setScale(scale, BigDecimal.ROUND_HALF_UP);
}
if (param1 instanceof Double || param1 instanceof Float) {
double d = ((Number)param1).doubleValue();
long mult = 1;
for (int i = 0; i < scale; i++) {
mult *= 10;
}
d *= mult;
return (Math.round(d))/mult;
}
if (param1 instanceof Number) { // Long, Integer, Short, Byte
return param1;
}
throw new ParseException(WRONG_TYPE+" round("+param1.getClass()+","+param2.getClass()+")");
}
else if (param1 instanceof java.util.Date) {
if (param2 instanceof String) {
String s = (String)param2;
java.util.Date d = (java.util.Date)param1;
cal.setTimeInMillis(d.getTime());
if (s.equalsIgnoreCase("CC") || s.equalsIgnoreCase("SCC")) {
if (d instanceof java.sql.Time) {
throw new ParseException(TIME_EXCEPTION);
}
int year = cal.get(YEAR);
int year1 = (year/100)*100;
if (year-year1 > 50) {
year1 += 100;
}
cal.clear();
cal.set(year1+1, 0, 1);
return new Timestamp(cal.getTimeInMillis());
}
else if (s.equalsIgnoreCase("SYYYY") || s.equalsIgnoreCase("YYYY") || s.equalsIgnoreCase("YYY") ||
s.equalsIgnoreCase("Y") || s.equalsIgnoreCase("YEAR") || s.equalsIgnoreCase("SYEAR")) {
if (d instanceof java.sql.Time) {
throw new ParseException(TIME_EXCEPTION);
}
int year = cal.get(YEAR);
int month = cal.get(MONTH);
if (month > 6) {
year++;
}
cal.clear();
cal.set(year, 0, 1);
return new Timestamp(cal.getTimeInMillis());
}
else if (s.equalsIgnoreCase("IYYY") || s.equalsIgnoreCase("IY") || s.equalsIgnoreCase("I")) {
throw new ParseException(NOT_IMPLIMENTED_EXCEPTION);
}
else if (s.equalsIgnoreCase("Q")) {
if (d instanceof java.sql.Time) {
throw new ParseException(TIME_EXCEPTION);
}
int year = cal.get(YEAR);
int month = cal.get(MONTH);
int q = (month/3)*3;
if (month > q+1) {
q++;
}
else if (month > q) {
int day = cal.get(DAY_OF_MONTH);
if (day > 15) {
q++;
}
}
cal.clear();
cal.set(year, q, 1);
return new Timestamp(cal.getTimeInMillis());
}
else if (s.equalsIgnoreCase("MONTH") || s.equalsIgnoreCase("MON") ||
s.equalsIgnoreCase("MM") || s.equalsIgnoreCase("RM")) {
if (d instanceof java.sql.Time) {
throw new ParseException(TIME_EXCEPTION);
}
int year = cal.get(YEAR);
int month = cal.get(MONTH);
int day = cal.get(DAY_OF_MONTH);
if (day > 15) {
month++;
}
cal.clear();
cal.set(year, month, 1);
return new Timestamp(cal.getTimeInMillis());
}
else if (s.equalsIgnoreCase("WW")) {
if (d instanceof java.sql.Time) {
throw new ParseException(TIME_EXCEPTION);
}
int year = cal.get(YEAR);
int month = cal.get(MONTH);
int day = cal.get(DAY_OF_MONTH);
int dw = cal.get(DAY_OF_WEEK);
cal.clear();
cal.set(year, 0, 1);
int dayOfWeek = cal.get(DAY_OF_WEEK);
int delta = (dw<dayOfWeek ? 7-(dayOfWeek-dw) : dw-dayOfWeek);
if (delta > 2) {
delta = delta-7;
}
cal.set(year, month, day-delta);
return new Timestamp(cal.getTimeInMillis());
}
else if (s.equalsIgnoreCase("W")) {
if (d instanceof java.sql.Time) {
throw new ParseException(TIME_EXCEPTION);
}
int year = cal.get(YEAR);
int month = cal.get(MONTH);
int day = cal.get(DAY_OF_MONTH);
int dw = cal.get(DAY_OF_WEEK);
cal.clear();
cal.set(year, month, 1);
int dayOfWeek = cal.get(DAY_OF_WEEK);
int delta = (dw<dayOfWeek ? 7-(dayOfWeek-dw) : dw-dayOfWeek);
if (delta > 2) {
delta = delta-7;
}
cal.set(year, month, day-delta);
return new Timestamp(cal.getTimeInMillis());
}
else if (s.equalsIgnoreCase("IW")) {
throw new ParseException(NOT_IMPLIMENTED_EXCEPTION);
}
else if (s.equalsIgnoreCase("DAY") || s.equalsIgnoreCase("DY") || s.equalsIgnoreCase("D")) {
if (d instanceof java.sql.Time) {
throw new ParseException(TIME_EXCEPTION);
}
int year = cal.get(YEAR);
int month = cal.get(MONTH);
int day = cal.get(DAY_OF_MONTH);
int dw = cal.get(DAY_OF_WEEK);
int delta = dw-cal.getFirstDayOfWeek();
if (delta > 2) {
delta = delta-7;
}
cal.clear();
cal.set(year, month, day-delta);
return new Timestamp(cal.getTimeInMillis());
}
else if (s.equalsIgnoreCase("HH") || s.equalsIgnoreCase("HH12") || s.equalsIgnoreCase("HH24")) {
if (d instanceof java.sql.Date) {
throw new ParseException(DATE_EXCEPTION);
}
int minute = cal.get(MINUTE);
if (minute >= 30) {
cal.get(HOUR_OF_DAY);
cal.add(HOUR_OF_DAY, 1);
}
cal.set(MINUTE, 0);
cal.set(SECOND, 0);
cal.set(MILLISECOND, 0);
return new Timestamp(cal.getTimeInMillis());
}
else if (s.equalsIgnoreCase("MI")) {
if (d instanceof java.sql.Date) {
throw new ParseException(DATE_EXCEPTION);
}
int second = cal.get(SECOND);
if (second >= 30) {
cal.get(MINUTE);
cal.add(MINUTE, 1);
}
cal.set(SECOND, 0);
cal.set(MILLISECOND, 0);
return new Timestamp(cal.getTimeInMillis());
} else {
throw new ParseException(FORMAT_EXCEPTION);
}
}
}
throw new ParseException(WRONG_TYPE+" trunc("+param1.getClass()+","+param2.getClass()+")");
}