Pergunta

Quando você converte entre 2 entidades, geralmente faz isso através do Conversor de unidades. Como devo descobrir qual é o fator de conversão? Por exemplo:

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

Eu gostaria de obter o fator de conversão programaticamente das interfaces do conversor (por exemplo, 1000 b/p quilômetro e medidor ou 1/100 no caso de centímetro a medidor)

Não tenho certeza de como buscar essas informações da interface 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;
    }
}
Foi útil?

Solução

Editar após mais código postado por OP:

UnitConverter é uma classe abstrata, portanto, é preciso derivar dela para criar um conversor para as unidades específicas que você tem em mente.

Se você já está usando uma classe derivada de UnitConverter, você terá que verificar a interface para ver se o designer dessa classe era bom o suficiente para expor um método que retorna o fator de multiplicação.

Olhando para algumas das classes de jscience derivadas de UnitConverter:

  • MultiplyConverter tem um getFactor() Método que retorna o fator usado na conversão.
  • AddConverter tem um getOffset() Método que retorna o deslocamento que o conversor adiciona na conversão.
  • RationalConverter, se entendi corretamente, converte multiplicando o valor que está sendo convertido pelo quociente de dois números - o dividendo e o divisor. A classe tem métodos, getDividend() e getDivisor() Para devolver o dividendo e o divisor, para que você possa executar a divisão para aproximar o quociente.

Então eu acho que seu código (abaixo) está errado. O fator não é o divisor, como você tem aqui - é o quociente.

RationalConverter rationalConverter = (RationalConverter) unitConverter;
double divisor = rationalConverter.getDivisor().doubleValue();
double dividend = rationalConverter.getDividend().doubleValue();
factor = divisor;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top