sizingfootwearalgorithmdeveloper-guideecommerce

Shoe Size Calculator: Foot Measurements and International Size Conversion

· 6 min read · Martin Hejda

Shoe sizing is more complex than clothing sizing because it involves two dimensions — length and width — and the international size systems have inconsistent formulas and non-integer conversions. Getting it right requires understanding both the measurement conventions and the size system mathematics.


The measurements that drive shoe sizing

Foot length: The primary determinant of shoe size across all systems. Measured from the heel to the longest toe (brannock measurement). This is the standardized input for shoe size calculations.

Foot width: Secondary dimension that determines width category (narrow, medium, wide, extra-wide). Often ignored in general footwear but critical for athletic shoes, work boots, and medical footwear.

Arch length: Used in some fitting systems — the distance from the heel to the ball of the foot. The shoe’s widest point should align with the foot’s ball.


Getting foot dimensions from a prediction API

Foot length and foot breadth are measured dimensions in the ISO 7250-1 standard. Prediction APIs that cover the LEGS_FEET dimension bundle will return these:

import requests

def predict_foot_dimensions(
    gender: str,
    height_cm: float,
    weight_kg: float,
    region: str = "GLOBAL"
) -> dict:
    """
    Predict foot length and breadth from height and weight.
    Foot dimensions are BONE dimensions — predicted with higher confidence.
    """
    response = requests.post(
        "https://dimensionspot-bodysize-engine.p.rapidapi.com/v1/predict",
        json={
            "input_data": {
                "input_unit_system": "metric",
                "subject": {"gender": gender, "input_origin_region": region},
                "anchors": {
                    "body_height": int(height_cm * 10),  # cm → mm
                    "body_mass": weight_kg
                }
            },
            "output_settings": {
                "calculation": {"target_region": region, "body_build_type": "CIVILIAN"},
                "requested_dimensions": {
                    "specific_dimensions": ["foot_length", "foot_breadth"]
                },
                "output_format": {
                    "include_range_95": True,
                    "confidence_score_threshold": 60,
                    "include_iso_codes": True
                }
            }
        },
        headers={
            "X-RapidAPI-Key": "YOUR_API_KEY",
            "X-RapidAPI-Host": "dimensionspot-bodysize-engine.p.rapidapi.com"
        }
    )
    
    data = response.json()
    return {
        dim_id: {
            "value": d.get("value"),
            "range_95": d.get("range_95"),
            "confidence_score": d.get("confidence_score")
        }
        for dim_id, d in data.get("body_dimensions", {}).items()
    }

The Mondopoint system (ISO 9407)

Mondopoint is the ISO standard for shoe sizing. It expresses shoe size as the foot length in millimeters. This makes it the most rational system: Mondopoint 260 means the foot is 260mm long.

def foot_length_mm_to_mondopoint(foot_length_mm: float) -> int:
    """
    Convert foot length to Mondopoint size.
    Mondopoint = foot length in mm, typically rounded to nearest 5mm.
    ISO 9407 specifies increments of 5mm for the length component.
    """
    return round(foot_length_mm / 5) * 5

Mondopoint is used in skiing (ski boot sizing is always Mondopoint), some military footwear standards, and increasingly in athletic footwear technical specifications.


US shoe size conversion

US shoe sizing has separate scales for men, women, and children. The formulas are based on barleycorns (1/3 inch = 8.47mm):

def foot_length_mm_to_us_size(foot_length_mm: float, gender: str) -> dict:
    """
    Convert foot length in mm to US shoe size.
    
    US sizing is based on the "last" (the shoe form) which adds ~12-15mm to foot length.
    Add ~12mm for fitted shoes, ~15mm for athletic shoes before calculation.
    """
    FITTING_ALLOWANCE_MM = 13  # Typical allowance for comfort fit
    last_length_mm = foot_length_mm + FITTING_ALLOWANCE_MM
    
    # Convert mm to inches
    last_length_inches = last_length_mm / 25.4
    
    # US size formula: size = (length_in_inches - 7.333) * 3
    # Different for men vs women (women's sizes are ~1.5 sizes larger for same foot)
    if gender == "male":
        size = (last_length_inches - 7.333) * 3
    else:
        size = (last_length_inches - 6.0) * 3
    
    # Round to nearest half size
    size_half = round(size * 2) / 2
    
    return {
        "size": size_half,
        "size_label": f"US {size_half:.1f}".rstrip('0').rstrip('.'),
        "gender": gender,
        "foot_length_mm": foot_length_mm
    }

def foot_length_mm_to_us_kids(foot_length_mm: float) -> dict:
    """US children's shoe sizing."""
    FITTING_ALLOWANCE_MM = 12
    last_length_inches = (foot_length_mm + FITTING_ALLOWANCE_MM) / 25.4
    
    size = (last_length_inches - 3.333) * 3
    size_half = round(size * 2) / 2
    
    return {
        "size": size_half,
        "size_label": f"US Kids {size_half:.1f}".rstrip('0').rstrip('.'),
        "foot_length_mm": foot_length_mm
    }

EU shoe size conversion

EU sizing (also called Continental or Paris Point) uses units of 2/3 cm (6.67mm):

