BMI-Rechner-App in React Native
BMI-Rechner-App
~10 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Der BMI-Rechner ist die klassische "Formular mit Berechnung"-App – ein gutes Beispiel für numerische Eingabevalidierung, abgeleitete Werte und eine visuelle Ergebnisdarstellung mit Kategorien-Farben.
1. Beschreibung
Body-Mass-Index: Gewicht (kg) / Größe (m)². Die App nimmt Größe (in cm, intern umgerechnet) und Gewicht als Text-Eingabe entgegen, wandelt sie in Zahlen um, berechnet den BMI und ordnet ihn einer von vier WHO-Kategorien mit passender Farbe zu.
2. Kurzes Beispiel
const bmi = gewichtKg / (groesseM * groesseM);
// z.B. 70 / (1.75 * 1.75) = 22.863. Komplettes Projekt: BMI-Rechner mit Kategorien
npx create-expo-app bmi-calculator-app
cd bmi-calculator-appexport function berechneBmi(groesseCm, gewichtKg) {
const groesseM = groesseCm / 100;
return gewichtKg / (groesseM * groesseM);
}
export function bmiKategorie(bmi) {
if (bmi < 18.5) return { label: 'Untergewicht', farbe: '#3b82f6' };
if (bmi < 25) return { label: 'Normalgewicht', farbe: '#16a34a' };
if (bmi < 30) return { label: 'Übergewicht', farbe: '#f59e0b' };
return { label: 'Adipositas', farbe: '#dc2626' };
}import { useState } from 'react';
import { View, Text, TextInput, TouchableOpacity, StyleSheet } from 'react-native';
import { berechneBmi, bmiKategorie } from './utils/bmi';
export default function App() {
const [groesse, setGroesse] = useState('175');
const [gewicht, setGewicht] = useState('70');
const [ergebnis, setErgebnis] = useState(null);
const [fehler, setFehler] = useState(null);
function berechnen() {
const groesseZahl = parseFloat(groesse.replace(',', '.'));
const gewichtZahl = parseFloat(gewicht.replace(',', '.'));
if (!groesseZahl || !gewichtZahl || groesseZahl <= 0 || gewichtZahl <= 0) {
setFehler('Bitte gültige, positive Zahlen eingeben.');
setErgebnis(null);
return;
}
setFehler(null);
const bmi = berechneBmi(groesseZahl, gewichtZahl);
setErgebnis({ bmi, kategorie: bmiKategorie(bmi) });
}
return (
<View style={styles.container}>
<Text style={styles.titel}>BMI-Rechner</Text>
<Text style={styles.label}>Größe (cm)</Text>
<TextInput
style={styles.input}
value={groesse}
onChangeText={setGroesse}
keyboardType="decimal-pad"
/>
<Text style={styles.label}>Gewicht (kg)</Text>
<TextInput
style={styles.input}
value={gewicht}
onChangeText={setGewicht}
keyboardType="decimal-pad"
/>
<TouchableOpacity style={styles.button} onPress={berechnen}>
<Text style={styles.buttonText}>BMI berechnen</Text>
</TouchableOpacity>
{fehler && <Text style={styles.fehlerText}>{fehler}</Text>}
{ergebnis && (
<View style={[styles.ergebnisBox, { borderColor: ergebnis.kategorie.farbe }]}>
<Text style={[styles.bmiWert, { color: ergebnis.kategorie.farbe }]}>
{ergebnis.bmi.toFixed(1)}
</Text>
<Text style={[styles.kategorieText, { color: ergebnis.kategorie.farbe }]}>
{ergebnis.kategorie.label}
</Text>
</View>
)}
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, paddingTop: 80, paddingHorizontal: 24 },
titel: { fontSize: 24, fontWeight: 'bold', marginBottom: 24, textAlign: 'center' },
label: { color: '#6b7280', marginBottom: 4 },
input: { borderWidth: 1, borderColor: '#d1d5db', borderRadius: 8, padding: 10, marginBottom: 16, fontSize: 16 },
button: { backgroundColor: '#2563eb', padding: 14, borderRadius: 8, alignItems: 'center' },
buttonText: { color: 'white', fontWeight: 'bold', fontSize: 16 },
fehlerText: { color: '#dc2626', marginTop: 12, textAlign: 'center' },
ergebnisBox: { marginTop: 24, borderWidth: 2, borderRadius: 12, padding: 24, alignItems: 'center' },
bmiWert: { fontSize: 36, fontWeight: 'bold' },
kategorieText: { fontSize: 16, marginTop: 4 },
});4. Erklärung
groesse.replace(',', '.')– berücksichtigt, dass deutsche Nutzer oft ein Komma statt eines Punkts als Dezimaltrennzeichen eingeben; ohne diese Normalisierung würdeparseFloat('1,75')nur1liefern.keyboardType="decimal-pad"zeigt eine numerische Tastatur MIT Dezimalpunkt – nutzerfreundlicher als die Standardtastatur für reine Zahlen-Eingabefelder.- Die Validierung (
!groesseZahl || groesseZahl <= 0) prüft GLEICHZEITIG aufNaN(bei ungültiger Eingabe wie "abc",parseFloatliefertNaN, das ist "falsy") UND auf unsinnige negative/Null-Werte in einem einzigen Ausdruck. bmiKategorie()ist bewusst als REINE Funktion (kein Component-State, keine Seiteneffekte) ausgelagert – leicht isoliert testbar und wiederverwendbar, sollte die App später um eine Verlaufsansicht erweitert werden.