Tôi muốn mô phỏng số sprintf("%02d", x);
của C trong Dart, nhưng tôi không thể tìm thấy định dạng chuỗi, chỉ nội suy chuỗi.Phi tiêu có chạy nước rút không, hoặc nó chỉ có nội suy?
Trả lời
A String.format phương pháp hiện không tồn tại nhưng có bug/feature request để thêm.
Nội suy chuỗi bao gồm hầu hết nhu cầu của bạn. Nếu bạn muốn định dạng số trực tiếp, cũng có num.toStringAsPrecision()
.
Điều đó hữu ích, nhưng tôi cần một cách để kết hợp độ chính xác và cơ số, ví dụ: 'sprintf ("% 02x ", 0x0f)'. – mcandre
không chắc chắn tôi đồng ý nội suy chuỗi bao gồm mọi thứ. printf/format tạo các cấu trúc như ** sprintf ("% 08d", number) ** (số định dạng có tối đa 8 số 0 đầu) và ** sprintf ("%. 3f", number) ** (Số vòng thành 3 chữ số sau dấu thập phân) rất dễ dàng. Hầu hết các ngôn ngữ tôi đã sử dụng có nội suy chuỗi cũng có chức năng printf (Perl, Ruby, ...). –
Thư viện intl cung cấp một số trình trợ giúp để định dạng giá trị. Xem tài liệu API tại http://api.dartlang.org/docs/releases/latest/intl.html
Dưới đây là một ví dụ về cách chuyển đổi một số thành một chuỗi hai nhân vật:
import 'package:intl/intl.dart';
main() {
var twoDigits = new NumberFormat("00", "en_US");
print(twoDigits.format(new Duration(seconds: 8)));
}
Tôi mất một cách tiếp cận khác nhau đối với vấn đề này: bởi đệm chuỗi trực tiếp , Tôi không phải sử dụng bất kỳ thư viện nào (chủ yếu vì thư viện intl dường như bị gián đoạn):
x.toString().padLeft(2, "0");
Sẽ tương đương với sprintf ("% 02d", x);
Đây là triển khai của tôi về String.format cho Dart. Nó không phải là hoàn hảo nhưng hoạt động tốt đủ cho tôi:
static String format(String fmt,List<Object> params) {
int matchIndex = 0;
String replace(Match m) {
if (matchIndex<params.length) {
switch (m[4]) {
case "f":
num val = params[matchIndex++];
String str;
if (m[3]!=null && m[3].startsWith(".")) {
str = val.toStringAsFixed(int.parse(m[3].substring(1)));
} else {
str = val.toString();
}
if (m[2]!=null && m[2].startsWith("0")) {
if (val<0) {
str = "-"+str.substring(1).padLeft(int.parse(m[2]),"0");
} else {
str = str.padLeft(int.parse(m[2]),"0");
}
}
return str;
case "d":
case "x":
case "X":
int val = params[matchIndex++];
String str = (m[4]=="d")?val.toString():val.toRadixString(16);
if (m[2]!=null && m[2].startsWith("0")) {
if (val<0) {
str = "-"+str.substring(1).padLeft(int.parse(m[2]),"0");
} else {
str = str.padLeft(int.parse(m[2]),"0");
}
}
return (m[4]=="X")?str.toUpperCase():str.toLowerCase();
case "s":
return params[matchIndex++].toString();
}
} else {
throw new Exception("Missing parameter for string format");
}
throw new Exception("Invalid format string: "+m[0].toString());
}
đầu ra thử nghiệm sau:
format("%d", [1]) // 1
format("%02d", [2]) // 02
format("%.2f", [3.5]) // 3.50
format("%08.2f", [4]) // 00004.00
format("%s %s", ["A","B"]) // A B
format("%x", [63]) // 3f
format("%04x", [63]) // 003f
format("%X", [63]) //3F
Vấn đề này không tồn tại nữa. –
@ GünterZöchbauer, có vẻ như nó tồn tại, nhưng quản lý để kích hoạt một phản ứng 500. [Tìm kiếm bộ theo dõi vấn đề cho 'sprintf' sẽ liệt kê nó như là một vấn đề.] (Https://code.google.com/p/dart/issues/list?q=sprintf) Từ trang danh sách, vấn đề có thể được nhìn chằm chằm , nếu bạn muốn theo dõi nó. –