2012-02-15 23 views

Trả lời

4

A String.format phương pháp hiện không tồn tại nhưng có bug/feature request để thêm.

+1

Vấn đề này không tồn tại nữa. –

+2

@ 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ó. –

5

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().

+0

Đ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

+0

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, ...). –

4

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))); 
} 
2

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);

2

Đâ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