format.java

来自「一个简单的visio程序。」· Java 代码 · 共 2,266 行 · 第 1/5 页

JAVA
2,266
字号
/**
 * @(#)format.java	98/06/18
 *
 * Copyright 1997-1998 by Halcyon Software Inc.,
 * All rights reserved.
 *
 * This function formats an expression according to instructions
 * contained in a format expression.
 *
 * @version IB4J1.3
 */

package HPCore.stdfunc;

import java.io.*;
import HECore.stddata.*;
import HPCore.Exception.*;

public class format
{
	private static final int Gen_Num   = 0;
	private static final int Currency  = 1;
	private static final int Fixed     = 2;
	private static final int Stand     = 3;
	private static final int Perc      = 4;
	private static final int Scien     = 5;
	private static final int Yn        = 6;
	private static final int Tf        = 7;
	private static final int Onoff     = 8;
	private static final int Gen_Dat   = 9;
	private static final int L_Dat     =10;
	private static final int M_Dat     =11;
	private static final int S_Dat     =12;
	private static final int L_Tim     =13;
	private static final int M_Tim     =14;
	private static final int S_Tim     =15;

	private static final int IS_STR    = 1;
	private static final int IS_DEC    = 2;
	private static final int IS_OCT    = 3;
	private static final int IS_HEX    = 4;
	private static final int IS_SCI    = 5;
	private static final int IS_CUR    = 6;
	private static final int IS_BKT    = 7;
	private static final int IS_DAT    = 8;
	private static final int IS_PER    = 9;

	private static boolean isComma = false;
	private static boolean isW     = false;
	private static boolean isWW    = false;

	private static final String sdt[] = {
		"general number", "currency", "fixed", "standard", "percent",
		"scientific", "yes/no", "true/false", "on/off",
		"general date", "long date", "medium date", "short date",
		"long time", "medium time", "short time"
	};

	private static int is_stdformat(String ss) {
		for (int i = 0; i < 16; i++)
		if (sdt[i].equalsIgnoreCase(ss))
			return i;
		return -1;
	}

	private static final String dfn[] = {
		"c", "d", "dd", "ddd", "dddd", "ddddd", "dddddd", "w", "ww",
		"m", "mm", "mmm", "mmmm", "q", "y", "yy", "yyyy", "h", "hh",
		"n", "nn", "s", "ss", "ttttt", "AM/PM", "am/pm", "A/P", "a/p",
		"AMPM", "ampm"
	};

	private static boolean is_numformat(char c){
		return c == '#' || c == '0' || c == '.';
	}

	private static boolean is_datformat(char c,String fm){
	return  c == 'd' || c == 'c' || c == 'w' || c == 'm' || c == 'q' ||
			c == 'y' || c == 'h' || c == 'n' || c == 's' || c == 't' ||
			c == 'D' || c == 'C' || c == 'W' || c == 'M' || c == 'Q' ||
			c == 'Y' || c == 'H' || c == 'N' || c == 'S' || c == 'T' ||
			fm.toLowerCase().startsWith("am/pm") ||
			fm.toLowerCase().startsWith("a/p")   ||
			fm.toLowerCase().startsWith("ampm");
	}

	private static boolean is_strformat(char c) {
		return c == '@' || c == '&' || c == '<' || c == '>' || c == '!';
	}

	public static String FORMAT$(Variant exp) throws HpException {
		return FORMAT(exp).strValue();
	}

	public static String FORMAT$(Variant exp,
						Variant for_mat) throws HpException {
		return FORMAT(exp, for_mat).strValue();
	}

	public static Variant FORMAT(Variant exp) throws HpException {
		return FORMAT(exp, new VString(""));
	}

	public static String FORMAT$(Variant exp, Variant for_mat,
								Variant fdow) throws HpException {
		return FORMAT(exp, for_mat, fdow).strValue();
	}

	public static String FORMAT$(Variant exp, Variant for_mat,
						Variant fdow, Variant fwoy) throws HpException {
		return FORMAT(exp, for_mat, fdow, fwoy).strValue();
	}

