Android XML Prozent Symbol


309

Ich habe eine Reihe von Zeichenfolgen, in denen das %Symbol verwendet wird. Richtiges Format für die Verwendung des %is %. Wenn ich in diesem Array eine Zeichenfolge mit mehreren %habe, wird mir dieser Fehler angezeigt.

 Multiple annotations found at this
 line:
 - error: Multiple substitutions specified in non-positional format;
   did you mean to add the formatted="false" attribute?
 - error: Found tag </item> where </string-array> is expected

6
Können Sie das XML veröffentlichen, das diesen Fehler verursacht? Es kann sehr schwierig sein, ein Problem zu identifizieren, ohne die Ursache zu erkennen.
Chris Cashwell

Dies ist ein Fehler, der leicht von einer beliebigen Zeichenfolge mit 2 oder mehr% -Symbolen repliziert werden kann.
zaid

Wenn nicht für die Formatierung Zweck suchen, bessere Art und Weise zu erreichen.
Shishir Gupta

In meinem Fall habe ich den Formatierungsparameter fälschlicherweise als 1% $ s anstelle von% 1 $ s eingegeben.
Ashokchakravarthi Nagarajan

Antworten:


467

Das Android Asset Packaging Tool ( aapt) ist in seiner neuesten Version sehr streng geworden und wird jetzt für alle Android-Versionen verwendet. Der aapt-Fehler, den Sie erhalten, wird generiert, weil keine nicht positionellen Formatspezifizierer mehr zulässig sind .

Hier sind einige Ideen, wie Sie das% -Symbol in Ihre Ressourcenzeichenfolgen aufnehmen können.

Wenn Sie keine Formatspezifizierer oder Ersetzungen in Ihrer Zeichenfolge benötigen, können Sie das formattedAttribut einfach verwenden und auf Folgendes festlegen false:

<string formatted="false">%a + %a == 2%a</string>

In diesem Fall wird die Zeichenfolge nicht als FormatterFormatzeichenfolge für verwendet, sodass Sie Ihre% -Symbole nicht maskieren müssen. Die resultierende Zeichenfolge lautet "% a +% a == 2% a".

Wenn Sie das formatted="false"Attribut weglassen , wird die Zeichenfolge als Formatzeichenfolge verwendet und Sie müssen die% -Symbole maskieren. Dies geschieht korrekt mit double-%:

<string>%%a + %%a == 2%%a</string>

Jetzt aapthaben Sie keine Fehler , aber je nachdem , wie Sie es verwenden, kann die resultierende Zeichenfolge sein „%% a + %% a == 2 %% a“ , wenn ein Formatterohne Format aufgerufen Argumente :

Resources res = context.getResources();

String s1 = res.getString(R.string.str);
// s1 == "%%a + %%a == 2%%a"

String s2 = res.getString(R.string.str, null);
// s2 == "%a + %a == 2%a"

Ohne XML und Code ist es schwierig zu sagen, was genau Ihr Problem ist, aber hoffentlich hilft dies Ihnen, die Mechanismen ein wenig besser zu verstehen.


1
Ich habe dies als Antwort ausgewählt, weil es funktionieren sollte, aber anscheinend gibt es einen Fehler, auf den ich mit dieser Zeichenfolge stoße. Deshalb habe ich mich für %% und "XXX.replaceAll (" %% ","% ") entschieden."
Zaid

4
Die Verwendung von formatiert = falsch funktioniert gut. So habe ich es benutzt: <string name = "information_description" formatted = "false"> \ 'Sweet \' 10% bis 20% sogar 35 Gew .-% Zucker </ string>
Jemand irgendwo

1
formatiert = falsch funktioniert auch bei mir gut. Mit %% wurde es buchstäblich als %% auf meinem Gerät und Emulator
angezeigt

formatiert = falsch hat in der Vergangenheit für mich gut funktioniert. jetzt (ADT 22), aus irgendeinem Grund nicht. und wenn ich verwende: "str = mContext.getString (R.string.str," hallo ")", wird diese Flusenwarnung angezeigt: "Formatzeichenfolge 'str' ist keine gültige Formatzeichenfolge, daher sollte sie nicht an übergeben werden String.format "
Android-Entwickler

1
Wenn Sie über <string-array /> zugreifen, verwenden Sie zum Drucken des Prozentsatzes \ u0025. Das hat bei mir funktioniert.
Chintan Shah

157

Um die App mit formatierten Zeichenfolgen aus Ressourcen zuzulassen, sollten Sie Ihre XML-Datei korrigieren. So zum Beispiel

<string name="app_name">Your App name, ver.%d</string>

sollte durch ersetzt werden

<string name="app_name">Your App name, ver.%1$d</string>

Sie können dies für Details sehen.


2
Vielen Dank, Sie haben das fehlende Glied bereitgestellt - im wahrsten Sinne des Wortes.
Akauppi

22
Für mehr Parameter Substitution (zB mit Strings), Verwendung %1$s, %2$susw.
CJBS

1
Wer wird eine so große Antwort auf dieses kleine Ding lesen? Danke, ich scrolle nach unten, um dich zu finden.
Janaka R Rajapaksha

73

