lomza
lomza

Reputation: 9716

Double parameter with 2 digits after dot in strings.xml?

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.

Upvotes: 71

Views: 59744

Answers (7)

Genie
Genie

Reputation: 61

A simpler approach:

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

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

Output: 3.15

Upvotes: 2

OhhhThatVarun
OhhhThatVarun

Reputation: 4321

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.

Upvotes: 1

Aditya Rohilla
Aditya Rohilla

Reputation: 389

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));

Upvotes: 4

Wael Ouni
Wael Ouni

Reputation: 117

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

Upvotes: 9

Nik Reiman
Nik Reiman

Reputation: 40390

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.

Upvotes: 181

David Airam
David Airam

Reputation: 23

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);

Upvotes: -6

Ollie C
Ollie C

Reputation: 28509

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);
}

Upvotes: -6

Related Questions