64

I want to have a parameter in one string in strings.xml and this parameter should be a double value. So I use %1$f. Here - http://developer.android.com/reference/java/util/Formatter.html there are many examples, but what if I want to have have a few double/float parameters and I want only the second one to have 2 digits after .? I tried to use combinations like %2$.2f or %2.2$f. Nor of them worked. %.1f does not work as well. So, does anybody know how can I "customize" a float/double value inside a strings.xml? Thanks.

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
lomza
  • 9,412
  • 15
  • 70
  • 85

7 Answers7

173

Just adding to @David Airam's answer here; the "incorrect" solution he gives is actually correct, but with a bit of tweaking. The XML file should contain:

<string name="resource1">Hello string: %1$s, and hello float: %2$.2f.</string>

Now in the Java code:

String svalue = "test";
float sfloat= 3.1415926;
String sresult = getString(R.string.resource1, svalue, sfloat);

The exception that @David Airam reported is from trying to jam a String into a format specifier with %f, which requires a floating point type. Use float and there is no such exception.

Also, you can use Float.valueOf() to convert a String to a float in case your input data was originally a string (say, from a EditText or something). However, you should always try/catch valueOf() operations and handle the NumberFormatException case, since this exception is unchecked.

Nik Reiman
  • 39,067
  • 29
  • 104
  • 160
9

%.1f work for me if you like to show only 1 digit after ','

Wael Ouni
  • 117
  • 1
  • 4
4

Define is strings.xml file

  <string name="price_format">$%,.2f</string>

//For using in databinding  where amount is double type
    android:text="@{@string/price_format(model.amount)}"

//For using in java runtime where priceOfModifier is double type
                amountEt.setText(context.getResources().getString(R.string.price_format, priceOfModifier));
Aditya Rohilla
  • 389
  • 3
  • 10
1

This worked for me.

<string name="market_price">Range ₹%1$.0f - ₹%2$.0f</string>
android:text="@{@string/market_price(viewModel.suggestedPriceRange.max, viewModel.suggestedPriceRange.min)}"

Outputs: Range ₹500 - ₹1000

In ₹%1$.0f, .0f defines how many digits you want after the decimal.

OhhhThatVarun
  • 3,981
  • 2
  • 26
  • 49
1

A simpler approach:

<string name="decimalunit">%.2f%n</string>

float sfloat= 3.1475926; String sresult = getString(R.string.decimalunit, sfloat);

Output: 3.15

Genie
  • 51
  • 7
-6

I now that this reply is arriving too late... but I hope to be able to help other people:

Android sucks with multiple parameters substitutions when you want decimal numbers and format this in common style %a.bf

The best solution I have found (and only for these kind of resources) is put the decimal parameters as strings %n$s and in the code apply my conversion with String.format(...)



Example:


INCORRECT WAY:

// In xml file:

<string name="resource1">You has a desviation of %1$s and that is a %2$.2f%% percentage.</string>

// And in java file

  String sresult = getString(R.string.resource1, svalue, spercentage); // <-- exception!

This solution is technically correct but incorrect due to android substitution resources system so the last line will generate an exception.



CORRECT WAY / SOLUTION:

Simply convert the second parameter into a String.

<string name="resource1">You has a desviation of %1$s and that is a %2$s percentage.</string>

And now in the code:

...

  // This is the auxiliar line added to solve the problem
  String spercentage = String.format("%.2f%%",percentage);

  // This is the common code where we use the last variable.
  String sresult = getString(R.string.resource1, svalue, spercentage);
  • 1
    What is the type of `spercentage` in your "incorrect" example? I'm guessing (as @Nik Reiman points out) that it's a `String` - i.e. no wonder you're getting an exception when trying to pass it as a float (at `%2$.2f`). This "answer" is incomplete and misleading. – Magnus Aug 12 '16 at 16:23
  • I also can't get formatted floats to work from a string resource, and yes I'm passing a float. I use "%1$0.6f" in the string resource, and I get an exception: java.util.MissingFormatWidthException: %01$.6f so it's getting mangled somehow. This answer is correct. – Aaron Jan 08 '18 at 21:08
-6

If it were me I'd store the values in the resources as simple values, and then use formatter methods to control how they're displayed, roughly like this

public String formatFigureTwoPlaces(float value) {
    DecimalFormat myFormatter = new DecimalFormat("##0.00");
    return myFormatter.format(value);
}

public String formatFigureOnePlace(float value) {
    DecimalFormat myFormatter = new DecimalFormat("##0.0");
    return myFormatter.format(value);
}
Ollie C
  • 28,313
  • 34
  • 134
  • 217