calculate shirt size by height and weight: Pro Fit Calculator
Use this specialized tool to calculate shirt size by height and weight instantly, pairing precise chest, shoulder, and ease allowances with clear guidance.
Typical range 150–200 cm. Taller frames shift chest and shoulder allowances.
Typical range 50–120 kg. Heavier builds add ease to the chest.
Fitted
Regular
Athletic
Relaxed
Fit preference adjusts allowance: Fitted trims ease, Relaxed adds room.
Recommended {primary_keyword}: Size M
Intermediate Fit Metrics
Estimated Chest Circumference: 0 cm
Estimated Shoulder Width: 0 cm
Calculated BMI: 0
Applied Ease Allowance: 0 cm
Formula uses proportional relationships between height, weight, and ease to calculate shirt size by height and weight.
Blue: Chest projection across fits | Green: Shoulder projection across fits
Shirt size bands used to calculate shirt size by height and weight
Size
Chest Band (cm)
Height Guide (cm)
Fit Notes
S
86 – 93
155 – 170
Best for lean frames; minimal ease.
M
94 – 101
168 – 180
Balanced ease for most torsos.
L
102 – 109
176 – 188
Extra chest room for athletic builds.
XL
110 – 117
182 – 195
More shoulder span and drape.
XXL
118 – 130
188 – 205
Maximum ease and coverage.
What is {primary_keyword}?
The term {primary_keyword} describes a sizing method that converts a person's height and weight into a reliable shirt fit recommendation. People who want off-the-rack accuracy, online shoppers minimizing returns, and tailors standardizing measurements should use {primary_keyword}. A common misconception is that {primary_keyword} ignores body composition; in reality, using chest and shoulder projections within {primary_keyword} adjusts for mass distribution beyond simple stature.
{primary_keyword} Formula and Mathematical Explanation
The {primary_keyword} approach blends anthropometric ratios with ease allowances. Height predicts shoulder span, while weight scales torso mass, then ease adjusts for desired drape. The steps below show how {primary_keyword} converts raw data into a labeled size.
Convert height to meters for BMI and keep centimeters for linear projections.
Adjusted chest = chest + ease; map to size bands to finish {primary_keyword}.
Variables powering {primary_keyword}
Variable
Meaning
Unit
Typical Range
height_cm
Stature used for span projection
cm
150 – 200
weight_kg
Body mass for volume scaling
kg
50 – 120
chest
Projected chest circumference
cm
86 – 130
shoulder
Projected shoulder width
cm
34 – 52
bmi
Proportionality check inside {primary_keyword}
kg/m²
18 – 32
ease
Fit adjustment applied in {primary_keyword}
cm
-3 to +3
Practical Examples (Real-World Use Cases)
Example 1: Office Professional
Inputs: height 175 cm, weight 70 kg, fit Regular. Using {primary_keyword}, chest projects to 95.7 cm, shoulder to 38.5 cm, BMI to 22.9. With zero ease, adjusted chest is 95.7 cm, mapping to Size M. The {primary_keyword} result guides ordering a medium with standard drape.
Example 2: Gym Enthusiast
Inputs: height 182 cm, weight 92 kg, fit Athletic. The {primary_keyword} computation yields chest 112.0 cm, shoulder 40.0 cm, BMI 27.8. With +1 cm ease, adjusted chest hits 113.0 cm, pointing to Size XL. The {primary_keyword} outcome suggests room for muscle without excess billow.
How to Use This {primary_keyword} Calculator
Enter height in centimeters and weight in kilograms.
Select a fit preference aligning with how you like shirts to drape.
Watch the {primary_keyword} results update instantly: primary size, chest, shoulder, and BMI.
Review the chart to compare how chest and shoulder respond to different fits within {primary_keyword}.
Use Copy Results to keep the {primary_keyword} recommendation in your notes or email.
When reading outputs, focus on the main {primary_keyword} size, confirm chest alignment with brand charts, and use BMI as a reasonableness check.
Key Factors That Affect {primary_keyword} Results
Several elements shift how {primary_keyword} lands on a final size:
Body mass distribution: Central vs upper-body weight alters chest scaling inside {primary_keyword}.
Brand grading rules: Label-specific bands may shift how {primary_keyword} maps sizes.
Layering intent: Wearing undershirts requires extra {primary_keyword} ease.
Measurement accuracy: Misstated height or weight distorts {primary_keyword} outputs.
Frequently Asked Questions (FAQ)
Does {primary_keyword} replace a tape measure? It approximates tape results by blending height and weight, but physical measurement refines {primary_keyword} decisions.
Can {primary_keyword} handle very muscular builds? Yes; weight-driven chest scaling and athletic ease inside {primary_keyword} help accommodate mass.
Is BMI important in {primary_keyword}? BMI flags proportionality; extreme values prompt manual review within {primary_keyword}.
What if my height is below 150 cm? The calculator warns out-of-range since {primary_keyword} bands start at 150 cm.
Do brands use the same {primary_keyword} chest bands? No; always cross-check brand charts while using {primary_keyword} as a baseline.
How often should I recheck {primary_keyword}? Recalculate after weight changes of 3–5 kg or height changes from posture adjustments.
Is {primary_keyword} accurate for teenagers? Growth spurts reduce stability, so re-run {primary_keyword} quarterly.
Can I apply {primary_keyword} to bespoke shirts? Yes; it sets a starting chest and shoulder before tailoring precision.
Related Tools and Internal Resources
{related_keywords} — Internal sizing guide aligned with {primary_keyword} logic.
{related_keywords} — Fabric stretch estimator that complements {primary_keyword} adjustments.
{related_keywords} — Return cost calculator to evaluate {primary_keyword}-driven accuracy.
{related_keywords} — Brand comparison table mapped to {primary_keyword} chest bands.
{related_keywords} — Layering planner that fine-tunes {primary_keyword} ease.
{related_keywords} — Tailoring checklist to refine {primary_keyword} outputs.
var defaultHeight = 178;
var defaultWeight = 78;
var defaultFit = "Regular";
var chart;
function validateInput(value, min, max) {
if (value === "" || value === null) {
return { valid: false, message: "Value is required." };
}
var num = parseFloat(value);
if (isNaN(num)) {
return { valid: false, message: "Enter a valid number." };
}
if (num < 0) {
return { valid: false, message: "Negative values are not allowed." };
}
if (num max) {
return { valid: false, message: "Value should be between " + min + " and " + max + "." };
}
return { valid: true, value: num };
}
function calculateShirtSize() {
var heightInput = document.getElementById("heightCm").value;
var weightInput = document.getElementById("weightKg").value;
var fitPreference = document.getElementById("fitPreference").value;
var heightCheck = validateInput(heightInput, 120, 220);
var weightCheck = validateInput(weightInput, 40, 200);
document.getElementById("errorHeight").innerHTML = heightCheck.valid ? "" : heightCheck.message;
document.getElementById("errorWeight").innerHTML = weightCheck.valid ? "" : weightCheck.message;
document.getElementById("errorFit").innerHTML = "";
if (!heightCheck.valid || !weightCheck.valid) {
document.getElementById("mainResult").innerHTML = "Please provide valid height and weight to calculate {primary_keyword}.";
return;
}
var heightCm = heightCheck.value;
var weightKg = weightCheck.value;
var heightM = heightCm / 100;
var bmi = 0;
if (heightM > 0) {
bmi = weightKg / (heightM * heightM);
}
var chest = (heightCm * 0.36) + (weightKg * 0.43);
var shoulder = heightCm * 0.22;
var ease = 0;
if (fitPreference === "Fitted") {
ease = -3;
} else if (fitPreference === "Regular") {
ease = 0;
} else if (fitPreference === "Athletic") {
ease = 1;
} else if (fitPreference === "Relaxed") {
ease = 3;
}
var adjustedChest = chest + ease;
var sizeLabel = "";
if (adjustedChest < 94) {
sizeLabel = "S";
} else if (adjustedChest < 102) {
sizeLabel = "M";
} else if (adjustedChest < 110) {
sizeLabel = "L";
} else if (adjustedChest < 118) {
sizeLabel = "XL";
} else {
sizeLabel = "XXL";
}
var mainText = "Recommended {primary_keyword}: Size " + sizeLabel + " with adjusted chest " + adjustedChest.toFixed(1) + " cm.";
document.getElementById("mainResult").innerHTML = mainText;
document.getElementById("intermediateChest").innerHTML = "Estimated Chest Circumference: " + chest.toFixed(1) + " cm";
document.getElementById("intermediateShoulder").innerHTML = "Estimated Shoulder Width: " + shoulder.toFixed(1) + " cm";
document.getElementById("intermediateBMI").innerHTML = "Calculated BMI: " + bmi.toFixed(1);
document.getElementById("intermediateEase").innerHTML = "Applied Ease Allowance: " + ease.toFixed(1) + " cm";
var explanation = "This {primary_keyword} blends height-driven span and weight-driven volume to project chest and shoulder, then applies a " + fitPreference + " ease adjustment.";
document.getElementById("formulaExplanation").innerHTML = explanation;
updateChart(chest, shoulder);
}
function updateChart(chestBase, shoulderBase) {
var fits = ["Fitted", "Regular", "Athletic", "Relaxed"];
var easeValues = [-3, 0, 1, 3];
var chestData = [];
var shoulderData = [];
for (var i = 0; i < fits.length; i++) {
chestData.push(chestBase + easeValues[i]);
shoulderData.push(shoulderBase + (easeValues[i] * 0.15));
}
var canvas = document.getElementById("fitChart");
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
var padding = 40;
var width = canvas.width – padding * 2;
var height = canvas.height – padding * 2;
var maxVal = Math.max(Math.max.apply(null, chestData), Math.max.apply(null, shoulderData)) + 5;
var minVal = Math.min(Math.min.apply(null, chestData), Math.min.apply(null, shoulderData)) – 5;
if (minVal < 0) { minVal = 0; }
var yRange = maxVal – minVal;
if (yRange === 0) { yRange = 1; }
ctx.strokeStyle = "#d0d7e2";
ctx.lineWidth = 1;
for (var g = 0; g <= 4; g++) {
var y = padding + (height * g / 4);
ctx.beginPath();
ctx.moveTo(padding, y);
ctx.lineTo(padding + width, y);
ctx.stroke();
var gridVal = (maxVal – (yRange * g / 4)).toFixed(0);
ctx.fillStyle = "#4b5f73";
ctx.font = "12px Arial";
ctx.fillText(gridVal + " cm", 5, y + 4);
}
function drawLine(data, color) {
ctx.strokeStyle = color;
ctx.lineWidth = 2;
ctx.beginPath();
for (var j = 0; j < data.length; j++) {
var x = padding + (width * (j / (data.length – 1)));
var yVal = data[j];
var yPos = padding + (height * (1 – (yVal – minVal) / yRange));
if (j === 0) {
ctx.moveTo(x, yPos);
} else {
ctx.lineTo(x, yPos);
}
ctx.fillStyle = color;
ctx.beginPath();
ctx.arc(x, yPos, 4, 0, Math.PI * 2);
ctx.fill();
}
ctx.stroke();
}
drawLine(chestData, "#004a99");
drawLine(shoulderData, "#28a745");
ctx.fillStyle = "#004a99";
ctx.font = "12px Arial";
for (var k = 0; k < fits.length; k++) {
var xLabel = padding + (width * (k / (fits.length – 1)));
ctx.fillText(fits[k], xLabel – 15, canvas.height – 10);
}
}
function resetCalculator() {
document.getElementById("heightCm").value = defaultHeight;
document.getElementById("weightKg").value = defaultWeight;
document.getElementById("fitPreference").value = defaultFit;
document.getElementById("errorHeight").innerHTML = "";
document.getElementById("errorWeight").innerHTML = "";
document.getElementById("errorFit").innerHTML = "";
calculateShirtSize();
}
function copyResults() {
var main = document.getElementById("mainResult").innerText;
var chest = document.getElementById("intermediateChest").innerText;
var shoulder = document.getElementById("intermediateShoulder").innerText;
var bmi = document.getElementById("intermediateBMI").innerText;
var ease = document.getElementById("intermediateEase").innerText;
var explanation = document.getElementById("formulaExplanation").innerText;
var fullText = main + "\n" + chest + "\n" + shoulder + "\n" + bmi + "\n" + ease + "\n" + explanation;
if (navigator && navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(fullText);
} else {
var temp = document.createElement("textarea");
temp.value = fullText;
document.body.appendChild(temp);
temp.select();
document.execCommand("copy");
document.body.removeChild(temp);
}
}
window.onload = function() {
calculateShirtSize();
};