NumberFormatによる価格の表示
CoddyのFlutterジャーニー「データとネットワーク」セクションの一部。レッスン 22/27。
価格はサーバーから単なる数値として届きます。7.5、12.25 のような値です。7.5 を文字列に入れると $7.5 となり、これを印字する店はありません。価格には通貨記号と、小数点以下ちょうど2桁が必要です。
同じ intl パッケージの NumberFormat.currency を使えば、どちらも実現できます。
final price = NumberFormat.currency(symbol: '\$');
price.format(7.5) // $7.50
price.format(1250) // $1,250.00通貨記号を付け、常に小数点以下2桁を表示し、千の位の間にカンマを入れます。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,
);
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
データとネットワークのすべてのレッスン
自分で練習してみよう: Flutterオンラインコンパイラ