Me gustaría emular C's sprintf("%02d", x);
en Dart, pero no puedo encontrar el formato de cadenas, solo la interpolación de cadenas.¿Dart tiene sprintf, o solo tiene interpolación?
Respuesta
A El método String.format no existe actualmente pero existe una bug/feature request por agregarlo.
La interpolación de cadenas cubre la mayoría de sus necesidades. Si desea formatear números directamente, también existe num.toStringAsPrecision()
.
Eso es útil, pero necesito una forma de combinar precisión y raíz, p. Ej. 'sprintf ("% 02x ", 0x0f)'. – mcandre
no estoy seguro Acepto que la interpolación de cadenas lo cubre todo. printf/format hace construcciones como ** sprintf ("% 08d", number) ** (número de formato con hasta 8 ceros a la izquierda) y ** sprintf ("%. 3f", number) ** (Round number to 3 dígitos después del punto decimal) muy fácil. La mayoría de los lenguajes que he usado que tienen interpolación de cadenas también tienen una funcionalidad printf (Perl, Ruby, ...). –
La biblioteca intl proporciona varios ayudantes para formatear valores. Consulte la documentación de la API en http://api.dartlang.org/docs/releases/latest/intl.html
Aquí hay un ejemplo de cómo convertir un número en una cadena de dos caracteres:
import 'package:intl/intl.dart';
main() {
var twoDigits = new NumberFormat("00", "en_US");
print(twoDigits.format(new Duration(seconds: 8)));
}
Me tomó un enfoque diferente a este problema: por el relleno de la cadena directamente , yo no tengo que usar ninguna biblioteca (principalmente porque la biblioteca Intl parece estar fuera de producción):
x.toString().padLeft(2, "0");
sería el equivalente de sprintf ("% 02d", x);
Aquí está mi implementación de String.format for Dart. No es perfecto, pero funciona lo suficientemente bueno para mí:
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());
}
salida de prueba sigue:
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. ¿Por qué Dart tiene constantes de tiempo de compilación?
- 2. ¿Lua tiene O comparaciones?
- 3. ¿Tiene un solo menú en varias páginas?
- 4. ¿La proyección de tipo tiene un opuesto, o sigue siendo una proyección (o solo un mapeo)?
- 5. ¿Tiene DB2 una instrucción "insertar o actualizar"?
- 6. procedimiento o función tiene demasiados argumentos especificados
- 7. ¿Tiene "" y "tiene diferentes significados en JavaScript?
- 8. iOS: ¿cómo verificar si una cadena tiene solo dígitos?
- 9. Need Spring version # - solo tiene el archivo spring.jar
- 10. ¿Por qué el operador = ~ solo a veces tiene efectos secundarios?
- 11. ¿Tiene Python una interpolación variable similar como "string # {var}" en Ruby?
- 12. ¿VB.NET tiene funciones anónimas?
- 13. WPF Aplicación que solo tiene un ícono de bandeja
- 14. ¿Tiene Python un modificador de "solo compilar" como Perl's -c?
- 15. ¿Cómo `ls` solo tiene un nivel de profundidad?
- 16. ¿Por qué una int en OCaml solo tiene 31 bits?
- 17. Usando LINQ para un objeto que solo tiene GetEnumerator()
- 18. Detectar cuando la entrada tiene un atributo 'solo lectura'
- 19. Seleccionar la fila principal solo si no tiene hijos
- 20. ¿Por qué Python dice que pow solo tiene 2 argumentos?
- 21. ¿Por qué Mercurial solo tiene un nivel de reversión?
- 22. location.hash solo tiene efecto una vez en cromo y safari
- 23. ¿Tiene TypeScript una máquina virtual dedicada o solo compilación-a-j?
- 24. ¿Tiene una interfaz con muchos métodos virtuales? ¿O tener muchas interfaces con solo 1 método virtual?
- 25. ¿Es posible o tiene sentido crear un sitio web solo de jquery/.NET Service?
- 26. C# - ¿la cadena realmente es una matriz de caracteres o solo tiene un indexador?
- 27. ¿Xcode tiene intellisense
- 28. ¿Qué utilidad tiene UML?
- 29. ¿Cuál es eficiente, itoa o sprintf?
- 30. ¿Trac tiene API remota?
Este problema no existe más. –
@ GünterZöchbauer, parece que existe, pero se las arregla para activar una respuesta de 500. [Buscar en el rastreador de problemas de 'sprintf' lo incluirá como un problema.] (Https://code.google.com/p/dart/issues/list?q=sprintf) En la página de la lista, se puede ver el problema , si quieres seguirlo –