转换 JScience 库中的不同单位类型
Converting different unit types in JScience library
我正在 JScience 库中寻找一种将一种单位类型转换为另一种单位类型的方法。给定每种类型的基本单位之间的一个因素,我应该能够转换。但是好像JScience对转换不是很好,只允许相同基类型的单位之间的转换。
基本上,我正在编写一个饮食应用程序,我需要能够在卡路里、焦耳、千焦耳、克、磅、千克等之间进行转换。宏量营养素值(碳水化合物、蛋白质、和脂肪含量。
示例:
每 1 克碳水化合物 = 4 卡路里。那是 4000 卡路里,或 16.736 千焦耳,或 16736 焦耳(能量的基本单位)。
Carb_Unit则定义为:16736joules/gram,或16736000焦耳/千克
鉴于此基础值,我应该能够从任何质量单位转换为任何能量单位。但同样,JScience 不允许这样做。有没有办法告诉转换器 return 一个具有正确转换因子的转换器而不给出 ConversionException?
CustomUnits.java:
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:
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);
}
看起来 JScience
发现您试图将 Unit<Mass>
转换为 Unit<Energy>
,这在默认 PhysicalModel
中是被禁止的。
另一种方法是为 FoodEnergy
的各种单位创建一个新的 Quantity
:
public static final Unit<Energy> KILOCALORIE = SI.JOULE.times(4184);
public interface FoodEnergy extends Quantity {
public final static Unit<FoodEnergy> UNIT
= (Unit<FoodEnergy>) SI.GRAM.times(KILOCALORIE);
}
private static final Unit<FoodEnergy> PROTEIN_ENERGY = FoodEnergy.UNIT.times(4);
private static final Unit<FoodEnergy> ETHANOL_ENERGY = FoodEnergy.UNIT.times(7);
…
然后您可以结合特定能源的贡献:
Amount<FoodEnergy> beer =
Amount.valueOf(2, PROTEIN_ENERGY).plus(
Amount.valueOf(14, ETHANOL_ENERGY));
System.out.println(beer.to(FoodEnergy.UNIT).getEstimatedValue() + " Calories");
打印 105.99999999999997 Calories
。您可以通过将 NonSI.POUND
转换为 SI.GRAM
:
来计算一磅蛋白质的卡路里
double grams = NonSI.POUND.getConverterTo(SI.GRAM).convert(1);
Amount<FoodEnergy> pound = Amount.valueOf(grams, PROTEIN_ENERGY);
System.out.println(pound.to(FoodEnergy.UNIT).getEstimatedValue() + " Calories");
打印 1814.3694799999998 Calories
。最后,您可以从 FoodEnergy.UNIT
:
中恢复焦耳数
System.out.println(FoodEnergy.UNIT.divide(SI.GRAM));
打印 J*4184
或
System.out.println(FoodEnergy.UNIT.divide(SI.GRAM).toStandardUnit().convert(1));
打印 4184.0
.
我正在 JScience 库中寻找一种将一种单位类型转换为另一种单位类型的方法。给定每种类型的基本单位之间的一个因素,我应该能够转换。但是好像JScience对转换不是很好,只允许相同基类型的单位之间的转换。
基本上,我正在编写一个饮食应用程序,我需要能够在卡路里、焦耳、千焦耳、克、磅、千克等之间进行转换。宏量营养素值(碳水化合物、蛋白质、和脂肪含量。
示例:
每 1 克碳水化合物 = 4 卡路里。那是 4000 卡路里,或 16.736 千焦耳,或 16736 焦耳(能量的基本单位)。
Carb_Unit则定义为:16736joules/gram,或16736000焦耳/千克
鉴于此基础值,我应该能够从任何质量单位转换为任何能量单位。但同样,JScience 不允许这样做。有没有办法告诉转换器 return 一个具有正确转换因子的转换器而不给出 ConversionException?
CustomUnits.java:
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:
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);
}
看起来 JScience
发现您试图将 Unit<Mass>
转换为 Unit<Energy>
,这在默认 PhysicalModel
中是被禁止的。
另一种方法是为 FoodEnergy
的各种单位创建一个新的 Quantity
:
public static final Unit<Energy> KILOCALORIE = SI.JOULE.times(4184);
public interface FoodEnergy extends Quantity {
public final static Unit<FoodEnergy> UNIT
= (Unit<FoodEnergy>) SI.GRAM.times(KILOCALORIE);
}
private static final Unit<FoodEnergy> PROTEIN_ENERGY = FoodEnergy.UNIT.times(4);
private static final Unit<FoodEnergy> ETHANOL_ENERGY = FoodEnergy.UNIT.times(7);
…
然后您可以结合特定能源的贡献:
Amount<FoodEnergy> beer =
Amount.valueOf(2, PROTEIN_ENERGY).plus(
Amount.valueOf(14, ETHANOL_ENERGY));
System.out.println(beer.to(FoodEnergy.UNIT).getEstimatedValue() + " Calories");
打印 105.99999999999997 Calories
。您可以通过将 NonSI.POUND
转换为 SI.GRAM
:
double grams = NonSI.POUND.getConverterTo(SI.GRAM).convert(1);
Amount<FoodEnergy> pound = Amount.valueOf(grams, PROTEIN_ENERGY);
System.out.println(pound.to(FoodEnergy.UNIT).getEstimatedValue() + " Calories");
打印 1814.3694799999998 Calories
。最后,您可以从 FoodEnergy.UNIT
:
System.out.println(FoodEnergy.UNIT.divide(SI.GRAM));
打印 J*4184
或
System.out.println(FoodEnergy.UNIT.divide(SI.GRAM).toStandardUnit().convert(1));
打印 4184.0
.