Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android decimalformat for arabic, symbol is on right side of number

I'm trying to support RTL to left languages, and I'm testing with Arabic (which I know nothing about).

Is the negative/positive symbol supposed to be on the right or left of the number? I think it's supposed to be on the left, but when I use Android's DecimalFormat to put the number in the locale the device is set to, the symbol appears on the right..

Has anyone encountered this, know how to work around it? Best I can think is to print it with parentheses if it's negative, that should get around this but isnt ideal.

EDIT

Sorry, code always helps. If I print the below (and the longitude is negative):

DecimalFormat coord_df = new DecimalFormat("#.000000");
coord_df.format(loc.getLongitude())

It's printed like this

##,######-

where the # signs are numbers in arabic (like those shown on the eastern arabic row here: http://en.wikipedia.org/wiki/Eastern_Arabic_numerals)

I need to get the negative on the correct side of the number (which is the left I believe)

SOLUTION

I ended up just checking whether the device was in RTL whenever I needed to mess with displaying numbers like the answer here: android determine if device is in right to left language/layout

If the device is RTL then I use a negative subpattern with a negative sign as a suffix like this:

"#.000000,#.000000-"
like image 953
joshkendrick Avatar asked Oct 24 '14 15:10

joshkendrick


People also ask

How do you round a double to two decimal places on Android?

You can use String. format("%. 2f", d) , your double will be rounded automatically.

What does DecimalFormat return?

Returns a copy of the decimal format symbols, which is generally not changed by the programmer or user. Return the grouping size. Gets the maximum number of digits allowed in the fraction portion of a number. Gets the maximum number of digits allowed in the integer portion of a number.

How do you change the decimal separator in Java?

Use String.format("%. 2f", d); This method uses our JVM's default Locale to choose the decimal separator. For example, it would be a dot for US Locale, and for GERMANY, it would be a comma.


2 Answers

Just sharing another approach, in your text views you can set the text direction to Left to Right, it will shows the negative sign correctly.

textView.setTextDirection(TextView.TEXT_DIRECTION_LTR);
like image 183
Mina Wissa Avatar answered Sep 26 '22 00:09

Mina Wissa


You can handle this by a specific pattern set in string.xml, separate the symbol (minus) from the absolute value of your number:

In string.xml (standard value)

<string name="number_pattern">%1$s%2$.0f</string>

In string.xml (Arabic value)

<string name="number_pattern">%2$.0f%1$s</string>

In your java program, pass the value parameters (absolute value and symbol) like bellow:

double numberAbs = (number< 0 ? -number: number);
String symbol = (number < 0 ? "-" : "");
return String.format(new Locale("en", "US"), getContext().getString(R.string.number_pattern), symbol, numberAbs);
like image 34
Shessuky Avatar answered Sep 23 '22 00:09

Shessuky