I need help writing a Python function to convert weights of common ingredients like flour, yeast, salt, oil, sugar, etc to fractional volume measurements typically used in recipes.

The supported volume units should include:

  • 1 cup, 1/2 cup, 1/3 cup, 1/4 cup
  • 1 tablespoon
  • 1 teaspoon, 1/2 teaspoon, 1/4 teaspoon

The function should be able to handle input weights in at least grams, and it would be better if it could handle input weights in grams, ounces and pounds.

Here are some test cases:

def test_function():
    assert func(1.5, 'lb', 'flour') == '5 3/4 cup'
    assert func(150, 'g', 'flour') == '1 1/4 cup' 
    assert func(42, 'g', 'sugar') == '3 tablespoon'
    assert func(5, 'oz', 'salt') == '3 tablespoon'
    assert func(7.1125, 'g', 'salt') == '1 1/4 teaspoon'

How could I write this conversion function to handle the fractional volume measurements?

  • samus7070@programming.dev
    link
    fedilink
    arrow-up
    4
    ·
    1 year ago

    Baking recipes should be in weights for any dry ingredient. Converting them to volume measurements produces inaccurate results. One person may pack the flour in harder than the next. However baking requires precise ratios to be right. Change the ratios too much and that bread recipe just became a cookie recipe.

  • joeyv120@ttrpg.network
    link
    fedilink
    arrow-up
    3
    ·
    1 year ago

    Drop the integer and multiply the decimal part by 12, round, divide by 12, reduce, then re-incorporate the integer.

    Example: 1.3 cups = 1 + 0.3 cups = 1 + 0.3*12/12 cups = 1 + 3.6/12 cups = 1 + 4/12 cups = 1 + 1/3 cups.

  • infinitepcg@lemmy.world
    link
    fedilink
    English
    arrow-up
    2
    arrow-down
    1
    ·
    1 year ago

    Based on your post history, you probably know how to do it ;)

    Just for fun, I pasted your request into ChatGPT and it did indeed produce a function that passes the tests, I’m impressed.

  • ForcedSword@discuss.tchncs.de
    link
    fedilink
    arrow-up
    1
    arrow-down
    1
    ·
    edit-2
    1 year ago

    Easy, just asked ChatGPT:

    from pint import UnitRegistry
    
    ureg = UnitRegistry()
    
    def convert_weight_to_measurements(weight_in_grams):
        measurements = [
            ('cup', 1),
            ('1/2 cup', 1/2),
            ('1/3 cup', 1/3),
            ('1/4 cup', 1/4),
            ('tablespoon', 1),
            ('teaspoon', 1),
            ('1/2 teaspoon', 1/2),
            ('1/4 teaspoon', 1/4)
        ]
    
        result = {}
    
        for measure, value in measurements:
            unit = ureg(measure)
            count = int(weight_in_grams / (value * unit.to('grams').magnitude))
            if count > 0:
                result[measure] = count
                weight_in_grams -= count * (value * unit.to('grams').magnitude)
    
        return result
    
    # Example usage
    weight_in_grams = 240
    result = convert_weight_to_measurements(weight_in_grams)
    print(f"Weight: {weight_in_grams} grams")
    print("Converted to:")
    for measure, count in result.items():
        print(f"{count} {measure}")