Estoy tratando de usar un .format
método de una cadena. Pero si coloco% 1,% 2, etc. en la cadena, se arroja java.util.UnknownFormatConversionException apuntando a una pieza de código fuente Java confusa:
private void checkText(String s) {
int idx;
// If there are any '%' in the given string, we got a bad format
// specifier.
if ((idx = s.indexOf('%')) != -1) {
char c = (idx > s.length() - 2 ? '%' : s.charAt(idx + 1));
throw new UnknownFormatConversionException(String.valueOf(c));
}
}
De esto entiendo que el %
carbón está prohibido. Si es así, ¿qué debo usar para los marcadores de posición de argumento?
Yo uso Scala 2.8.
format
directamente al literal de cadena:"Hello %s, isn't %s cool?".format("Ivan", "Scala")
No necesita usar números para indicar el posicionamiento. Por defecto, la posición del argumento es simplemente el orden en que aparece en la cadena.
Aquí hay un ejemplo de la forma correcta de usar esto:
Siempre usará un
%
seguido de algunos otros caracteres para que el método sepa cómo debe mostrar la cadena.%s
es probablemente el más común, y solo significa que el argumento debe tratarse como una cadena.No enumeraré todas las opciones, pero daré algunos ejemplos solo para darle una idea:
String.format
solo usa ajava.util.Formatter
, así que para obtener una descripción completa de las opciones, puede ver los javadocs Formatter .Y, como menciona BalusC, verá en la documentación que es posible cambiar el orden predeterminado de los argumentos si es necesario. Sin embargo, probablemente la única vez que necesite / desee hacer esto es si está utilizando el mismo argumento más de una vez.
fuente
En lugar de mirar el código fuente, debería leer la sintaxis de Javadoc String.format () y Formatter .
Usted especifica el formato del valor después del%. Por ejemplo, para entero decimal es
d
, y para String ess
:Salida:
Para hacer lo que ha intentado (utilizar un índice argumento), que utilice:
*n*$
,Salida:
fuente
Puedes usar esto;
Salida:
fuente
{0}
y en{1}
lugar de%1$
y%2$
.También tenga en cuenta que Scala extiende String con una serie de métodos (a través de la conversión implícita a una WrappedString introducida por Predef) para que también pueda hacer lo siguiente:
fuente
La referencia oficial es la clase
Formatter
.fuente
En Scala 2.10
fuente
printf
, incluso podría definir su propia interpolación (no he tratar). Esto$name
significa que debe reemplazarse con el valor de la variablename
, por ejemplo, también puede realizar operaciones en la interpolacións"Hello ${name.toUpperCase}, it's $weather today!"
Esta es una lista de lo que
String.format
puede hacer. Lo mismo va paraprintf
fuente
Aquí hay una lista de formateadores utilizados con String.format ()
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html
fuente
Aunque @Londo mencionó el interpolador de cadenas "s" de Scala, creo que el interpolador de cadenas "f" de Scala es más relevante para la pregunta original. El ejemplo utilizado algunas veces en otras respuestas también podría escribirse (desde Scala 2.10) de esta manera:
La conexión con la pregunta original es tener en cuenta que:
formatted
se define con una cadena que tiene el prefijo con la letra "f". Este es el interpolador de cadenas "f" (formateo).java.util.Formatter
java.lang.String.format
usa lo mismojava.util.Formatter
Lo bueno de la interpolación de cadenas es que le permite ver qué variable se sustituye directamente en la cadena en lugar de tener que hacerla coincidir con los argumentos del
String.format
método.fuente
En scala, para la interpolación de cadenas tenemos $ que ahorra el día y hace nuestra vida mucho más fácil:
Por ejemplo: Desea definir una función que tome el nombre y la edad de entrada y diga Hola con el nombre y diga su edad. Eso se puede escribir así:
Por lo tanto, cuando llamas a esta función: así:
Su salida sería:
¡Puede escribir el código para cambiarlo en la misma línea, como si quisiera agregar 10 años a la edad!
entonces la función podría ser:
Y ahora el resultado sería:
fuente