الأسعار باستخدام NumberFormat
جزء من قسم البيانات والشبكة في رحلة Flutter على Coddy. الدرس 22 من 27.
تأتي الأسعار من الخوادم كأرقام مجردة: 7.5، 12.25. ضع 7.5 في سلسلة نصية فتحصل على $7.5، وهذا ما لن يطبعه أي متجر. يحتاج السعر إلى رمز العملة ومنزلتين عشريتين بالضبط.
تقوم NumberFormat.currency، من الحزمة نفسها intl، بالأمرين معًا:
final price = NumberFormat.currency(symbol: '\$');
price.format(7.5) // $7.50
price.format(1250) // $1,250.00تضيف رمز العملة، وتكتب دائمًا منزلتين عشريتين، وتضع فواصل بين الآلاف. symbol هو الرمز المراد طباعته. ومن دونه، ستحصل على رمز العملة بدلًا منه: USD7.50.
تسبق علامة $ شرطة مائلة عكسية، '\$'، لأن $ تبدأ متغيرًا في سلسلة Dart النصية. وتشير الشرطة المائلة العكسية إلى «علامة دولار عادية».
التحدي
سهلتُقرأ أسعار الكتب $7.5. نسّق كل سعر باستخدام NumberFormat.currency(symbol: '\$')، لتظهر بهذا الشكل: $8.99 و$7.50 و$12.25.
جرّب بنفسك
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,
);
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البيانات والشبكة
2شاشات التحميل
مؤشر دائري أثناء التحميلتعرّف على FutureBuilderجلب البيانات مرة واحدة في initStateإعادة تحميل البيانات بزرالسحب للتحديث5التواريخ والأسعار
التواريخ باستخدام DateFormatالأوقات باستخدام DateFormatالأسعار باستخدام NumberFormatتدرّب بنفسك: مترجم Flutter عبر الإنترنت