2011-11-20 17 views
15

"%.3f".format(1) devuelve 1.000.
"%.3f".format(4.0/3.0) devuelve 1.333.Formato de cadena en scala - precisión decimal máxima

¿Hay alguna manera fácil de obtener estos 1 y 1.333? Pensé que el formato estándar printf especificaba esa precisión como el máximo ya, pero aparentemente no en Scala.

+1

Scala solo utiliza el formato Java normal, por lo que la pregunta no es realmente específica de Scala. Consulte http://download.oracle.com/javase/7/docs/api/java/util/Formatter.html para obtener una descripción completa de las cadenas de formato. –

+2

'"% .3f ".format (1)' no devuelve 1.000, pero falla. '"% .3f ".format (1.0)' o 1f es necesario. De lo contrario, obtiene una 'java.util.IllegalFormatConversionException: f! = Java.lang.Integer' –

Respuesta

23

El formateador predeterminado utilizado por printf parece ser de carácter genérico que no tiene todo el mismo apoyo que [DecimalFormat][1]. Puede crear instancias de un formateador personalizado a lo largo de esas líneas:

scala> import java.text.DecimalFormat 
import java.text.DecimalFormat 

scala> val formatter = new DecimalFormat("#.###") 
formatter: java.text.DecimalFormat = [email protected] 

scala> formatter.format(1) 
res36: java.lang.String = 1 

scala> formatter.format(1.34) 
res37: java.lang.String = 1.34 

scala> formatter.format(4.toFloat/3) 
res38: java.lang.String = 1.333 

scala> formatter.format(1.toFloat) 
res39: java.lang.String = 1 

Ver: http://docs.oracle.com/javase/tutorial/java/data/numberformat.html para más información.

6

"%.3f".format(1) lanzará una java.util.IllegalFormatConversionException debido al tipo equivocado (se espera Float y le dará una Int).

Incluso si usa "%.3f".format(1.0), obtendrá 1.000.

Usted puede utilizar un método como el siguiente para obtener el resultado esperado:

def format(x:AnyVal):String = x match { 
    case x:Int => "%d".format(x) 
    case x:Long => "%d".format(x) 
    case x:Float => "%.3f".format(x) 
    case x:Double => "%.3f".format(x) 
    case _ => "" 
} 

Este método devolverá el formato esperado sobre la base de tipo de argumento.

+2

Esto todavía devuelve" 1,000 "para 1.0f –

0

¿Qué tal simplemente deshacerse de los ceros después del formateo?

scala> Array(1.0,1.10,1.110).map("%.3g" format _).map(_.replaceAll("[.0]*$","")) 
res7: Array[java.lang.String] = Array(1, 1.1, 1.11) 
+2

Tenga cuidado con esto, ya que utiliza la configuración regional para elegir qué usar como punto decimal . Y podría ser un ',' y no un '.' – Heptic

Cuestiones relacionadas