package org.solovyev.android.calculator.converter; import android.content.Context; import android.support.annotation.NonNull; import org.solovyev.android.calculator.Named; import jscl.JsclMathEngine; import jscl.NumeralBase; import javax.annotation.Nonnull; import javax.measure.unit.Unit; final class UnitConvertible implements Convertible { @NonNull private final Unit unit; private UnitConvertible(@NonNull Unit unit) { this.unit = unit; } @NonNull static UnitConvertible create(@NonNull Unit unit) { return new UnitConvertible(unit); } @Override public String toString() { return unit.toString(); } @NonNull public String format(double value) { return JsclMathEngine.getInstance().format(value, NumeralBase.dec); } @NonNull @Override public String convert(@NonNull Convertible to, @NonNull String value) { final double from = Converter.parse(value).toDouble(); final double converted = unit.getConverterTo(((UnitConvertible) to).unit).convert(from); return format(converted); } @NonNull @Override public Named<Convertible> named(@Nonnull Context context) { final UnitDimension dimension = UnitDimension.of(unit); if (dimension == null) { return Named.<Convertible>create(this, 0, context); } return Named.<Convertible>create(this, Converter.unitName(unit, dimension), context); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final UnitConvertible that = (UnitConvertible) o; return unit.equals(that.unit); } @Override public int hashCode() { return unit.hashCode(); } }