Estou tentando usar um .format
método de uma seqüência de caracteres. Mas se eu colocar% 1,% 2, etc. na cadeia de caracteres, java.util.UnknownFormatConversionException será lançado apontando para um pedaço de código-fonte Java confuso:
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));
}
}
Por isso eu entendo que %
char é proibido. Nesse caso, o que devo usar para espaços reservados para argumentos?
Eu uso o Scala 2.8.
format
diretamente à string literal:"Hello %s, isn't %s cool?".format("Ivan", "Scala")
Você não precisa usar números para indicar o posicionamento. Por padrão, a posição do argumento é simplesmente a ordem em que ele aparece na string.
Aqui está um exemplo da maneira correta de usar isso:
Você sempre usará um
%
seguido por outros caracteres para permitir que o método saiba como deve exibir a sequência.%s
é provavelmente o mais comum e significa apenas que o argumento deve ser tratado como uma string.Não listarei todas as opções, mas darei alguns exemplos apenas para lhe dar uma idéia:
String.format
apenas usa ajava.util.Formatter
, portanto, para obter uma descrição completa das opções, você pode ver os javadocs do Formatador .E, como o BalusC menciona, você verá na documentação que é possível alterar a ordem dos argumentos padrão, se necessário. No entanto, provavelmente a única vez que você precisará / deseja fazer isso é se estiver usando o mesmo argumento mais de uma vez.
fonte
Em vez de observar o código fonte, você deve ler a sintaxe javadoc String.format () e Formatter .
Você especifica o formato do valor após o%. Por exemplo, para número inteiro decimal, é
d
, e para String, és
:Resultado:
Para fazer o que você tentou (usar um índice argumento), você usa:
*n*$
,Resultado:
fonte
Você pode usar isso;
Resultado:
fonte
{0}
e em{1}
vez de%1$
e%2$
.Observe também que o Scala estende String com vários métodos (via conversão implícita em um WrappedString trazido pelo Predef) para que você também possa fazer o seguinte:
fonte
A referência oficial é a classe
Formatter
.fonte
No Scala 2.10
fonte
printf
, você pode até definir sua própria interpolação (eu não experimentar). Os$name
meios que precisam ser substituir com o valor da variávelname
, você também pode fazer a operação na interpolação, por exemplos"Hello ${name.toUpperCase}, it's $weather today!"
Esta é uma lista do que
String.format
pode fazer. O mesmo vale paraprintf
fonte
Aqui está uma lista de formatadores usados com String.format ()
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html
fonte
Embora @Londo tenha mencionado o interpolador de cordas "s" de Scala, acho que o interpolador de cordas "f" de Scala é mais relevante para a pergunta original. O exemplo usado algumas vezes em outras respostas também pode ser escrito (desde o Scala 2.10) desta maneira:
A conexão com a pergunta original é estar ciente de que:
formatted
é definido com uma sequência prefixada com a letra "f". Este é o interpolador de seqüência de caracteres "f" (formatação).java.util.Formatter
java.lang.String.format
usa o mesmojava.util.Formatter
O bom da interpolação de cadeias de caracteres é que ela permite ver qual variável está sendo substituída diretamente na cadeia de caracteres, em vez de precisar correspondê-la aos argumentos do
String.format
método.fonte
Em scala, para a Interpolação de cordas, temos $ que salvam o dia e tornam nossa vida muito mais fácil:
Por exemplo: você deseja definir uma função que aceite o nome e a idade da entrada e diga Olá com o nome e diga a idade. Isso pode ser escrito assim:
Portanto, quando você chama esta função: assim:
Sua saída seria:
Você pode escrever o código para alterá-lo na mesma linha, como se quiser adicionar 10 anos à idade!
então a função pode ser:
E agora a saída seria:
fonte