首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换JScience库中的不同单元类型

转换JScience库中的不同单元类型
EN

Stack Overflow用户
提问于 2017-06-07 16:25:51
回答 0查看 728关注 0票数 1

我正在寻找一种在JScience库中将一种单元类型转换为另一种单元类型的方法。给定每个类型的基本单位之间的因子,我应该能够进行转换。但是看起来JScience对转换并不是很友好,只允许相同基类型的单元之间的转换。

基本上,我正在编写一个饮食应用程序,我需要能够在卡路里、焦耳、千焦耳、克、磅、公斤等之间进行转换。它因大量营养素的值-碳水化合物、蛋白质和脂肪含量-而变得复杂。

示例:

每1克碳水化合物=4卡路里。这相当于4000卡路里,或16.736千焦耳,或16736焦耳(能量的基本单位)。

Carb_Unit定义为: 16736焦耳/克,或16736000焦耳/公斤

给定这个基本值,我应该能够将任何质量单位转换为任何能量单位。但是,JScience不会允许这样做的。有没有一种方法可以告诉转换器返回具有正确转换因子的转换器,而不给出ConversionException?

CustomUnits.java:

代码语言:javascript
复制
public class CustomUnits extends SystemOfUnits {

    /**
     * Holds collection of CustomUnits.
     */
    private static HashSet<Unit<?>> UNITS = new HashSet<Unit<?>>();

    private static <U extends Unit<?>> U customUnits(U unit) {
        UNITS.add(unit);
        return unit;
    }

    @Override
    public Set<Unit<?>> getUnits() {
        return Collections.unmodifiableSet(UNITS);
    }

    public static final Unit<Energy> KILOCALORIE = customUnits(SI.JOULE.times(4184));
    public static final Unit<Energy> KILOJOULE = customUnits(SI.JOULE.times(1000));

    // Food units expressed as energy
    public static final Unit<Energy> CARBOHYDRATE_ENERGY = customUnits(KILOCALORIE.times(4));
    public static final Unit<Energy> PROTEIN_ENERGY = customUnits(KILOCALORIE.times(4));
    public static final Unit<Energy> FAT_ENERGY = customUnits(KILOCALORIE.times(9));

    // Food units expressed as mass
    public static final Unit<Mass> CARBOHYDRATE_MASS = customUnits(SI.GRAM);
    public static final Unit<Mass> PROTEIN_MASS = customUnits(SI.GRAM);
    public static final Unit<Mass> FAT_MASS = customUnits(SI.GRAM);
}

Main.java:

代码语言:javascript
复制
public static void main(String[] args) {

    Amount<?> carbEnergyUnit = Amount.valueOf(1, CustomUnits.CARBOHYDRATE_ENERGY);
    Amount<?> carbEnergyCalorie = carbEnergyUnit.to(CustomUnits.KILOCALORIE);
    Amount<?> carbEnergyKJ = carbEnergyUnit.to(CustomUnits.KILOJOULE);
    Amount<?> carbEnergyJoules = carbEnergyUnit.to(SI.JOULE);

    System.out.println(carbEnergyUnit.getExactValue() + "g of carb");       // 1g of carb
    System.out.println(carbEnergyCalorie.getExactValue() + " Calorie");     // 4 Calorie
    System.out.println(carbEnergyKJ.getEstimatedValue() + " KiloJoules");   // 16.735999999999997 KiloJoules
    System.out.println(carbEnergyJoules.getExactValue() + " Joules");       // 16736 Joules

    // Exception in thread "main" javax.measure.converter.ConversionException: lb is not compatible with J*16736
    UnitConverter toCarb = NonSI.POUND.getConverterTo(CustomUnits.CARBOHYDRATE_ENERGY);
    double result = toCarb.convert(4);
    System.out.println(result);
}
EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44407365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档