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