xstring.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 1,170 行 · 第 1/3 页

JAVA
1,170
字号
/* * Copyright 1999-2004 The Apache Software Foundation. * * Licensed 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. *//* * $Id: XString.java,v 1.14 2004/02/17 04:34:38 minchau Exp $ */package com.sun.org.apache.xpath.internal.objects;import java.util.Locale;import com.sun.org.apache.xml.internal.dtm.DTM;import com.sun.org.apache.xml.internal.utils.XMLCharacterRecognizer;import com.sun.org.apache.xml.internal.utils.XMLString;import com.sun.org.apache.xml.internal.utils.XMLStringFactory;import com.sun.org.apache.xpath.internal.ExpressionOwner;import com.sun.org.apache.xpath.internal.XPathContext;import com.sun.org.apache.xpath.internal.XPathVisitor;/** * This class represents an XPath string object, and is capable of * converting the string to other types, such as a number. * @xsl.usage general */public class XString extends XObject implements XMLString{  /** Empty string XString object */  public static XString EMPTYSTRING = new XString("");  /**   * Construct a XString object.  This constructor exists for derived classes.   *   * @param val String object this will wrap.   */  protected XString(Object val)  {    super(val);  }  /**   * Construct a XNodeSet object.   *   * @param val String object this will wrap.   */  public XString(String val)  {    super(val);  }  /**   * Tell that this is a CLASS_STRING.   *   * @return type CLASS_STRING   */  public int getType()  {    return CLASS_STRING;  }  /**   * Given a request type, return the equivalent string.   * For diagnostic purposes.   *   * @return type string "#STRING"   */  public String getTypeString()  {    return "#STRING";  }  /**   * Tell if this object contains a java String object.   *   * @return true if this XMLString can return a string without creating one.   */  public boolean hasString()  {    return true;  }  /**   * Cast result object to a number.   *   * @return 0.0 if this string is null, numeric value of this string   * or NaN   */  public double num()  {    return toDouble();  }  /**   * Convert a string to a double -- Allowed input is in fixed   * notation ddd.fff.   *   * @return A double value representation of the string, or return Double.NaN   * if the string can not be converted.   */  public double toDouble()  {    int end = length();        if(0 == end)      return Double.NaN;    double result = 0.0;    int start = 0;    int punctPos = end-1;    // Scan to first whitespace character.    for (int i = start; i < end; i++)    {      char c = charAt(i);      if (!XMLCharacterRecognizer.isWhiteSpace(c))      {        break;      }      else        start++;    }    double sign = 1.0;    if (start < end && charAt(start) == '-')    {      sign = -1.0;      start++;    }    int digitsFound = 0;    for (int i = start; i < end; i++)  // parse the string from left to right converting the integer part    {      char c = charAt(i);      if (c != '.')      {        if (XMLCharacterRecognizer.isWhiteSpace(c))          break;        else if (Character.isDigit(c))        {          result = result * 10.0 + (c - 0x30);          digitsFound++;        }        else        {          return Double.NaN;        }      }      else      {        punctPos = i;        break;      }    }    if (charAt(punctPos) == '.')  // parse the string from the end to the '.' converting the fractional part    {      double fractPart = 0.0;      for (int i = end - 1; i > punctPos; i--)      {        char c = charAt(i);        if (XMLCharacterRecognizer.isWhiteSpace(c))          break;        else if (Character.isDigit(c))        {          fractPart = fractPart / 10.0 + (c - 0x30);          digitsFound++;        }        else        {          return Double.NaN;        }      }      result += fractPart / 10.0;    }    if (0 == digitsFound)      return Double.NaN;    return result * sign;  }  /**   * Cast result object to a boolean.   *   * @return True if the length of this string object is greater   * than 0.   */  public boolean bool()  {    return str().length() > 0;  }  /**   * Cast result object to a string.   *   * @return The string this wraps or the empty string if null   */  public XMLString xstr()  {    return this;  }  /**   * Cast result object to a string.   *   * @return The string this wraps or the empty string if null   */  public String str()  {    return (null != m_obj) ? ((String) m_obj) : "";  }  /**   * Cast result object to a result tree fragment.   *   * @param support Xpath context to use for the conversion   *   * @return A document fragment with this string as a child node   */  public int rtf(XPathContext support)  {    DTM frag = support.createDocumentFragment();    frag.appendTextChild(str());    return frag.getDocument();  }  /**   * Directly call the   * characters method on the passed ContentHandler for the   * string-value. Multiple calls to the   * ContentHandler's characters methods may well occur for a single call to   * this method.   *   * @param ch A non-null reference to a ContentHandler.   *   * @throws org.xml.sax.SAXException   */  public void dispatchCharactersEvents(org.xml.sax.ContentHandler ch)          throws org.xml.sax.SAXException  {    String str = str();    ch.characters(str.toCharArray(), 0, str.length());  }  /**   * Directly call the   * comment method on the passed LexicalHandler for the   * string-value.   *   * @param lh A non-null reference to a LexicalHandler.   *   * @throws org.xml.sax.SAXException   */  public void dispatchAsComment(org.xml.sax.ext.LexicalHandler lh)          throws org.xml.sax.SAXException  {    String str = str();    lh.comment(str.toCharArray(), 0, str.length());  }  /**   * Returns the length of this string.   *   * @return  the length of the sequence of characters represented by this   *          object.   */  public int length()  {    return str().length();  }  /**   * Returns the character at the specified index. An index ranges   * from <code>0</code> to <code>length() - 1</code>. The first character   * of the sequence is at index <code>0</code>, the next at index   * <code>1</code>, and so on, as for array indexing.   *   * @param      index   the index of the character.   * @return     the character at the specified index of this string.   *             The first character is at index <code>0</code>.   * @exception  IndexOutOfBoundsException  if the <code>index</code>   *             argument is negative or not less than the length of this   *             string.   */  public char charAt(int index)  {    return str().charAt(index);  }  /**   * Copies characters from this string into the destination character   * array.   *   * @param      srcBegin   index of the first character in the string   *                        to copy.   * @param      srcEnd     index after the last character in the string   *                        to copy.   * @param      dst        the destination array.   * @param      dstBegin   the start offset in the destination array.   * @exception IndexOutOfBoundsException If any of the following   *            is true:   *            <ul><li><code>srcBegin</code> is negative.   *            <li><code>srcBegin</code> is greater than <code>srcEnd</code>   *            <li><code>srcEnd</code> is greater than the length of this   *                string   *            <li><code>dstBegin</code> is negative   *            <li><code>dstBegin+(srcEnd-srcBegin)</code> is larger than   *                <code>dst.length</code></ul>   * @exception NullPointerException if <code>dst</code> is <code>null</code>   */  public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)  {    str().getChars(srcBegin, srcEnd, dst, dstBegin);  }  /**   * Tell if two objects are functionally equal.   *   * @param obj2 Object to compare this to   *   * @return true if the two objects are equal   *   * @throws javax.xml.transform.TransformerException   */  public boolean equals(XObject obj2)  {    // In order to handle the 'all' semantics of     // nodeset comparisons, we always call the     // nodeset function.    int t = obj2.getType();    try    {	    if (XObject.CLASS_NODESET == t)	      return obj2.equals(this);	    // If at least one object to be compared is a boolean, then each object 	    // to be compared is converted to a boolean as if by applying the 	    // boolean function. 	    else if(XObject.CLASS_BOOLEAN == t)	    	return obj2.bool() == bool();	    // Otherwise, if at least one object to be compared is a number, then each object 	    // to be compared is converted to a number as if by applying the number function. 	    else if(XObject.CLASS_NUMBER == t)	    	return obj2.num() == num();    }    catch(javax.xml.transform.TransformerException te)    {    	throw new com.sun.org.apache.xml.internal.utils.WrappedRuntimeException(te);    }    // Otherwise, both objects to be compared are converted to strings as     // if by applying the string function.     return xstr().equals(obj2.xstr());  }  /**   * Compares this string to the specified object.   * The result is <code>true</code> if and only if the argument is not   * <code>null</code> and is a <code>String</code> object that represents   * the same sequence of characters as this object.   *

⌨️ 快捷键说明

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