floatdv.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 242 行

JAVA
242
字号
/* * The Apache Software License, Version 1.1 * * * Copyright (c) 2001-2003 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 "Xerces" 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) 2001, International * Business Machines, Inc., http://www.apache.org.  For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */package com.sun.org.apache.xerces.internal.impl.dv.xs;import com.sun.org.apache.xerces.internal.impl.dv.InvalidDatatypeValueException;import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;/** * Represent the schema type "float" * * @author Neeraj Bajaj, Sun Microsystems, inc. * @author Sandy Gao, IBM * * @version $Id: FloatDV.java,v 1.6 2003/02/17 13:45:57 sandygao Exp $ */public class FloatDV extends TypeValidator {    public short getAllowedFacets(){        return ( XSSimpleTypeDecl.FACET_PATTERN | XSSimpleTypeDecl.FACET_WHITESPACE | XSSimpleTypeDecl.FACET_ENUMERATION |XSSimpleTypeDecl.FACET_MAXINCLUSIVE |XSSimpleTypeDecl.FACET_MININCLUSIVE | XSSimpleTypeDecl.FACET_MAXEXCLUSIVE  | XSSimpleTypeDecl.FACET_MINEXCLUSIVE  );    }//getAllowedFacets()    //convert a String to Float form, we have to take care of cases specified in spec like INF, -INF and NaN    public Object getActualValue(String content, ValidationContext context) throws InvalidDatatypeValueException {        try{            return new XFloat(content);        } catch (NumberFormatException ex){            throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.1", new Object[]{content, "float"});        }    }//getActualValue()    // Can't call Float#compareTo method, because it's introduced in jdk 1.2    public int compare(Object value1, Object value2){        return ((XFloat)value1).compareTo((XFloat)value2);    }//compare()    private static final class XFloat {        private float value;        public XFloat(String s) throws NumberFormatException {            try {                value = Float.parseFloat(s);            }            catch ( NumberFormatException nfe ) {                if ( s.equals("INF") ) {                    value = Float.POSITIVE_INFINITY;                }                else if ( s.equals("-INF") ) {                    value = Float.NEGATIVE_INFINITY;                }                else if ( s.equals("NaN" ) ) {                    value = Float.NaN;                }                else {                    throw nfe;                }            }        }        public boolean equals(Object val) {            if (val == this)                return true;            if (!(val instanceof XFloat))                return false;            XFloat oval = (XFloat)val;            // NOTE: we don't distinguish 0.0 from -0.0            if (value == oval.value)                return true;            if (value != value && oval.value != oval.value)                return true;            return false;        }        private int compareTo(XFloat val) {            float oval = val.value;            // this < other            if (value < oval)                return -1;            // this > other            if (value > oval)                return 1;            // this == other            // NOTE: we don't distinguish 0.0 from -0.0            if (value == oval)                return 0;            // one of the 2 values or both is/are NaN(s)                        if (value != value) {                // this = NaN = other                if (oval != oval)                    return 0;                // this is NaN <> other                return INDETERMINATE;            }            // other is NaN <> this            return INDETERMINATE;        }        private String canonical;        public synchronized String toString() {            if (canonical == null) {                if (value == Float.POSITIVE_INFINITY)                    canonical = "INF";                else if (value == Float.NEGATIVE_INFINITY)                    canonical = "-INF";                else if (value != value)                    canonical = "NaN";                // NOTE: we don't distinguish 0.0 from -0.0                else if (value == 0)                    canonical = "0.0E1";                else {                    // REVISIT: use the java algorithm for now, because we                    // don't know what to output for 1.1f (which is no                    // actually 1.1)                    canonical = Float.toString(value);                    // if it contains 'E', then it should be a valid schema                    // canonical representation                    if (canonical.indexOf('E') == -1) {                        int len = canonical.length();                        // at most 3 longer: E, -, 9                        char[] chars = new char[len+3];                        canonical.getChars(0, len, chars, 0);                        // expected decimal point position                        int edp = chars[0] == '-' ? 2 : 1;                        // for non-zero integer part                        if (value >= 1 || value <= -1) {                            // decimal point position                            int dp = canonical.indexOf('.');                            // move the digits: ddd.d --> d.ddd                            for (int i = dp; i > edp; i--) {                                chars[i] = chars[i-1];                            }                            chars[edp] = '.';                            // trim trailing zeros: d00.0 --> d.000 --> d.                            while (chars[len-1] == '0')                                len--;                            // add the last zero if necessary: d. --> d.0                            if (chars[len-1] == '.')                                len++;                            // append E: d.dd --> d.ddE                            chars[len++] = 'E';                            // how far we shifted the decimal point                            int shift = dp - edp;                            // append the exponent --> d.ddEd                            // the exponent is at most 7                            chars[len++] = (char)(shift + '0');                        }                        else {                            // non-zero digit point                            int nzp = edp + 1;                            // skip zeros: 0.003                            while (chars[nzp] == '0')                                nzp++;                            // put the first non-zero digit to the left of '.'                            chars[edp-1] = chars[nzp];                            chars[edp] = '.';                            // move other digits (non-zero) to the right of '.'                            for (int i = nzp+1, j = edp+1; i < len; i++, j++)                                chars[j] = chars[i];                            // adjust the length                            len -= nzp - edp;                            // append 0 if nessary: 0.03 --> 3. --> 3.0                            if (len == edp + 1)                                chars[len++] = '0';                            // append E-: d.dd --> d.ddE-                            chars[len++] = 'E';                            chars[len++] = '-';                            // how far we shifted the decimal point                            int shift = nzp - edp;                            // append the exponent --> d.ddEd                            // the exponent is at most 3                            chars[len++] = (char)(shift + '0');                        }                        canonical = new String(chars, 0, len);                    }                }            }            return canonical;        }    }} // class FloatDV

⌨️ 快捷键说明

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