2012-02-15 16 views

Respuesta

4

A El método String.format no existe actualmente pero existe una bug/feature request por agregarlo.

+1

Este problema no existe más. –

+2

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

5

La interpolación de cadenas cubre la mayoría de sus necesidades. Si desea formatear números directamente, también existe num.toStringAsPrecision().

+0

Eso es útil, pero necesito una forma de combinar precisión y raíz, p. Ej. 'sprintf ("% 02x ", 0x0f)'. – mcandre

+0

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

4

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

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

2

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 
Cuestiones relacionadas