Chciałbym emulować C's sprintf("%02d", x);
w Dart, ale nie mogę znaleźć formatowania ciągów, tylko interpolacja ciągów znaków.Czy Dart ma sprintf, czy ma tylko interpolację?
Odpowiedz
A Metoda String.format Metoda obecnie nie istnieje, ale istnieje bug/feature request do jej dodania.
Interpolacja z ciągami odpowiada większości potrzeb. Jeśli chcesz bezpośrednio formatować liczby, istnieje również num.toStringAsPrecision()
.
To jest pomocne, ale potrzebuję sposobu na połączenie precyzji z podstawą, np. 'sprintf ("% 02x ", 0x0f)'. – mcandre
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, ...). –
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)));
}
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,);
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
- 1. Czy Dart ma harmonogram?
- 2. Czy znak ma tylko jedną szerokość znaku?
- 3. czy JSON ma schemat
- 4. Czy Haskell ma foldlM?
- 5. Czy Clojure ma "rozwinąć"?
- 6. Czy GCC ma GUI?
- 7. czy młotek ma GUI?
- 8. Czy Haskell ma zmienne?
- 9. Czy aiohttp ma ORM?
- 10. Czy Smalltalk ma zamknięcia?
- 11. Czy angular2 ma ngCloak
- 12. Czy urządzenie ma "oddzwanianie"?
- 13. Czy logback ma NullAppender?
- 14. Czy NotifyIcon ma odpowiednik MouseDown?
- 15. Czy mogę stwierdzić, czy iPhone ma hasło?
- 16. Czy GWT ma widżet Akapit?
- 17. Czy WebSockets ma limit przepustowości?
- 18. Czy to makro ma zaletę?
- 19. Czy Python ma podobną interpolację zmiennych jak "string # {var}" w Ruby?
- 20. Dlaczego Dart ma stałe czasowe kompilacji?
- 21. Czy Rust ma cechy kolekcjonerskie?
- 22. Czy Notepad ++ ma tryb blokowania?
- 23. Czy C++ ma uporządkowane hash?
- 24. Czy znacznik BR ma wysokość?
- 25. Czy Kafka ma konsumenta wsadowego?
- 26. Czy Instagram ma przycisk udostępniania, czy nie?
- 27. iOS: jak sprawdzić, czy ciąg ma tylko cyfry?
- 28. Czy nakładka Div ma CAŁĄ stronę (nie tylko widok)?
- 29. Czy Sublime Text 2 ma tryb tylko do odczytu?
- 30. Czy CSS ma zastosowanie tylko w Operze 11?
Ten problem już nie istnieje. –
@ 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ć. –