我似乎找不到/记住一个特定的公式,可以将音量单位转换为质量单位。我认为这与密度有关,但是如何完成?
就我而言,我正在尝试使用JScience库编写一个程序,以将用户可能输入标准SI.GRAM
单元的任何类型的单元转换。
问题出现在试图描述蜂蜜之类的东西,这些蜂蜜通常以加仑,克,磅和盎司的方式进行测量。
我有以下代码在使用质量单位时主要工作,但是在尝试使用加仑时,我会得到ConversionException
,这是可以理解的,因为它是在测量体积而不是质量。
javax.measure.converter.ConversionException: gal is not compatible with g
这就是我到目前为止所拥有的。另外,我选择将Amount<Mass>
分解到amount_value
和amount_unit
中,因为我想将其存储在SQLite数据库中,并且也将其表示为文本,因此我将其作为序列化目的存储。
public class Sugar {
private String type;
private double amount_value;
private String amount_unit;
public Sugar(SUGAR_TYPES type, Amount<Mass> amount) {
this.type = type.toString();
this.amount_value = amount.getEstimatedValue();
this.amount_unit = amount.getUnit().toString();
}
public Amount<Mass> getAmount() {
BaseUnit<Mass> mass_unit = new BaseUnit<>(amount_unit);
return Amount.valueOf(amount_value, mass_unit);
}
public SUGAR_TYPES getType() {
return (type != null) ? SUGAR_TYPES.valueOf(type) : null;
}
public double getAmountInGrams() {
Amount<Mass> mass_unit = getAmount();
switch (mass_unit.getUnit().toString().toLowerCase()) {
case "g":
return mass_unit.getEstimatedValue();
case "gal":
// this throws the ConversionException
return NonSI.GALLON_LIQUID_US.getConverterTo(SI.GRAM).convert(mass_unit.getEstimatedValue());
case "lb":
return NonSI.POUND.getConverterTo(SI.GRAM).convert(mass_unit.getEstimatedValue());
default:
Log.e(TAG, String.format("Failed to get Amount<Mass> in SI.GRAM for amount %s and unit %s.",
amount_value, amount_unit));
throw new IllegalArgumentException(mass_unit.getUnit().toString());
}
}
public enum SUGAR_TYPES {
HONEY, SUCROSE, APPLES, APRICOTS, APRICOTS_DRIED, BANANAS, BLACKBERRY, BLUEBERRY,
BOYSENBERRY, CANTALOUPE, CELERY, CHERRY_DARK_SWEET, CRANBERRY, CURRANT_BLACK, DATES,
DATES_DRIED, DEWBERRY, ELDERBERRY, FIGS, FIGS_DRIED, GOOSEBERRY, GRAPE_CONCORD,
GRAPES, GRAPEFRUIT, GUANABANA, GUAVAS, HONEYDEW_MELON, JACKFRUIT, KIWIS, LEMON_JUICE,
LITCHI, LOGANBERRY, MANGOS, MAPLE_SYRUP, PLUMS, RAISINS_DRIED, RASPBERRY_BLACK,
RASPBERRY_RED, RHUBARB, STRAWBERRY, TANGERINES, WATERMELONS
}
}
有更好的方法吗?我还有其他类别需要将通用单元转换为SI单元的类似方法。
您将需要每个音量值的质量值才能计算的所有内容。例如,您可以将枚举扩展到包括每升的克(或最适合您的最佳功能(。没有此信息,您不能仅将体积转换为重量:
示例:1升水= 1kg,但1升汽油= 0.88 kg。
然后,您只需要将输入卷转换为默认卷,查找类型,将转换的卷与保存的克每升乘以转换的卷并返回结果。