	/*Three argument*/
	public static Variant FORMAT(Variant exp, Variant for_mat,
									Variant fdow) throws HpException {
		int ftype = fdow.getType();

		if (for_mat == null)
			return FORMAT(exp);

		switch ( ftype ) {
			case Variant.V_BOL:
				throw new HpException(5, "Invaild procedure call");
			case Variant.V_DBL:
			case Variant.V_LONG:
			case Variant.V_CURR:
			case Variant.V_SINGLE:
			case Variant.V_INT:
			case Variant.V_STR:
				if(ftype == Variant.V_STR)
					if(HpFuncMisc.ISNUMERIC(fdow) == false)
						throw new HpException(13, "Type mismatch");
				double d = fdow.dblValue();
				int in = (int)Math.round(d);
				if ( in>7 || in<0 )
					throw new HpException(5, "Invaild procedure call");
				else {
					String hc = FORMAT(exp, for_mat).strValue();
					if (isW) {
						if (in==0 || in==1)
							return new VString(hc);
						else {
							String isw = hpdatetime.WEEKDAY(exp).strValue();
							int nt = hc.indexOf(isw);
							int ii = hpdatetime.WEEKDAY(exp).intValue();
							int nn = (ii+1-in<=0) ? (ii+1-in+7) : (ii+1-in);
							hc = hc.substring(0,nt).concat(""+nn)
								.concat(hc.substring(nt+1));
							return new VString(hc);
						}
					}
					else return new VString(hc);
				}
			default:
				return FORMAT(exp,for_mat);
		}
	}

	/*Four argument*/
	public static Variant FORMAT(Variant exp, Variant for_mat,
						Variant fdow, Variant fwoy) throws HpException {
		int ftype = fwoy.getType();

		if (for_mat == null && fdow == null)
			return FORMAT(exp);

		switch ( ftype ) {
			case Variant.V_BOL:
				throw new HpException(5, "Invaild procedure call");
			case Variant.V_DBL:
			case Variant.V_LONG:
			case Variant.V_CURR:
			case Variant.V_SINGLE:
			case Variant.V_INT:
			case Variant.V_STR:

				if(ftype == Variant.V_STR)
					if(HpFuncMisc.ISNUMERIC(fdow) == false)
						throw new HpException(13, "Type mismatch");
				int three = (int)Math.round(fdow.dblValue());
				int four = (int)Math.round(fwoy.dblValue());
				int part = 0;

				if ( three>7 || three<0 || four>3 || four<0 )
					throw new HpException(5, "Invaild procedure call");
				else {
					String hcc = FORMAT(exp,for_mat,fdow).strValue();
					if (isWW) {
						HCDateTimeStruct tm = new HCDateTimeStruct();
						HCDateTimeStruct tm1 = new HCDateTimeStruct();
						exp = FORMAT(exp);
						if (!isNumOrDate(exp))
							return FORMAT(exp,for_mat,fdow);
						tm.DT_DblToStruc(exp.dblValue());   /*hope fix*/

						int year = tm.dt_year;
						UdtDatetime  udt = new UdtDatetime();
						int[] standdt =  {1,1,year,0,0,0};
						tm1.DT_DblToStruc(udt.StrToDbl(standdt));

						int first = tm1.dt_week;
						int after = tm.dt_week;
						int xweek = tm.dt_wweek;

						if (four == 0 || four == 1) {
							if (three<=first) {
								if (after<three) part = xweek-1;
								else part = xweek;
							}
							else {
								if (after<three) part = xweek;
								else part = xweek + 1;
							}
						}
						else if (four == 2) {
							if (after<three) part = xweek-1;
							else part = xweek;
						}
						else {
							if (first==1 && (three==0||three==1)) part = xweek;
							else  part = xweek-1;
						}
						int isww = hcc.indexOf(new VInt(tm.dt_wweek).strValue());
						if(part>9)
							hcc = hcc.substring(0,isww).concat(""+part)
								.concat(hcc.substring(isww+2));
						else
							hcc = hcc.substring(0,isww).concat(""+part)
								.concat(hcc.substring(isww+1));
						return new VString(hcc);

					}
					else return new VString(hcc);
				}
			default: return FORMAT(exp,for_mat,fdow);
		}
	}

