2010-11-22 4 views
1

Lorsque vous convertissez entre 2 entités, vous le faites généralement via le UnitConverter. Comment devrais-je savoir quel est le facteur de conversion? Par exemple:Comment récupérer le facteur de conversion pour une conversion d'unité

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

Je voudrais obtenir le facteur de conversion par programmation à partir des interfaces de conversion (soit 1000 b/w kilométriques et mètre ou 1/100 en cas de centimétrique COMPTEUR)

Je ne suis pas Assurez-vous de récupérer ces informations dans l'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; 
    } 
} 
+0

est-il une raison pour le vote -ve – Sam

Répondre

4

Modifier après un nouveau Code publié par OP:

UnitConverter est une classe abstraite, donc il faut en tirer pour créer un convertisseur pour les unités spécifiques que vous avez à l'esprit.

Si vous utilisez déjà une classe dérivée de UnitConverter, vous devrez vérifier son interface pour voir si le concepteur de cette classe a été assez bon pour exposer une méthode qui renvoie le facteur de multiplication.

regardant certaines des classes de dérivés de jscience UnitConverter:

  • MultiplyConverter présente une méthode getFactor() qui renvoie le facteur utilisé dans la conversion.
  • AddConverter a une méthode getOffset() qui renvoie le décalage que le convertisseur ajoute à la conversion.
  • RationalConverter, si je comprends bien, convertit en multipliant la valeur en cours de conversion par le quotient de deux nombres - le dividende et le diviseur. La classe a des méthodes, getDividend() et getDivisor() pour retourner le dividende et le diviseur, de sorte que vous pourriez effectuer la division vous-même pour approximer le quotient.

Donc je pense que votre code (ci-dessous) est en erreur. Le facteur n'est pas le diviseur, comme vous avez ici - c'est le quotient.

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

La plupart des unités semblent être en utilisant le RationalConverter et il a un diviseur et un dividende. Il n'y a pas de moyen clair d'identifier le facteur de conversion dans ce cas, car en fonction de l'unité de gauche, le facteur de conversion est récupéré du diviseur ou du dividende. Je ne sais pas comment identifier clairement dans ce cas, le reste des convertisseurs semblent être bien. – Sam

+0

Pourriez-vous poster un code pour illustrer? – razlebe

+0

ajouté le code dans le cadre de la question – Sam