NumberFormat ile Fiyatlar
Coddy'nin Flutter Journey'sinin Veri ve Ağ bölümünün bir parçası. Ders 22 / 27.
Fiyatlar sunuculardan düz sayılar olarak gelir: 7.5, 12.25. 7.5 değerini bir dizgeye koyarsan $7.5 elde edersin; hiçbir mağaza bunu böyle yazdırmaz. Bir fiyatın para birimi işaretine ve tam olarak iki ondalık basamağa ihtiyacı vardır.
Aynı intl paketindeki NumberFormat.currency her ikisini de yapar:
final price = NumberFormat.currency(symbol: '\$');
price.format(7.5) // $7.50
price.format(1250) // $1,250.00İşareti ekler, her zaman iki ondalık basamak yazar ve binlik basamakların arasına virgül koyar. symbol, yazdırılacak işarettir. Bu olmadan para biriminin kodunu alırsın: USD7.50.
$ işaretinin önünde bir ters eğik çizgi vardır: '\$'; çünkü Dart dizgesinde $ bir değişkeni başlatır. Ters eğik çizgi, "düz bir dolar işareti" demektir.
Görev
KolayKitap fiyatları $7.5 olarak okunuyor. Her fiyatı NumberFormat.currency(symbol: '\$') ile biçimlendir; böylece $8.99, $7.50 ve $12.25 olarak okunurlar.
Kendin dene
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,
);
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Veri ve Ağ bölümündeki tüm dersler
3Çağrılar Başarısız Olduğunda
try ile Hataları YakalamaHata Fırlatmafinally ile TemizlemeFutureBuilder Hata DurumuYeniden Dene DüğmesiKendi başına pratik yap: Online Flutter derleyicisi