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.

Author: Matthias Braun, 2011-06-22

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) });
 105
Author: ataylor, 2011-06-24 16:54:02

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.

 161
Author: Martin Törnwall, 2016-11-08 17:42:27

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");
 4
Author: Tomasz Modelski, 2017-04-24 18:26:09
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
 4
Author: Ved Prakash, 2017-06-27 01:41:49

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.

 3
Author: Ryan Amos, 2016-05-17 19:24:01
Esta solução funcionou comigo. Eu precisava criar urls para um cliente de descanso dinamicamente então eu criei este método, então você só tem que passar o restURL assim
/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 "

 1
Author: Felipe Bejarano, 2018-01-15 00:38:41