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