Como formatar cadeias de caracteres em Java
pergunta primitiva, mas como formato cadeias como esta:
"Passo {1} de {2}"
substituindo variáveis usando Java? Em C# é fácil.
6 answers
Para além das cordas.formatar, também dar uma olhada java.text.MessageFormat
. O formato menos terse e um pouco mais perto do exemplo C# que você forneceu e você pode usá-lo para analisar também.
Por exemplo:
int someNumber = 42;
String someString = "foobar";
Object[] args = {new Long(someNumber), someString};
MessageFormat fmt = new MessageFormat("String is \"{1}\", number is {0}.");
System.out.println(fmt.format(args));
Um exemplo melhor aproveita os varargs e as melhorias de autoboxing em Java 1.5 e transforma o acima numa linha única:
MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");
MessageFormat
é um pouco mais agradável para fazer plurais i18nized com o modificador de escolha. Para especificar uma mensagem que correctamente usa a forma singular quando uma variável é 1 e plural caso contrário, você pode fazer algo assim:
String formatString = "there were {0} {0,choice,0#objects|1#object|1<objects}";
MessageFormat fmt = new MessageFormat(formatString);
fmt.format(new Object[] { new Long(numberOfObjects) });
Dê uma olhada em String.format . Note, no entanto, que ele toma especificadores de formato semelhantes aos da família de funções printf de C -- por exemplo:
String.format("Hello %s, %d", "world", 42);
Voltaria "Hello world 42". Você pode achar Isso útil ao aprender sobre os especificadores de formato. Andy Thomas-Cramer foi gentil o suficiente para deixar este link em um comentário abaixo, que parece apontar para a especificação oficial. Os mais usados são:
- %S-inserir a string
- %d-inserir um inteiro assinado (decimal)
- % F-inserir um número real, notação padrão
Isto é radicalmente diferente de C#, que usa referências posicionais com um especificador de formato opcional. Isso significa que não podes fazer coisas como:
String.format("The {0} is repeated again: {0}", "word");
... sem realmente repetir o parâmetro passado para o formato printf. (veja o comentário do mestre Scrum abaixo)
Se apenas quiser imprimir o resultado directamente, você pode encontrar o sistema.as.printf (PrintStream.printf ao seu gosto.
Escrevi o meu método simples para isso:
public class SomeCommons {
/** Message Format like 'Some String {0} / {1}' with arguments */
public static String msgFormat(String s, Object... args) {
return new MessageFormat(s).format(args);
}
}
Então podes usá-lo como:
SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two");
public class StringFormat {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("================================");
for(int i=0;i<3;i++){
String s1=sc.next();
int x=sc.nextInt();
System.out.println(String.format("%-15s%03d",s1,x));
}
System.out.println("================================");
}
}
Outpot "================================"
ved15space123 ved15space123 ved15space123 "================================
Solução Java
O " - " é usado para indentar à esquerda
O " 15 " faz com que o comprimento mínimo da corda seja 15
- O " s "(que é alguns caracteres após %) será substituído pelo nosso texto
- Os 0 absorvem o nosso inteiro com 0s no esquerda
- o 3 faz com que o nosso inteiro seja um comprimento mínimo de 3
Se optar por não usar o texto.formato, a outra opção é o operador + binário
String str = "Step " + a + " of " + b;
Este é o equivalente a
new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));
O que quer que uses é a tua escolha. StringBuilder é mais rápido, mas a diferença de velocidade é marginal. Eu prefiro usar o Operador +
(que faz um StringBuilder.append(String.valueOf(X)))
e acha mais fácil de ler.
/customer/{0}/user/{1}/order
E adicione todos os params que precisar:
public String createURL (String restURL, Object ... params) {
return new MessageFormat(restURL).format(params);
}
Só tens de chamar a este método assim:
createURL("/customer/{0}/user/{1}/order", 123, 321);
A saída
"/ Cliente / 123 / utilizador / 321 / ordem "