Как получить коэффициент преобразования для любой единицы измерения - PullRequest
1 голос
/ 22 ноября 2010

Когда вы конвертируете между двумя сущностями, вы обычно делаете это через UnitConverter . Как мне узнать, что такое коэффициент пересчета? Например:

public static final Unit<Length> KILOMETRE = METER.times(1000);
public static final Unit<Length> CENTIMETRE = METRE.divide(100);

Я хотел бы получить коэффициент преобразования программно из интерфейсов преобразователя (например, 1000 ч / б КИЛОМЕТР и МЕТР или 1/100 в случае СЕНТИМЕТРА в МЕТЕР)

Я не уверен, как получить эту информацию из интерфейса UnitConverter.

EDIT1

protected double getConvFactor(Unit<Length> from, Unit<Length> to) {
    double factor = -1;

    UnitConverter unitConverter = from.getConverterTo(to);

    if (unitConverter instanceof MultiplyConverter) {
        MultiplyConverter multiplyConverter = (MultiplyConverter) unitConverter;
        factor = multiplyConverter.getFactor();
    } else if (unitConverter instanceof AddConverter) {
        AddConverter addConverter = (AddConverter) unitConverter;
        factor = addConverter.getOffset();
    } else if (unitConverter instanceof RationalConverter) {
        RationalConverter rationalConverter = (RationalConverter) unitConverter;
        double divisor = rationalConverter.getDivisor().doubleValue();
        double dividend = rationalConverter.getDividend().doubleValue();
        factor = divisor;
    }
}

1 Ответ

4 голосов
/ 22 ноября 2010

Изменить после добавления кода от OP:

UnitConverter является абстрактным классом, поэтому необходимо создать его для создания конвертера для конкретных единиц, которые вы имеете в виду.

Если вы уже используете класс, производный от UnitConverter, вам придется проверить его интерфейс, чтобы убедиться, что разработчик этого класса достаточно хорош, чтобы представить метод, который возвращает коэффициент умножения.

Рассмотрим некоторые классы jscience, полученные из UnitConverter:

  • MultiplyConverter имеет метод getFactor(), который возвращает коэффициент, используемый при преобразовании.
  • AddConverter имеет метод getOffset(), который возвращает смещение, которое преобразователь добавляет в преобразование.
  • RationalConverter, если я правильно понимаю, конвертирует, умножая конвертируемое значение на фактор двух чисел - дивиденд и делитель. В классе есть методы getDividend() и getDivisor() для возврата дивиденда и делителя, так что вы можете выполнить деление самостоятельно, чтобы приблизить частное.

Так что я думаю, что ваш код (ниже) ошибочен. Фактор НЕ делитель, как у вас здесь - это частное.

RationalConverter rationalConverter = (RationalConverter) unitConverter;
double divisor = rationalConverter.getDivisor().doubleValue();
double dividend = rationalConverter.getDividend().doubleValue();
factor = divisor;
...