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 + -
显示快捷键?