xstring.java

来自「java jdk 1.4的源码」· Java 代码 · 共 1,212 行 · 第 1/3 页

JAVA
1,212
字号
/* * The Apache Software License, Version 1.1 * * * Copyright (c) 1999 The Apache Software Foundation.  All rights  * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * 3. The end-user documentation included with the redistribution, *    if any, must include the following acknowledgment:   *       "This product includes software developed by the *        Apache Software Foundation (http://www.apache.org/)." *    Alternately, this acknowledgment may appear in the software itself, *    if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xalan" and "Apache Software Foundation" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written  *    permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", *    nor may "Apache" appear in their name, without prior written *    permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 1999, Lotus * Development Corporation., http://www.lotus.com.  For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */package org.apache.xpath.objects;//import org.w3c.dom.*;import java.util.Locale;import org.apache.xml.dtm.DTM;import org.apache.xml.utils.XMLCharacterRecognizer;import org.apache.xml.utils.XMLString;import org.apache.xml.utils.XMLStringFactory;import org.apache.xpath.ExpressionOwner;import org.apache.xpath.XPathContext;import org.apache.xpath.XPathVisitor;import org.xml.sax.ContentHandler;import org.xml.sax.SAXException;import org.xml.sax.ext.LexicalHandler;/** * <meta name="usage" content="general"/> * This class represents an XPath string object, and is capable of * converting the string to other types, such as a number. */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    {

⌨️ 快捷键说明

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