instrução de formato em um arquivo de recursos de sequência

147

Eu tenho strings definidas no arquivo de recurso strings.xml usual como este:

<string name="hello_world"> HELLO</string>

É possível definir cadeias de formato como a abaixo

 result_str = String.format("Amount: %.2f  for %d days ",  var1, var2);

no arquivo de recurso strings.xml?

Eu tentei escapar dos caracteres especiais, mas não está funcionando.

CocoNess
fonte
1
Você pode tentar da seguinte maneira: mTextView.setText (String.format ("Score:" + "% 1 $ s", executa)); onde int é executado = 100;
Ganesh

Respostas:

264

Você não precisa usar formatted="false"no seu XML. Você só precisa usar marcadores de formato de string totalmente qualificados - %[POSITION]$[TYPE](onde [POSITION]é a posição do atributo e [TYPE]o tipo de variável), em vez das versões curtas, por exemplo %sou %d.

Citação de documentos do Android: Formatação e estilo de strings :

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

Neste exemplo, a string de formato possui dois argumentos: %1$sé uma string e %2$dé um número inteiro decimal. Você pode formatar a string com argumentos do seu aplicativo, como este:

Resources res = getResources();
String text = res.getString(R.string.welcome_messages, username, mailCount);
LocalPCGuy
fonte
1
Recebo java.util.IllegalFormatConversionException:% d não pode formatar argumentos java.lang.Double quando eu uso $ pensaria $ d é um inteiro
user1634451
6
Aqui está uma lista de todos os conversores diferentes. Você terá que escolher o apropriado para o tipo de número. Talvez seja necessário% f (para ponto flutuante): docs.oracle.com/javase/1.5.0/docs/ api / java / util / Formatter.html
LocalPCGuy
2
res.getString (R.string.welcome_messages, nome de usuário, mailCount) fará o trabalho. O método getString de recurso / contexto inclui a funcionalidade de formatação.
SkyOasis 13/11/2015
104

Você deve adicionar formatted="false"ao seu recurso de string


Aqui está um exemplo

No seu strings.xml:

<string name="all" formatted="false">Amount: %.2f%n  for %d days</string>

No seu código:

yourTextView.setText(String.format(getString(R.string.all), 3.12, 2));
Sherif elKhatib
fonte
6
Não é necessário, de acordo com os documentos para Formatar seqüências de caracteres. developer.android.com/guide/topics/resources/…
Squonk
Essa é uma maneira de corrigir, mas pode ser confusa para alguns, porque formatted="false"pode implicar que a sequência não seja formatada. Postado em outra solução stackoverflow.com/a/20887690/228429
LocalPCGuy
18
Note que você pode simplificar String.format(getString(R.string.all), 3.12, 2)desta forma: getString(R.string.all, 3.12, 2).
patryk.beza
Há um grande problema com todas as respostas nesta página: se você precisar adicionar um sinal de porcentagem ao lado de um parâmetro, digamos 25%, o Android falhará.
Henrique de Sousa
2
Você pode escapar do sinal de porcentagem incluindo dois %%. A seguir, sintaxe de formatação padrão. Exemplo: String.format ("Porcentagem% d %% ou como float% .2f %%", 12, 12.34f);
Gerará
14

O arquivo interno strings.xmldefine um recurso String como este:

<string name="string_to_format">Amount: %1$f  for %2$d days%3$s</string>

Dentro do seu código (suponha que ele seja herdado do Contexto), faça o seguinte:

 String formattedString = getString(R.string.string_to_format, floatVar, decimalVar, stringVar);

(Em comparação com a resposta de LocalPCGuy ou Giovanny Farto M., o método String.format não é necessário.)

Timo Bähr
fonte
9

Citação do Android Docs :

Se você precisar formatar suas strings usando String.format(String, Object...), poderá fazê-lo colocando seus argumentos de formato no recurso de strings. Por exemplo, com o seguinte recurso:

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

Neste exemplo, a string de formato possui dois argumentos: %1$sé uma string e %2$dé um número decimal. Você pode formatar a string com argumentos do seu aplicativo, como este:

Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
Giovanny Farto M.
fonte
0

Para mim, funcionou assim em Kotlin:

minha string.xml

 <string name="price" formatted="false">Price:U$ %.2f%n</string>

minha class.kt

 var formatPrice: CharSequence? = null
 var unitPrice = 9990
 formatPrice = String.format(context.getString(R.string.price), unitPrice/100.0)
 Log.d("Double_CharSequence", "$formatPrice")

D / Double_CharSequence: Preço: U $ 99,90

AllanRibas
fonte