Sie können% mit %% für XML-Parser umgehen, dies wird jedoch im Gerät zweimal angezeigt.

Versuchen Sie folgendes Format, um es einmal anzuzeigen: \%%

Beispielsweise

<string name="zone_50">Fat Burning (50\%% to 60\%%)</string> 

wird wie Fat Burning (50% to 60%)im Gerät angezeigt


6
\ %% verursacht Abstürze unter Nexus 4 4.2.1. Ich habe andere nicht getestet.
Jon Willis

Dies funktioniert gut und ist einfach, wenn Sie bereits wissen, wie viel Prozent Sie in Ihre Zeichenfolgen aufnehmen möchten, anstatt den Zeichenfolgenformatierer zu verwenden und diese fest codierten Werte immer programmgesteuert festlegen müssen.
Portfoliobuilder

Dies stürzte auch für mich auf Nexus 5.1.1 ab. @ViliusK Antwort ist die richtige.
Chan Jing Hong

2
Verwenden Sie einfach %% anstelle von%
Sundeep1501

37

Verwenden

<string name="win_percentage">%d%% wins</string>

bekommen

80% wins als formatierte Zeichenfolge.

Ich verwende die String.format()Methode, um die Nummer anstelle von einzufügen %d.


12

In Ihrer Datei strings.xml können Sie ein beliebiges Unicode-Zeichen verwenden.

Die Unicode-Nummer für das Prozentzeichen lautet beispielsweise 0025:

<string name="percent_sign">&#x0025;</string>

Eine umfassende Liste der Unicode-Zeichen finden Sie hier


1
Das macht keinen Sinn. & # x0025; und% sind in einer XML-Datei identisch.
BeniBela

Die Ressourcendatei wird in eine Java-Ressource konvertiert, und dabei wird das %Zeichen zurückgegeben. Ich fürchte, das löst das Problem nicht.
Paul Lammertsma

9

Um dem Prozentzeichen zu entkommen, benötigen Sie nur %%

zum Beispiel :

String.format("%1$d%%", 10)

gibt "10%" zurück


1
Ihre Antwort ist so ziemlich die gleiche wie einige andere existierende Antworten
Ben Rhys-Lewis

... und falsch, weil 10%nicht zurück %10. FIY: Wenn Sie verwenden String.format, sollten Sie jedes Mal das Gebietsschema angeben. Sie können wirklich überrascht sein, wenn Sie das Gebietsschema nicht eingeben und das arabische Gebietsschema für
Formatnummern verwenden

7

Nicht gerade Ihr Problem, aber ein ähnliches.

Wenn Ihr Zeichenfolgeneintrag mehr als eine Formatierung enthält, sollten Sie "% s" nicht mehrmals verwenden.

NICHT:

<string name="entry">Planned time %s - %s (%s)</string>

MACHEN :

<string name="entry">Planned time %1$s - %2$s (%3$s)</string>

5

Sie können% in XML mit %% maskieren, aber Sie müssen den Text in Code und nicht in Layout-XML festlegen.


1
Ja, es entkommt mit double% und lässt sich gut kompilieren. Wenn es jedoch auf einem Emulator oder sogar auf Geräten ausgeführt wird, kann es als %% angezeigt werden.
Samwize

5

Dies könnte dazu führen, dass die IDE zu streng wird.

Die Idee ist vernünftig. Im Allgemeinen sollten Sie die Reihenfolge der Substitutionsvariablen angeben, damit Ihr Java-Code nicht geändert werden muss, wenn Sie Ressourcen für eine andere Sprache hinzufügen. Hierbei gibt es jedoch zwei Probleme:

Erstens eine Zeichenfolge wie:

You will need %.5G %s

Um verwendet zu werden, wie Sie benötigen 2.1200 mg haben die Reihenfolge in jeder Sprache die gleiche, da diese Menge an Masse immer in dieser Reihenfolge wissenschaftlich dargestellt wird.

Das zweite ist, dass Sie, wenn Sie die Reihenfolge der Variablen in die Sprache setzen, in der Ihre Standardressourcen angegeben sind (z. B. Englisch), nur die Positionen in den Ressourcenzeichenfolgen für Sprachen angeben müssen, die eine andere Reihenfolge als Ihre Standardsprache verwenden.

Die gute Nachricht ist, dass dies einfach zu beheben ist. Auch wenn die Positionen nicht angegeben werden müssen und die IDE zu streng ist, geben Sie sie trotzdem an. Verwenden Sie für das obige Beispiel:

Sie benötigen% 1 $ .5G% 2 $ s



3

Versuchen Sie dieses (rechts):

<string name="content" formatted="false">Great application %s  ☞  %s  ☞  %s \\n\\nGo to download this application %s</string>


-1

Angenommen, Sie möchten anzeigen (50% RABATT) und zur Laufzeit 50 eingeben. Hier ist der Code:

<string name="format_discount"> (
<xliff:g id="discount">%1$s</xliff:g>
<xliff:g id="percentage_sign">%2$s</xliff:g>
 OFF)</string>

Verwenden Sie in der Java-Klasse diesen Code:

String formattedString=String.format(context.getString(R.string.format_discount),discountString,"%");
holder1.mTextViewDiscount.setText(formattedString);

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.