001 package org.shiftone.jrat.util;
002
003
004 import org.shiftone.jrat.util.log.Logger;
005
006 import java.text.DecimalFormat;
007
008
009 /**
010 * @author jeff@shiftone.org (Jeff Drost)
011 */
012 public class Percent extends Number implements Comparable {
013
014 private static final Logger LOG = Logger.getLogger(Percent.class);
015 public static final Percent ZERO = new Percent(0);
016 public static final Percent HUNDRED = new Percent(100);
017 private static DecimalFormat pctDecimalFormat = new DecimalFormat("#,###.0");
018 public static final double POSITIVE_INFINITY = 1.0 / 0.0;
019 public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
020 public static final double NAN = 0.0d / 0.0d;
021 public static final double MAX_VALUE = 1.7976931348623157e+308;
022 public static final double MIN_VALUE = 4.9e-324;
023 private double value;
024
025 public Percent(double value) {
026 this.value = value;
027 }
028
029
030 public Percent(String s) throws NumberFormatException {
031
032 // REMIND: this is inefficient
033 this(valueOf(s).doubleValue());
034 }
035
036
037 public static String toString(double d) {
038 return Double.toString(d);
039 }
040
041
042 public static Percent valueOf(String s) throws NumberFormatException {
043
044 Assert.assertNotNull("string value", s);
045
046 return new Percent(Double.parseDouble(s));
047 }
048
049
050 public static double parseDouble(String s) throws NumberFormatException {
051
052 Assert.assertNotNull("string value", s);
053
054 return Double.parseDouble(s);
055 }
056
057
058 public static boolean isNaN(double v) {
059 return (v != v);
060 }
061
062
063 public static boolean isInfinite(double v) {
064 return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
065 }
066
067
068 public boolean isNaN() {
069 return isNaN(value);
070 }
071
072
073 public boolean isInfinite() {
074 return isInfinite(value);
075 }
076
077
078 public String toString() {
079
080 synchronized (pctDecimalFormat) {
081 return pctDecimalFormat.format(value);
082 }
083
084 // return String.valueOf(value);
085 }
086
087
088 public byte byteValue() {
089 return (byte) value;
090 }
091
092
093 public short shortValue() {
094 return (short) value;
095 }
096
097
098 public int intValue() {
099 return (int) value;
100 }
101
102
103 public long longValue() {
104 return (long) value;
105 }
106
107
108 public float floatValue() {
109 return (float) value;
110 }
111
112
113 public double doubleValue() {
114 return (double) value;
115 }
116
117
118 public int hashCode() {
119
120 long bits = Double.doubleToLongBits(value);
121
122 return (int) (bits ^ (bits >>> 32));
123 }
124
125
126 public boolean equals(Object obj) {
127 return ((obj instanceof Number) && ((((Number) obj).doubleValue()) == value));
128 }
129
130
131 public int compareTo(Percent anotherPercent) {
132
133 Assert.assertNotNull("anotherPercent", anotherPercent);
134
135 Double me = new Double(value);
136 Double other = new Double(anotherPercent.value);
137
138 return me.compareTo(other);
139 }
140
141
142 public int compareTo(Object o) {
143 return compareTo((Percent) o);
144 }
145 }