I have a question about formatting the Rupee currency (Indian Rupee - INR).
Typically a value like 450500
is formatted and shown as 450,500
. In India, the same value is displayed as 4,50,500
For example, numbers here are represented as:
1
10
100
1,000
10,000
1,00,000
10,00,000
1,00,00,000
10,00,00,000
Refer Indian Numbering System
The separators are after two digits, except for the last set, which is in thousands.
I've searched on the internet and people have asked to use the locale en_GB
or pattern #,##,##,##,##0.00
I tried this on JSTL by using the following tag:
<fmt:formatNumber value="${product.price}" type="currency"
pattern="#,##,##,##,###.00"/>
But this does not seem to solve the issue. Any help in this matter will be greatly appreciated.
Thanks
Unfortunately
DecimalFormat
doesn't support variable-width groups. So it won't ever format the values exactly as you want to:Most number formatting mechanisms in Java are based on that class and therefore inherit this flaw.
ICU4J (the Java version of the International Components for Unicode) provides a
NumberFormat
class that does support this formatting:This code will produce this output:
Note: the
com.ibm.icu.text.NumberFormat
class does not extend thejava.text.NumberFormat
class (because it already extends an ICU-internal base class), it does however extend thejava.text.Format
class, which has theformat(Object)
method.If there is no default Locale available and the user doesn't make any change to the locale, we can go with setting the currency symbol using unicode and decimal formatting. As in the below code:
For e.g. Setting the Indian currency symbol and formatting the value. This will work without user making changes in the settings.
Output:
With Android, this worked for me:
450500 gets formatted as 4,50,500
http://developer.android.com/reference/java/text/DecimalFormat.html - DecimalFormat supports two grouping sizes - the primary grouping size, and one used for all others.
This is what i did, for getting Indian currency format. if input is 1234567890 means output is 1,23,45,67,890.
Kotlin version, It works on Android API 26