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 midpcalc.Real; import java.math.BigInteger; public class NumeralBaseConvertible implements Convertible { @NonNull private final NumeralBase base; @NonNull private final JsclMathEngine mathEngine = JsclMathEngine.getInstance(); public NumeralBaseConvertible(@NonNull NumeralBase base) { this.base = base; } @NonNull @Override public String convert(@NonNull Convertible to, @NonNull String value) throws NumberFormatException { final NumeralBase baseTo = ((NumeralBaseConvertible) to).base; final Real real = Converter.parse(value, base.radix); if (real.isIntegral()) { final long l = real.toLong(); if (l != Long.MAX_VALUE && l != -Long.MAX_VALUE) { return mathEngine.format(BigInteger.valueOf(l), baseTo); } } return mathEngine.format(real.toDouble(), baseTo); } @NonNull @Override public Named<Convertible> named(@NonNull Context context) { return Named.<Convertible>create(this, base.name()); } }