	public static Variant FORMAT(Variant exp, Variant for_mat) throws HpException
	{
		String  fm = null;
		int  fm_type = for_mat.getType();

		switch ( fm_type ) {
			case Variant.V_NULL:
				throw new HpException(94, "Invalid use of null");
			case Variant.V_STR:
				fm = for_mat.strValue();
				break;
			default :
				throw new HpException(13, "Type mismatch");
		}

		String tmp;
		boolean isEmpty = false;
		int type = exp.getType();

		if (type == Variant.V_NULL)
			return new VString("");
		if (type == Variant.V_EMPTY) {
			tmp = "";
			isEmpty = true;
		}
		else {
			tmp = exp.strValue();
			tmp = parse_express(tmp);
			if (tmp.equals("")) return new VString("");
		}

		if (tmp == "-0") tmp = "0";
		String tmp10 = tmp;

		if(tmp.indexOf(',')!=-1)
		{
			StringBuffer sb33 = new StringBuffer();
			for (int t=0; t<tmp.length(); t++)
			{
				if(tmp.charAt(t)!=',')
				sb33.append(tmp.charAt(t));
			}
			tmp = sb33.toString();
		}

		int i = is_stdformat(fm);
		if (i != -1) {
			if (isNumOrDate(exp)) {
				try {
					switch (i) {

						/**** the perdefined numeric format names ****/
						case Gen_Num:
							return new VString(tmp);
						case Currency:
							return new VString(bracket(tmp));
						case Fixed:
							return new VString(point(tmp));
						case Stand:
							return new VString(point(comma(tmp, null)));
						case Perc:
							return new VString(point(per_Cent(tmp)).concat("%"));
						case Scien:
							return new VString(scien_tific(tmp));
						case Yn:
							if ( new VString(tmp).dblValue() == 0)
								return new VString("No");
							else
								return new VString("Yes");
						case Tf:
							if ( new VString(tmp).dblValue() == 0)
								return new VString("False");
							else
								return new VString("True");
						case Onoff:
							if ( new VString(tmp).dblValue() == 0)
								return new VString("Off");
							else
								return new VString("On");

						/**** the predefined data format names ****/
						case Gen_Dat:
							return new VString(def_dat(new VString(tmp),"c"));
						case L_Dat:
							String s1;
							s1 = WeekDayName(hpdatetime.WEEKDAY(new VString(tmp)), 0, 1);
							s1 = s1 + ", " + month_name(hpdatetime.MONTH(new VString(tmp)).lngValue());
							s1 = s1 + " " + hpdatetime.DAY(new VString(tmp)).strValue();
							s1 = s1 + ", " + hpdatetime.YEAR(new VString(tmp)).strValue();
							return new VString(s1);
						case M_Dat:
							String s2;
							s2 = hpdatetime.DAY(new VString(tmp)).strValue();
							s2 = s2 + "-" + month_name(hpdatetime.MONTH
								(new VString(tmp)).lngValue()).substring(0,3);
							s2 = s2 + "-" + hpdatetime.YEAR(new VString(tmp)).strValue().substring(2,4);
							return new VString(s2);
						case S_Dat:
							String v;
							v = hpdatetime.MONTH(new VString(tmp)).strValue();
							v = v + "/" + hpdatetime.DAY(new VString(tmp)).strValue();
							v = v + "/" + hpdatetime.YEAR(new VString(tmp)).strValue().substring(2,4);
							return new VString(v);
						case L_Tim:
							return new VString(five_t(tmp));
						case M_Tim:
							String s4;
							int hour = hpdatetime.HOUR(new VString(tmp)).intValue();
							if (hour < 12) {
								if (hour == 0 ) hour=12;
								s4 = hour<10 ? ("0"+hour) : (""+hour);
								s4 = s4 + ":" + (hpdatetime.MINUTE(new VString(tmp)).intValue()<10 ? ("0"+hpdatetime.MINUTE(new VString(tmp)).intValue()) : (""+hpdatetime.MINUTE(new VString(tmp)).intValue()));
								s4 = s4 + " AM";
								return new VString(s4);
							}
							else {
								if (hour > 12)
								hour = hour - 12;
								s4 = hour<10 ? ("0"+hour) : (""+hour);
								s4 = s4 + ":" + (hpdatetime.MINUTE(new VString(tmp)).intValue()<10 ? ("0"+hpdatetime.MINUTE(new VString(tmp)).intValue()) : (""+hpdatetime.MINUTE(new VString(tmp)).intValue()));
								s4 = s4 + " PM";
								return new VString(s4);
							}

						case S_Tim:
							String s5;
							int tim = hpdatetime.HOUR(new VString(tmp)).intValue();
							s5 = tim<10 ? ("0"+tim) : (""+tim);
							s5 = s5 + ":" + (hpdatetime.MINUTE(new VString(tmp)).intValue()<10 ? ("0"+hpdatetime.MINUTE(new VString(tmp)).intValue()) : (""+hpdatetime.MINUTE(new VString(tmp)).intValue()));
							return new VString(s5);
					}
				} catch (Exception err3) {;}
			}
			else return exp;
		}
		else
		{
			int m = 0, n = 0, num = 0;
			String str, str1, str2, fmmm = null;
			boolean tflag = false;
			StringBuffer sb = new StringBuffer();

			if(fm.compareTo("")==0) {
				if(type == Variant.V_DATE) {
				    int w = 0;
				    boolean isCha = false;
					if (tmp.indexOf('.') != -1) {
					    for (w = tmp.indexOf('.'); w < tmp.length(); w++) {
					        char cha = tmp.charAt(w);
					        if (cha > '0' && cha <= '9') {
					            isCha = true;
					            break;
					        }
					    }
					}
				    if (tmp.indexOf('.') == -1 || (w == tmp.length() && !isCha)) {
    					if (hpdatetime.YEAR(exp).intValue() >= 1900 && hpdatetime.YEAR(exp).intValue() < 2000) {
            				String v;
            				v = hpdatetime.MONTH(exp).strValue();
            				v = v + "/" + hpdatetime.DAY(exp).strValue();
            				v = v + "/" + hpdatetime.YEAR(exp).strValue().substring(2,4);
            				return new VString(v);
            			}   // ----- Format(Now)
                	}
					return exp;
				}
				else
					return new VString(tmp);
			}
			if(fm.indexOf(';') != -1)
			{
				if(fm.charAt(0) == ';') {
					//if(type == Variant.V_DATE) // Hope to thrash out. 01-22-98
						//return exp;
					if (isNumOrDate(new VString(tmp)))
						return new VString("");
					else return new VString(tmp);
				}
				else {
					String semfm = fm.substring(fm.indexOf(';')+1);
					if(!isEmpty && tmp.charAt(0) == '-')
					{
						if(fm.indexOf(';') == fm.length()-1)
							fm = fm.substring(0, fm.length()-1);
						else {
							if(semfm.indexOf(';') == -1)
								fm = semfm;
							else if(semfm.indexOf(';') == 0)
								fm = fm.substring(0, fm.indexOf(';'));
							else fm = semfm.substring(0, semfm.indexOf(';'));
						}
					}
					else if(isEmpty)
					{
						if(semfm.charAt(0) == ';' && semfm.charAt(1) == ';' && semfm.charAt(2) != ';')
						{
							if(semfm.substring(2).indexOf(';') != -1)
								fm = semfm.substring(2, semfm.substring(2).indexOf(';')+2);
							else fm = semfm.substring(2);
							return new VString(fm);
						}
						else fm = fm.substring(0, fm.indexOf(';'));
					}
					else fm = fm.substring(0,fm.indexOf(';'));
				}
			}
			int index = 0;
			for( ; ; ) {
				index = fm.indexOf('*');
				if(index != -1)
				{
					if(index != fm.length()-1)
						fm = fm.substring(0,index).concat(fm.substring(index+2));
					else fm = fm.substring(0,index);
				}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?