Android XML Percent Symbol

AndroidXmlAndroid ResourcesXliff

Android Problem Overview


I have an array of strings in which the % symbol is used. Proper format for using the % is %. When I have a string in that array with multiple % it gives me this error.

 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

Android Solutions


Solution 1 - Android

The Android Asset Packaging Tool (aapt) has become very strict in its latest release and is now used for all Android versions. The aapt-error you're getting is generated because it no longer allows non-positional format specifiers.

Here are a few ideas how you can include the %-symbol in your resource strings.

If you don't need any format specifiers or substitutions in your string you can simply make use of the formatted attribute and set it to false:

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

In this case the string is not used as a format string for the Formatter so you don't have to escape your %-symbols. The resulting string is "%a + %a == 2%a".

If you omit the formatted="false" attribute, the string is used as a format string and you have to escape the %-symbols. This is correctly done with double-%:

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

Now aapt gives you no errors but depending on how you use it, the resulting string can be "%%a + %%a == 2%%a" if a Formatter is invoked without any format arguments:

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"

Without any xml and code it is difficult to say what exactly your problem is but hopefully this helps you understand the mechanisms a little better.

Solution 2 - Android

To allow the app using formatted strings from resources you should correct your xml. So, for example

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

should be replaced with

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

You can see this for details.

Solution 3 - Android

You can escape % using %% for XML parser, but it is shown twice in device.

To show it once, try following format: \%%

For Example

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

is shown as Fat Burning (50% to 60%) in device

Solution 4 - Android

Use

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

to get

80% wins as a formatted string.

I'm using String.format() method to get the number inserted instead of %d.

Solution 5 - Android

to escape the percent symbol, you just need %%

for example :

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

returns "10%"

Solution 6 - Android

In your strings.xml file you can use any Unicode sign you want.

For example, the Unicode number for percent sign is 0025:

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

You can see a comprehensive list of Unicode signs here

Solution 7 - Android

Not exactly your problem but a similar one.

If you have more than one formatting in your string entry, you should not use "%s" multiple times.

DON'T :

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

DO :

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

Solution 8 - Android

You can escape the % in xml with %%, but you need to set the text in code, not in layout xml.

Solution 9 - Android

A tricky method: using small percent sign as below

Fat Burning (50﹪ to 60﹪)

Percent Sign on Wikipedia

Solution 10 - Android

This could be a case of the IDE becoming too strict.

The idea is sound, in general you should specify the order of substitution variables so that should you add resources for another language, your java code will not need to be changed. However there are two issues with this:

Firstly, a string such as:

You will need %.5G %s

to be used as You will need 2.1200 mg will have the order the same in any language as that amount of mass is always represented in that order scientifically.

The second is that if you put the order of variables in what ever language your default resources are specified in (eg English) then you only need to specify the positions in the resource strings for languages the use a different order to your default language.

The good news is that this is simple to fix. Even though there is no need to specify the positions, and the IDE is being overly strict, just specify them anyway. For the example above use:

> You will need %1$.5G %2$s

Solution 11 - Android

Try this one (right):

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

Solution 12 - Android

Per google official documentation, use %1$s and %2$s http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling

Hello, %1$s! You have %2$d new messages.

Solution 13 - Android

Suppose you want to show (50% OFF) and enter 50 at runtime. Here is the code:

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

In the java class use this code:

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

Solution 14 - Android

Try using a backslash in front of it, like below:

\%

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionzaidView Question on Stackoverflow
Solution 1 - AndroidJosef PflegerView Answer on Stackoverflow
Solution 2 - AndroidPaul E.View Answer on Stackoverflow
Solution 3 - AndroidpavblazekView Answer on Stackoverflow
Solution 4 - AndroidViliusKView Answer on Stackoverflow
Solution 5 - AndroidlanderlyoungView Answer on Stackoverflow
Solution 6 - AndroidAsaf PinhassiView Answer on Stackoverflow
Solution 7 - AndroidGarytechView Answer on Stackoverflow
Solution 8 - AndroidMeeView Answer on Stackoverflow
Solution 9 - AndroidBao LeView Answer on Stackoverflow
Solution 10 - AndroidSteve WaringView Answer on Stackoverflow
Solution 11 - AndroidsonidaView Answer on Stackoverflow
Solution 12 - AndroidtechtinkererView Answer on Stackoverflow
Solution 13 - AndroidHarish RanaView Answer on Stackoverflow
Solution 14 - AndroidlolraccoonView Answer on Stackoverflow