hpstring.java

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

JAVA
2,075
字号
    {
        int type = varstr.getType();
        if( type == Variant.V_NULL)
            return new VNull();
        else
        {
        	String     s = RIGHT$(varstr, varlen);
        	return new VString(s);
        }
    }

    /**
     *StrComp(string1, string2[, compare])
     *if string1 is less than string2 return -1,if string1 is equal to string2
     *return 0,if string1 is greater than string2 return 1,if string1 or string2 is
     *Null return Null.
     *string1,string2 is any valid string expression
     *compare	Specifies the type of string comparison.  The compare argument can
                be omitted, it can be 0 or 1, or it can be the value of the
                CollatingOrder property of a Field object.  Specify 0 (default) to
                perform a binary comparison.  Specify 1 to perform a textual
                comparison.  Specify the return value of the CollatingOrder property
                if you want to sort or compare values from a database in the same
                way the database itself would.  If compare is Null, an error occurs.
                If compare is omitted, the Option Compare setting determines the
                type of comparison.
     */
    public static Variant STRCOMP(Variant  varstr1, Variant varstr2) throws HpException
    {
        String   str1, str2;
        short    rs ;

        int type1 = varstr1.getType();
        if( type1==Variant.V_NULL )
            return new VNull();
        else
            str1 = get_str( varstr1);


        int type2 = varstr2.getType();
        if( type2==Variant.V_NULL )
            return new VNull();
        else
            str2 = get_str( varstr2);

        rs = (short)str1.compareTo(str2) ;

        if(rs>0)
            rs = 1;
        else if( rs<0)
            rs = -1;

        return new VInt(rs);
    }

    /*--- FUNCTION: StrComp(string1,string2,compare) ---*/
    public static Variant STRCOMP(Variant varstr1, Variant varstr2, Variant varcompare)
	    throws HpException
    {
    	String  str1,str2;
    	short   result=0 ;
		int     type1, type2;

    	type1 = varstr1.getType();
    	if( type1==Variant.V_NULL )
    	    return new VNull();
    	else
    	{
        	str1 = get_str( varstr1);
        }

    	type2 = varstr2.getType();
    	if( type2==Variant.V_NULL )
    	    return new VNull();
    	else
    	{
        	str2 = get_str( varstr2);
        }

    	int  compare = dbl2int( get_db(varcompare) );
    	if( compare == 0 )
    	{
            result = (short)str1.compareTo(str2);

    	    if(result>0)
    	        result = 1;
    	    else if( result<0)
    	        result = -1;
    	}
    	else if( compare==1 )
    	{
            str1 = str1.toLowerCase();
            str2 = str2.toLowerCase();

            result = (short)str1.compareTo(str2);
            if(result>0)
                result = 1;
            else if( result<0)
                result = -1;
    	}
    	else
    	    throw new HpException( 95,"Invalid procedure call");

    	return new VInt(result);
    }

    /**
     *String[$](number, character)
     *Returns a repeating character string of the length specified. String$()
     *return a string,String() return a variant string.
     *number	Length of the returned string.  If number contains Null, Null is
                returned.
     *character	Character code specifying the character or string expression whose
                first character is used to build the return string.  If character
                contains Null, Null is returned.if number for character greater than
                255,String converts the number to a valid character code using the
                formula: character Mod 256
     */
    public static String STRING$(Variant varnumber, Variant varstr) throws HpException
    {
        StringBuffer          st=null;
        String                str;
        int                   charcode=0;
        int number = dbl2int ( get_db(varnumber) );
        if (number < 0 || number >=2147483647)
            throw new HpException(95,"Invalid procedure call");

        int  type = varstr.getType();   
        switch( type )
        {
	        case Variant.V_OBJ:
	        //    Wrapper  obj = varstr.getObject();
	        //    if( obj==null )
            //        throw new HpException( 91, "Object variable or With block variable not set");
	            charcode = ((VObject)varstr).intValue();
	            break;

    	    case Variant.V_BOL:
    	    case Variant.V_BYTE:
    	    case Variant.V_INT:
	        case Variant.V_LONG:
	        case Variant.V_SINGLE:
	        case Variant.V_DBL:
	        case Variant.V_CURR:
	        case Variant.V_DATE:
	            charcode = (int)Math.round( varstr.dblValue() );
	        break;

    	    case Variant.V_FIX_STR:
            fixedString  fix_str = ((VString)varstr).getfixedLenStrValue();
            str = fix_str.strValue();
    	    if (number < 0 || str == null)
    		    throw new HpException(8, "Illegal function call");
    	    if (number > 2147483647)
    		    throw new HpException(14, "Out of string space");

    	    if (number == 0 || str.length() == 0 )
    	    {
    		    st = new StringBuffer("");
    	    }
    	    else
    	    {
    		    st = new StringBuffer(number);
    		    for (int i = 0; i < number; i++)
    		        st.append(str.charAt(0));
    	    }
            break;


            case Variant.V_EMPTY:
    	    case Variant.V_STR:
        	    str = varstr.strValue();
        	    if (number < 0 || str == null)
        		    throw new HpException(8, "Illegal function call");
        	    if (number > 2147483647)
        		    throw new HpException(14, "Out of string space");

        	    if (number == 0 || str.length() == 0 )
        	    {
        		    st = new StringBuffer("");
        	    }
        	    else
        	    {
        		    st = new StringBuffer(number);
        		    for (int i = 0; i < number; i++)
        		    st.append(str.charAt(0));
        	    }
    	    break;

           	case Variant.V_NULL:
    	    	throw new HpException(94, "Invalid use of null");

    	    default:
    		    throw new HpException(13,"Type mismatch");

    	} //end of switch

        if( type!=Variant.V_STR  && type!=Variant.V_FIX_STR && type!=Variant.V_EMPTY)
        {
            int    code=0;
            char   chr;
            if(charcode > 32767 || charcode < -32768)
                throw new HpException(6, "Overflow");

            if (charcode >= 0)
            	code = charcode % 256;
            else
            	code = 256 - Math.abs(charcode);

            chr = (char)code;
            if (number == 0)
        	{
        	    st = new StringBuffer("");
            }
            else
            {
            	st = new StringBuffer(number);
            	for (int i = 0; i < number; i++)
            		st.append(chr);

        	}
        } // end of type!=Variant.V_STR || Variant.V_NULL
        return  st.toString();
    }

    /*--- FUNCTION: String(long,string) ---*/
    public static Variant STRING(Variant varnumber, Variant varstr) throws HpException
    {
        if( varstr.getType()==Variant.V_NULL )
            return new VNull();
        else    
            return new VString( STRING$(varnumber,varstr) );
    }

    /**
     *Mid(stringvar, start[, length]) = string
     *Replaces a specified number of characters in a string variable with characters
      from another string.
     *stringvar	Name of string variable to modify.
     *start	    Character position in stringvar where the replacement of text begins.
     *length	Number of characters to replace.  If omitted, all of string is used.
     *string	String expression that replaces part of stringvar.
     *Remarks
        The number of characters replaced is always less than or equal to the number
        of characters in stringvar.
     *Note
        MidB(stringvar, start[, length]) = string is provided for use with byte data
        contained in a string. In the MidB statement, start specifies the byte
        position within stringvar where replacement begins and length specifies the
        numbers of bytes to replace.
     */
    public static void SMID( Variant string, Variant varstart, Variant  replacestr)
    throws HpException
    {
        String   str , repstr,result="";
        int      pos,str_len, repstr_len;
        str = get_str(string);
        if( str.compareTo("")==0 )
            throw new HpException( 95,"Invalid procedure call");

        str_len = str.length();
        repstr = get_str(replacestr);
        if( repstr==null )
            throw new HpException(94, "Invalid use of null");

        repstr_len = repstr.length();

        pos = (int)Math.round( varstart.dblValue() );
        if( pos<=0 || pos>str_len)
            throw new HpException(95,"Invalid procedure call");

        if( repstr_len>=str_len )
            result = str.substring(0,pos-1) + repstr.substring(0, str_len-pos+1 );
        else
        {
            int total_len = pos + repstr_len;
            if( total_len-1<=str_len )
                result = str.substring(0,pos-1) +  repstr + str.substring( pos-1 + repstr_len );
            else
                result = str.substring(0,pos-1) + repstr.substring(0,total_len-str_len-1 );
        }

        //string.setVariantStr(result);
        //string.setVariantType(Variant.V_STR );
    }

    /*--- STATEMENT: Mid( string, start,length,replacestr ) ---*/
    public static void SMID( Variant string,  Variant start,Variant leng,
    Variant  replacestr ) throws HpException
    {
        String   str , repstr,result="";
        int      pos,str_len, repstr_len, len , total_len;

        str = get_str(string);
        str_len = str.length();
        repstr = get_str(replacestr);
        repstr_len = repstr.length();

        pos = dbl2int( get_db(start) );
        if( pos<=0 || pos>str_len)
            throw new HpException(95,"Invalid procedure call");

        len = dbl2int( get_db(leng) );
        if( len<0 )
            throw new HpException(95,"Invalid procedure call");
        if(pos<=0 || pos>str_len )
            throw new HpException( 95, "Invalid procedure call");

        if( repstr_len>=str_len )
        {
            if( len>=repstr_len )
                result = repstr.substring(0, str_len);
            else
            {
                repstr = repstr.substring(0,len);
                repstr_len = repstr.length();
                if( repstr_len>=str_len )
                    result = repstr.substring(0, str_len);
                else
                {
                    total_len = pos + repstr_len;
                    if( total_len-1<=str_len )
                        result = str.substring(0,pos-1) +  repstr + str.substring( pos-1 + repstr_len );
                    else
                        result = str.substring(0,pos-1) + repstr.substring(0,total_len-str_len-1 );
                }
            }
        }
        else
        {
            if( len<repstr_len )
            {
                repstr = repstr.substring(0, len);
                repstr_len = repstr.length();
            }

            total_len = pos + repstr_len;
            if( total_len-1<=str_len )
                result = str.substring(0,pos-1) +  repstr + str.substring( pos-1 + repstr_len );
            else
                result = str.substring(0,pos-1) + repstr.substring(0,total_len-str_len-1 );
        }

        //string.setVariantStr(result);
        //string.setVariantType(Variant.V_STR );
    }

    /**
     *LSet stringvar = string
     *LSet varname1 = varname2
     *Left aligns a string within a string variable, or copies a variable of one
     *user-defined type to another variable of a different user-defined type.
     *stringvar	Name of string variable.
     *string	String expression to be left-aligned within stringvar.
     *varname1	Variable name of the user-defined type being copied to.
     *varname2	Variable name of the user-defined type being copied from.
     */
    public static void LSET(Variant varstr1, Variant  varstr2) throws HpException
    {
    	String      s="",str1 ,str2;
    	Variant      Variant = new Variant();

    	str1 = get_str( varstr1);
    	str2 = get_str( varstr2);
    	if( str2.length() < str1.length() )
    	{
        	s = str2;
    	    for( int i =str2.length(); i<str1.length(); i++ )
        		s = s+" ";// add space.
    	}
    	else
    	    s = str2.substring(0,str1.length());

        //varstr1.setVariantStr(s);
        //varstr1.setVariantType(Variant.V_STR );
	}

    /*
     *RSet stringvar = string
     *Right aligns a string within a string variable.
     *stringvar	Name of string variable.
     *string	String expression to be right-aligned within stringvar.
     *Remarks
        RSet replaces any leftover characters in stringvar with spaces, back to its
        beginning. RSet can't be used with user-defined types.
    */
    public static void  RSET(Variant varstr1, Variant varstr2) throws HpException
    {
        String   str1,str2,s = "";
        str1 = get_str( varstr1);
        str2 = get_str( varstr2);

        if( str2.length() < str1.length() )
        {
            for( int i=0; i<str1.length()-str2.length()-1; i++)
    	    s = s + " ";
            s = s + str2 ;
        }
        else
            s = str2.substring(0,str1.length() );

        //varstr1.setVariantStr(s);
        //varstr1.setVariantType(Variant.V_STR );
	}

    /**
     *InStr([start, ]string1, string2[, compare])
     *return value
         if string1 is zero-length	return 0, if string1 is Null return	Null,if string2
         is zero-length return start,if string2 is Null return	Null,if string2 is not
         found	return 0,if string2 is found within string1 return Position at which
         match is found,if start > string2	return 0
     *start	 Numeric expression that sets the starting position for each search. If
             omitted,search begins at the first character position. If start contains
             Null, an error occurs.  The start argument is required if compare is

⌨️ 快捷键说明

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