Как получить коэффициент преобразования для любой единицы измерения

Когда вы конвертируете между двумя сущностями, вы обычно делаете это через 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 ответ

Решение

Отредактируйте после добавления кода, опубликованного 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;
Другие вопросы по тегам