2010-10-21 30 views
26

Necesito imprimir una cadena formateada que contenga scala.Long. java.lang.String.format() es incompatible con scala.Long (tiempo de compilación) y RichLong (java.util.IllegalFormatConversionException)¿Cómo formatear cadenas en Scala?

compilador advierte acerca de desaprobación de enteros en el siguiente código de trabajo:

val number:Long = 3243 
String.format("%d", new java.lang.Long(number)) 

¿Debo cambiar fomatter, tipo de datos o algo más?

+0

¿Es un error tipográfico que está convirtiendo de un número largo a un Entero? –

Respuesta

40

Usted puede intentar algo como:

val number: Long = 3243 
"%d".format(number) 
+9

También tiene sentido explicar ** por qué ** este debería ser el caso. –

+0

'.format' en este caso será el método de' StringLike' que se crea implícitamente a partir del literal de cadena. – expert

20

El método de formato en el Scala existe directamente en casos de cadena, por lo que no necesita/desea que el método de la clase estática. Tampoco es necesario que encasille manualmente la primitiva long, ¡deje que el compilador se encargue de todo eso por usted!

String.format("%d", new java.lang.Integer(number)) 

tanto, es mejor escribir como

"%d".format(number) 
7

@ respuesta de Bruno es lo que debes usar en la mayoría de los casos.

Si tiene que usar un método Java para hacer el formato, utilice

String.format("%d",number.asInstanceOf[AnyRef]) 

que la caja Long muy bien para Java.

+0

Esto funciona. ¿Sabes por qué esto no causará un error de tiempo de ejecución como con mi enfoque de RichLong? – Basilevs

+2

'RichLong' es, para Java, solo una clase aleatoria. Java espera ver un entero primitivo encuadrado correspondiente a '"% d "'. Así que, por supuesto, Java lanza un ataque cuando recibe un 'RichLong'. El 'asInstanceOf [AnyRef]' se coloca preferentemente en la clase 'java.lang', no en la clase' Rich'. –

Cuestiones relacionadas