001 package com.thaiopensource.datatype.xsd;
002
003 import org.relaxng.datatype.ValidationContext;
004
005 class DoubleDatatype extends DatatypeBase implements OrderRelation {
006
007 boolean lexicallyAllows(String str) {
008 if (str.equals("INF") || str.equals("-INF") || str.equals("NaN"))
009 return true;
010 int len = str.length();
011 boolean hadSign = false;
012 boolean hadDecimalPoint = false;
013 boolean hadDigit = false;
014 boolean hadE = false;
015 for (int i = 0; i < len; i++) {
016 switch (str.charAt(i)) {
017 case '+':
018 case '-':
019 if (hadDigit || hadDecimalPoint || hadSign)
020 return false;
021 hadSign = true;
022 break;
023 case '0':
024 case '1':
025 case '2':
026 case '3':
027 case '4':
028 case '5':
029 case '6':
030 case '7':
031 case '8':
032 case '9':
033 hadDigit = true;
034 break;
035 case 'e':
036 case 'E':
037 if (hadE || !hadDigit)
038 return false;
039 hadDigit = false;
040 hadE = true;
041 hadSign = false;
042 hadDecimalPoint = false;
043 break;
044 case '.':
045 if (hadDecimalPoint || hadE)
046 return false;
047 hadDecimalPoint = true;
048 break;
049 default:
050 return false;
051 }
052 }
053 return hadDigit;
054 }
055
056 Object getValue(String str, ValidationContext vc) {
057 if (str.equals("INF"))
058 return new Double(Double.POSITIVE_INFINITY);
059 if (str.equals("-INF"))
060 return new Double(Double.NEGATIVE_INFINITY);
061 if (str.equals("NaN"))
062 return new Double(Double.NaN);
063 return new Double(str);
064 }
065
066 OrderRelation getOrderRelation() {
067 return this;
068 }
069
070 public boolean isLessThan(Object obj1, Object obj2) {
071 return ((Double)obj1).doubleValue() < ((Double)obj2).doubleValue();
072 }
073
074 public boolean sameValue(Object value1, Object value2) {
075 double d1 = ((Double)value1).doubleValue();
076 double d2 = ((Double)value2).doubleValue();
077 // NaN = NaN
078 return d1 == d2 || (d1 != d1 && d2 != d2);
079 }
080 }