Compare the full price of a DC food truck lunch
Compare a food truck lunch as one main, one side and one drink, then keep tax and any extra charge separate. In the operator menus checked on 24 October 2026, a Dogs on the Curb combo was $13, while Rocklands pork or chicken with an included side and a soft drink came to $16. Those are menu subtotals, not confirmed final charges or a DC market average.
Compare the same basket before comparing prices
An inexpensive main does not necessarily produce the least expensive lunch. A sandwich that includes a side can cost less as a meal than a cheaper main with separately priced extras. The comparison below fixes the basket before doing arithmetic: one listed main, one side and one drink. It does not treat chips and a prepared side as nutritionally equivalent, or assume different mains are equal portions.
Dogs on the Curb’s operator menu lists a $13 combo including chips and a drink. Its homepage identifies a Washington, DC mobile kitchen; that establishes the service context, not a particular public stop today1. Rocklands’ operator-published vending menu lists pork and chicken sandwiches at $14, brisket at $19, each with one side, and assorted soft drinks at $22. Selecting one soft drink gives the following bounded comparison.
| Operator and selected basket | Main and side | Drink | Menu subtotal | Final charge |
|---|---|---|---|---|
| Dogs on the Curb: specialty-dog combo | Included in combo | Included | $13 | Unknown |
| Rocklands: pork sandwich and side | $14 | $2 soft drink | $16 | Unknown |
| Rocklands: chicken sandwich and side | $14 | $2 soft drink | $16 | Unknown |
| Rocklands: brisket sandwich and side | $19 | $2 soft drink | $21 | Unknown |
| DC Slices: main, side and drink | Prices unstated | Price unstated | Unknown | Unknown |
| Roaming Coyote: main, side and drink | Prices unstated | Price unstated | Unknown | Unknown |
These are choices drawn from two priced operator menus, with two unpriced comparisons retained. No meal was bought, weighed or tasted. The sources did not display effective dates for the prices. The observation date tells you when we read them; it cannot establish when a menu was last changed. Recheck the selected items when you see the truck’s current ordering menu.
Keep missing prices visible
DC Slices labels its page as the traditional menu from its roaming trucks and says menus vary by event or location, but the inspected page does not supply prices3. Roaming Coyote publishes menu items and a downloadable menu without prices in the inspected text4. Neither omission means the lunch is free, expensive or unavailable. It means this comparison cannot calculate that operator’s basket from those sources.
A missing price should stop a total, rather than quietly disappear from it. If you know a main costs $12 but cannot establish the drink price, $12 is the known main charge, not the complete lunch subtotal. The same distinction applies after the menu calculation: a known food subtotal does not establish the final charge when tax or a fee is unresolved. Unknown is a useful result because it identifies the information still needed.
Keep an included item separate from an unknown one. The zero-valued side and drink inputs in the Dogs combo below mean their cost is already inside the $13 combo. They do not claim that a separate side or drink costs zero. For Rocklands, the included side is represented the same way, while the selected soft drink carries its own $2 price. That is the specific reason the two calculations differ.
Reproduce the basket calculation
The complete example runs with Python 3 and uses decimal amounts entered as strings. It carries missing inputs through to the result instead of filling them with a guessed average. Save the printed code as lunch_baskets.py and run python3 lunch_baskets.py. It needs no account, external service or network connection.
# SPDX-License-Identifier: MIT
from decimal import Decimal
import json
def money(value):
return None if value is None else Decimal(value)
def basket(name, meal, side, drink, tax=None, fee=None):
# Zero means explicitly included, never an undisclosed price.
menu = dict(meal=money(meal), side=money(side), drink=money(drink))
extras = dict(tax=money(tax), fee=money(fee))
missing_menu = [key for key, value in menu.items() if value is None]
missing_final = missing_menu + [
key for key, value in extras.items() if value is None
]
subtotal = None if missing_menu else sum(menu.values(), Decimal('0'))
total = None if missing_final else subtotal + sum(extras.values())
return {
'basket': name,
'menu_subtotal_usd': None if subtotal is None else f'{subtotal:.2f}',
'final_total_usd': None if total is None else f'{total:.2f}',
'unresolved': missing_final,
}
# Operator menu observations, 24 October 2026; no availability claim.
# Dogs combo includes chips and drink within the stated thirteen dollars.
cases = [
('Dogs on the Curb combo', '13.00', '0.00', '0.00'),
('Rocklands pork, included side, soft drink', '14.00', '0.00', '2.00'),
('Rocklands chicken, included side, soft drink', '14.00', '0.00', '2.00'),
('Rocklands brisket, included side, soft drink', '19.00', '0.00', '2.00'),
('DC Slices menu: prices unstated', None, None, None),
('Roaming Coyote menu: prices unstated', None, None, None),
]
results = [basket(*case) for case in cases]
assert [row['menu_subtotal_usd'] for row in results[:4]] == [
'13.00', '16.00', '16.00', '21.00'
]
assert all(row['final_total_usd'] is None for row in results)
# A synthetic check supplies amounts, not a tax rate or provider quote.
synthetic = basket('Synthetic input check', '10.00', '2.00', '1.00',
tax='0.75', fee='0.25')
assert synthetic['final_total_usd'] == '14.00'
assert basket('Missing side check', '10.00', None, '2.00')[
'menu_subtotal_usd'
] is None
print(json.dumps({'observed_menu_baskets': results,
'synthetic_check': synthetic}, indent=2))
The first four results reproduce the table’s menu subtotals. Their final totals remain null, which means unknown. The two unpriced menus also have unknown food subtotals. The separate synthetic check supplies invented tax and fee amounts solely to show the calculator’s addition path; it is not a DC tax rate, an observed bill or a claim about either provider.
To compare your own choices, change the basket rather than just the headline number. If you want water instead of a soft drink, use the listed water price for that menu. If you already have a drink, describe the basket as main plus side, rather than comparing it with somebody else’s three-part meal. A calculator can keep categories consistent, but it cannot decide what you will consider a sufficient lunch.
Keep pickup, delivery and truck prices apart
A provider name is not enough to establish the relevant sales channel. A kitchen pickup or delivery offer cannot replace a missing DC truck price merely because the name is familiar. Swizzler’s catering page says its trucks are no longer on the road, although it still offers catering5. Its storefront offers therefore do not become current truck-menu observations.
Use the same discipline with a delivery marketplace. A displayed item price may belong to delivery, a particular branch or an event menu. Do not relabel it as a curbside price without evidence connecting the offer to that channel. Delivery charges also answer a different question from the cost of walking up to a truck. Keeping channel labels visible is more useful than producing a larger table of numbers that cannot be compared.
This small sample is intentionally not ranked. A $3 difference between two selected baskets is arithmetic, not evidence of better value across operators. Portion size, preparation, dietary suitability, location and waiting time were not measured. The three Rocklands combinations also come from one menu; they are not three independent observations of the wider DC market.
Check the complete amount before ordering
Use the current truck directory to find the operator’s own information, then compare the same main, side and drink against the menu available for that stop. Check whether the side is included and whether a pictured drink is part of a combo. A photograph or item name alone does not establish those inclusions.
Look at the itemised amount before committing to an order. Keep a voluntary tip separate from the menu subtotal and from any mandatory charge. If a fee or tax appears, record its actual amount rather than applying a rate from memory. If a charge is unclear, the useful question is what it covers and whether it applies to the selected order. This article does not determine the legal treatment of any charge.
For a group, compare the same basket for each person or explicitly count different choices. Multiplying the cheapest main by the group size will miss extras if that main is not what everyone wants. Preserve the source date and sales channel with the calculation so an old snapshot cannot silently become today’s promised price.
Not covered on this page
- A representative DC price survey, citywide average or best-value ranking.
- Confirmed stops, stock, opening hours or a completed purchase.
- Final tax-inclusive charges, legal fee interpretation or delivery totals.
- Portion, nutrition, allergy suitability, taste or service-speed testing.
Sources
-
Dogs on the Curb, operator menu and DC mobile-kitchen description, opened 24 October 2026; price effective date not shown. ↩
-
Rocklands, food-truck vending menu and food-truck service page, opened 24 October 2026; menu effective date not shown. ↩
-
DC Slices, roaming-truck menu, opened 24 October 2026. ↩
-
The Roaming Coyote, menu and linked download, opened 24 October 2026. ↩
How we test: methodology. Found a mistake? Corrections.