package hudson.plugins.emma;
import java.io.IOException;
import java.io.Serializable;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
/**
* Represents <tt>x/y</tt> where x={@link #numerator} and y={@link #denominator}.
*
* @author Kohsuke Kawaguchi
*/
@ExportedBean
final public class Ratio implements Serializable {
private float numerator = 0;
private float denominator = 0;
boolean initialized = false;
public Ratio(float...f) {
if (f.length >=2 ) {
initialized = true;
this.numerator = f[0];
this.denominator = f[1];
}
}
public float getNumerator() {
return numerator;
}
public float getDenominator() {
return denominator;
}
/**
* Gets "x/y" representation.
*/
public String toString() {
return print(numerator)+"/"+print(denominator);
}
private String print(float f) {
int i = (int) f;
if(i==f)
return String.valueOf(i);
else
return String.valueOf(f);
}
/**
* Gets the percentage in integer.
*/
@Exported
public int getPercentage() {
return Math.round(getPercentageFloat());
}
/**
* Gets the percentage in float.
*/
@Exported
public float getPercentageFloat() {
return denominator<=0? 0: 100*numerator/denominator;
}
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Ratio ratio = (Ratio) o;
return Float.compare(ratio.denominator, denominator)==0
&& Float.compare(ratio.numerator, numerator)==0;
}
public int hashCode() {
int result;
result = numerator != +0.0f ? Float.floatToIntBits(numerator) : 0;
result = 31 * result + denominator != +0.0f ? Float.floatToIntBits(denominator) : 0;
return result;
}
public void addValue(String v) {
float[] f = parse(v);
numerator += f[0];
denominator += f[1];
initialized = true;
}
public boolean isInitialized() {
return initialized;
}
/**
* Parses the value attribute format of EMMA "52% (52/100)".
*/
static float[] parse(String v) {
// if only I could use java.util.Scanner...
// only leave "a/b" in "N% (a/b)"
int idx = v.indexOf('(');
v = v.substring(idx+1,v.length()-1);
idx = v.indexOf('/');
return new float[]{ parseFloat(v.substring(0,idx)), parseFloat(v.substring(idx+1)) };
}
static Ratio parseValue(String v) throws IOException {
return new Ratio(parse(v));
}
/**
* Parses the float value stored in a string. Uses simple heuristics to
* handle comma or dot as a decimal point.
*/
private static float parseFloat(String v) {
int idx = v.indexOf(',');
if (idx >= 0) {
v = v.substring(0, idx) + "." + v.substring(idx+1);
}
return Float.parseFloat(v);
}
private static final long serialVersionUID = 1L;
}