2012-02-15 15 views

Odpowiedz

4

A Metoda String.format Metoda obecnie nie istnieje, ale istnieje bug/feature request do jej dodania.

+1

Ten problem już nie istnieje. –

+2

@ GünterZöchbauer, wygląda na to, że istnieje, ale udaje mu się wywołać odpowiedź 500. [Przeszukiwanie modułu śledzenia błędów dla "sprintf" spowoduje wyświetlenie go jako problemu.] (Https://code.google.com/p/dart/issues/list?q=sprintf) Ze strony z listą problemów można się przyjrzeć , jeśli chcesz go śledzić. –

5

Interpolacja z ciągami odpowiada większości potrzeb. Jeśli chcesz bezpośrednio formatować liczby, istnieje również num.toStringAsPrecision().

+0

To jest pomocne, ale potrzebuję sposobu na połączenie precyzji z podstawą, np. 'sprintf ("% 02x ", 0x0f)'. – mcandre

+0

nie jestem pewien, zgadzam się, że interpolacja ciągów obejmuje wszystko. printf/format tworzy konstrukcje takie jak ** sprintf ("% 08d", liczba) ** (numer formatu z maksymalnie 8 wiodącymi zerami) i ** sprintf ("%. 3f", liczba) ** (liczba rund do 3 cyfry po przecinku dziesiętnym) bardzo łatwe. Większość używanych przeze mnie języków z interpolacją ciągów ma również funkcję printf (Perl, Ruby, ...). –

4

Biblioteka intl udostępnia kilku pomocników do formatowania wartości. znaleźć w dokumentacji API w http://api.dartlang.org/docs/releases/latest/intl.html

Oto przykład, w jaki sposób przekonwertować liczbę na łańcuch znakowy:

import 'package:intl/intl.dart'; 

main() { 
    var twoDigits = new NumberFormat("00", "en_US"); 
    print(twoDigits.format(new Duration(seconds: 8))); 
} 
2

wziąłem inne podejście do tej kwestii: przez dopełnienie ciąg bezpośrednio , nie trzeba używać żadnych bibliotek (głównie dlatego, że biblioteka Intl wydaje się być przerwane):

x.toString().padLeft(2, "0"); 

byłoby równoznaczne z sprintf („% 02d” x,);

2

Oto moja implementacja String.format dla Dart. To nie jest doskonały, ale działa wystarczająco dobre dla mnie:

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

Wyjście testowe następująco:

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