Menu
CoddyTech

Prix avec NumberFormat

Fait partie de la section Données et réseau du Journey Flutter de Coddy. Leçon 22 sur 27.

Les prix proviennent des serveurs sous forme de nombres simples : 7.5, 12.25. Mets 7.5 dans une chaîne et tu obtiens $7.5, ce qu'aucun magasin n'afficherait. Un prix doit comporter le symbole de la devise et exactement deux décimales.

NumberFormat.currency, du même package intl, fait les deux :

final price = NumberFormat.currency(symbol: '\$');
price.format(7.5)      // $7.50
price.format(1250)     // $1,250.00

Il ajoute le symbole, affiche toujours deux décimales et met des virgules entre les milliers. symbol est le symbole à afficher. Sans lui, tu obtiens le code de la devise à la place : USD7.50.

Le symbole $ est précédé d'une barre oblique inverse, '\$', car dans une chaîne Dart, $ introduit une variable. La barre oblique inverse signifie « un simple symbole dollar ».

challenge icon

Défi

Facile

Les prix des livres s’affichent sous la forme $7.5. Formate chaque prix avec NumberFormat.currency(symbol: '\$') pour obtenir $8.99, $7.50 et $12.25.

Essayez vous-même

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,
    );
  }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Données et réseau

Entraînez-vous par vous-même : Compilateur Flutter en ligne