Как конвертировать объем (галлоны) в массу (граммы) с помощью 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 кг.

Затем вам нужно только преобразовать входной объем в объем по умолчанию, найти тип, умножить преобразованный объем на сохраненный грамм на литр и вернуть результат.

Другие вопросы по тегам