def foot_length_mm_to_eu_size(foot_length_mm: float) -> dict:
    """
    Convert foot length in mm to EU shoe size.
    EU size = last length in Paris Points (1 PP = 6.67mm)
    Last is typically foot length + 15mm for athletic, +10mm for dress.
    """
    FITTING_ALLOWANCE_MM = 12
    last_length_mm = foot_length_mm + FITTING_ALLOWANCE_MM
    
    # Paris Point = 2/3 cm = 6.667mm
    PARIS_POINT_MM = 20 / 3
    
    eu_size = last_length_mm / PARIS_POINT_MM
    eu_size_rounded = round(eu_size * 2) / 2  # Round to nearest half size
    
    return {
        "size": eu_size_rounded,
        "size_label": f"EU {eu_size_rounded:.0f}" if eu_size_rounded == int(eu_size_rounded) else f"EU {eu_size_rounded}",
        "foot_length_mm": foot_length_mm
    }

UK shoe size conversion

UK sizing is similar to US men’s but offset by 0.5–1 size:

def foot_length_mm_to_uk_size(foot_length_mm: float) -> dict:
    """UK shoe sizing — similar to US men's sizing minus 0.5."""
    FITTING_ALLOWANCE_MM = 13
    last_length_inches = (foot_length_mm + FITTING_ALLOWANCE_MM) / 25.4
    
    # UK size = (length_in_inches - 7.333) * 3 - 0.5
    size = (last_length_inches - 7.333) * 3 - 0.5
    size_half = round(size * 2) / 2
    
    return {
        "size": size_half,
        "size_label": f"UK {size_half:.1f}".rstrip('0').rstrip('.'),
        "foot_length_mm": foot_length_mm
    }

Width category assignment

Width categories vary by brand and country. The most common system uses letter codes:

def foot_width_to_category(
    foot_breadth_mm: float,
    foot_length_mm: float,
    gender: str
) -> str:
    """
    Assign a width category based on foot breadth-to-length ratio.
    
    The Ball of Foot Ratio (BFR) = breadth / length
    Women's feet are proportionally narrower than men's on average.
    """
    bfr = foot_breadth_mm / foot_length_mm
    
    if gender == "female":
        if bfr < 0.355:
            return "2A (Narrow)"
        elif bfr < 0.370:
            return "B (Slim)"
        elif bfr < 0.385:
            return "D (Medium/Standard)"
        elif bfr < 0.400:
            return "2E (Wide)"
        else:
            return "4E (Extra Wide)"
    else:
        if bfr < 0.360:
            return "2A (Narrow)"
        elif bfr < 0.375:
            return "B (Slim)"
        elif bfr < 0.390:
            return "D (Medium/Standard)"
        elif bfr < 0.405:
            return "2E (Wide)"
        else:
            return "4E (Extra Wide)"

Complete shoe size recommendation function

def shoe_size_recommendation(
    gender: str,
    height_cm: float,
    weight_kg: float,
    region: str = "GLOBAL"
) -> dict:
    """
    Full shoe size recommendation from height and weight.
    Returns sizes in US, EU, UK, and Mondopoint systems.
    """
    # Get foot dimensions from prediction API
    foot_dims = predict_foot_dimensions(gender, height_cm, weight_kg, region)
    
    if "foot_length" not in foot_dims:
        return {"error": "Foot length prediction unavailable"}
    
    foot_length_mm = foot_dims["foot_length"]["value"]
    foot_breadth_mm = foot_dims.get("foot_breadth", {}).get("value")
    
    result = {
        "foot_length_mm": round(foot_length_mm),
        "foot_length_cm": round(foot_length_mm / 10, 1),
        "mondopoint": foot_length_mm_to_mondopoint(foot_length_mm),
        "us_size": foot_length_mm_to_us_size(foot_length_mm, gender),
        "eu_size": foot_length_mm_to_eu_size(foot_length_mm),
        "uk_size": foot_length_mm_to_uk_size(foot_length_mm),
        "confidence": {
            "score": foot_dims["foot_length"].get("confidence_score"),
            "range_95_mm": foot_dims["foot_length"].get("range_95")
        },
        "note": "Foot length is predicted from height and weight. For precise sizing, measure your actual foot length."
    }
    
    if foot_breadth_mm:
        result["foot_breadth_mm"] = round(foot_breadth_mm)
        result["width_category"] = foot_width_to_category(foot_breadth_mm, foot_length_mm, gender)
    
    return result

Important caveats for footwear applications

Foot measurement vs. shoe size: Shoe sizes incorporate a fitting allowance (12–20mm depending on shoe type). Athletic shoes have more allowance than dress shoes. This allowance is the main reason converted sizes vary slightly by calculator and by shoe type.

Brand variation: Unlike the EU size system which is theoretically standardized, actual shoe sizing varies by brand. A European brand’s “EU 42” may correspond to a slightly different foot length than a US brand’s “EU 42” marking. The conversion formulas above produce theoretically correct sizes; actual fit requires trying the shoe or using brand-specific fit data.

Self-measurement is better: If your application allows users to measure their own foot length (trace foot on paper, measure from heel to longest toe), use that value directly rather than a predicted value. Foot length measurement is easy and produces better accuracy than height/weight prediction.

Prediction accuracy: Foot length is a BONE dimension predicted with relatively high confidence from height (tall people have longer feet — the correlation is strong). However, for shoe sizing where half a size matters, the 95% prediction interval of ±8–12mm means the prediction may span two sizes. Surface this uncertainty: “Your predicted foot length suggests EU 42–43.”


Shoe sizing is one of the few areas where Mondopoint — foot length in millimeters — is actually the best number to give users. “Your foot is 265mm long” is more actionable than “you’re a US 9.5” because users can verify it with a ruler and look up conversions themselves. When prediction uncertainty is meaningful, give the millimeter value alongside the size label.

Try DimensionsPot

Free tier — 100 requests/month, no credit card required.

Get API on RapidAPI