Как конвертировать объем (галлоны) в массу (граммы) с помощью jscience?
Кажется, я не могу найти / запомнить конкретную формулу для преобразования единиц объема в единицы массы. Я думаю, что это связано с плотностью, но как бы это сделать?
В моем случае я пытаюсь написать программу, использующую библиотеку 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
}
}
Есть ли лучший способ сделать это? У меня есть другие классы, которые должны иметь аналогичный способ преобразования общей единицы в единицу СИ.
1 ответ
Вам понадобятся значения массы на объем для всего, что вы хотите рассчитать. Например, вы можете расширить свое перечисление, включив в него грамм на литр (или кг на м ^3, что вам больше подходит). Вы не можете просто преобразовать объем в вес без этой информации:
Пример: 1 литр воды =1 кг, но 1 литр бензина =0,88 кг.
Затем вам нужно только преобразовать входной объем в объем по умолчанию, найти тип, умножить преобразованный объем на сохраненный грамм на литр и вернуть результат.