2010-11-22 2 views
1

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

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

Я хотел бы получить коэффициент преобразования программно из конвертора интерфейсов (т.е. 1000 ч/б километровых и METER или 1/100 в случае сантиметра до METER)

Я не как получить эту информацию из интерфейса 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; 
    } 
} 
+0

есть причина для -ve голосования – Sam

ответ

4

Редактировать после дополнительного кода разместил OP:

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

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

Глядя на некоторые из классов, полученных из jscience UnitConverter:

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

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

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

Большинство единиц, кажется, использует RationalConverter и имеет делитель и дивиденды. В этом случае нет четкого способа определить коэффициент пересчета, так как в зависимости от того, что находится в левой части блока, коэффициент пересчета выбирается из делителя или дивиденда. Не уверен, как четко идентифицировать в этом случае, остальные конвертеры кажутся прекрасными. – Sam

+0

Не могли бы вы опубликовать код для иллюстрации? – razlebe

+0

добавлен код как часть вопроса – Sam

Смежные вопросы