/* * @(#)$Id: DoubleType.java,v 1.18 2001/11/27 01:54:52 kk122374 Exp $ * * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved. * * This software is the proprietary information of Sun Microsystems, Inc. * Use is subject to license terms. * */ package com.sun.msv.datatype.xsd; import org.relaxng.datatype.ValidationContext; import com.sun.msv.datatype.SerializationContext; /** * "double" type. * * type of the value object is <code>java.lang.Double</code>. * See http://www.w3.org/TR/xmlschema-2/#double for the spec * * @author <a href="mailto:kohsuke.kawaguchi@eng.sun.com">Kohsuke KAWAGUCHI</a> */ public class DoubleType extends FloatingNumberType { public static final DoubleType theInstance = new DoubleType(); private DoubleType() { super("double"); } final public XSDatatype getBaseType() { return SimpleURType.theInstance; } public Object _createValue( String lexicalValue, ValidationContext context ) { return load(lexicalValue); } public static Double load( String lexicalValue ) { // TODO : probably the same problems exist as in the case of float try { if(lexicalValue.equals("NaN")) return new Double(Double.NaN); if(lexicalValue.equals("INF")) return new Double(Double.POSITIVE_INFINITY); if(lexicalValue.equals("-INF")) return new Double(Double.NEGATIVE_INFINITY); if(lexicalValue.length()==0 || !isDigitOrPeriodOrSign(lexicalValue.charAt(0)) || !isDigitOrPeriodOrSign(lexicalValue.charAt(lexicalValue.length()-1)) ) return null; // these screening process is necessary due to the wobble of Float.valueOf method return Double.valueOf(lexicalValue); } catch( NumberFormatException e ) { return null; } } public String convertToLexicalValue( Object value, SerializationContext context ) { if(!(value instanceof Double )) throw new IllegalArgumentException(); return save((Double)value); } public static String save( Double value ) { double v = value.doubleValue(); if( v==Double.NaN ) return "NaN"; if( v==Double.POSITIVE_INFINITY ) return "INF"; if( v==Double.NEGATIVE_INFINITY ) return "-INF"; return value.toString(); } public Class getJavaObjectType() { return Double.class; } }