Preise mit NumberFormat
Teil des Abschnitts Daten und Netzwerk der Flutter-Journey von Coddy. Lektion 22 von 27.
Preise kommen von Servern als einfache Zahlen: 7.5, 12.25. Setzt du 7.5 in eine Zeichenkette, erhältst du $7.5, was kein Geschäft so ausgeben würde. Ein Preis benötigt sein Währungssymbol und genau zwei Nachkommastellen.
NumberFormat.currency aus demselben intl-Paket erledigt beides:
final price = NumberFormat.currency(symbol: '\$');
price.format(7.5) // $7.50
price.format(1250) // $1,250.00Es fügt das Symbol hinzu, gibt immer zwei Nachkommastellen aus und setzt Kommas zwischen die Tausender. symbol ist das auszugebende Symbol. Ohne diese Angabe erhältst du stattdessen den Währungscode: USD7.50.
Vor dem Zeichen $ steht ein Backslash: '\$', denn in einer Dart-Zeichenkette beginnt $ eine Variable. Der Backslash bedeutet „ein einfaches Dollarzeichen“.
Aufgabe
EinfachDie Buchpreise werden als $7.5 angezeigt. Formatiere jeden Preis mit NumberFormat.currency(symbol: '\$'), sodass sie als $8.99, $7.50 und $12.25 angezeigt werden.
Probier es selbst
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'api.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: BooksScreen(),
);
}
}
class BooksScreen extends StatefulWidget {
const BooksScreen({super.key});
@override
State<BooksScreen> createState() => _BooksScreenState();
}
class _BooksScreenState extends State<BooksScreen> {
late Future<List<Book>> _books;
@override
void initState() {
super.initState();
_books = loadBooks();
}
Future<List<Book>> loadBooks() async {
final body = await fetch('/books');
final items = jsonDecode(body) as List<dynamic>;
return items.map((item) => Book.fromJson(item as Map<String, dynamic>)).toList();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Books')),
body: FutureBuilder<List<Book>>(
future: _books,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Center(child: Text('Could not load: ${snapshot.error}'));
}
if (snapshot.hasData) {
final books = snapshot.data!;
return ListView.builder(
itemCount: books.length,
itemBuilder: (context, index) {
final book = books[index];
return ListTile(
title: Text(book.title),
subtitle: Text(book.author),
trailing: Text(
'\$${book.price}',
style: const TextStyle(fontSize: 18),
),
);
},
);
}
return const Center(child: CircularProgressIndicator());
},
),
);
}
}
class Book {
Book({required this.title, required this.author, required this.price});
final String title;
final String author;
final double price;
factory Book.fromJson(Map<String, dynamic> json) {
return Book(
title: json['title'] as String,
author: json['author'] as String,
price: json['price'] as double,
);
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Daten und Netzwerk
2Ladebildschirme
Ein Spinner während des LadensFutureBuilder kennenlernenEinmalig in initState ladenDaten per Button neu ladenZum Aktualisieren nach unten ziehen5Datumsangaben und Preise
Datumsangaben mit DateFormatUhrzeiten mit DateFormatPreise mit NumberFormatÜbe selbstständig: Online-Flutter-Compiler