Displaying Currency in Indian Numbering Format
Asked Answered
A

30

80

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.

Aril answered 21/3, 2011 at 14:41 Comment(1)
#2544954 here you can find the answerAli
W
101

Unfortunately on standard Java SE DecimalFormat doesn't support variable-width groups. So it won't ever format the values exactly as you want to:

If you supply a pattern with multiple grouping characters, the interval between the last one and the end of the integer is the one that is used. So "#,##,###,####" == "######,####" == "##,####,####".

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:

Format format = com.ibm.icu.text.NumberFormat.getCurrencyInstance(new Locale("en", "in"));
System.out.println(format.format(new BigDecimal("100000000")));

This code will produce this output:

Rs 10,00,00,000.00

Note: the com.ibm.icu.text.NumberFormat class does not extend the java.text.NumberFormat class (because it already extends an ICU-internal base class), it does however extend the java.text.Format class, which has the format(Object) method.

Note that the Android version of java.text.DecimalFormat class is implemented using ICU under the hood and does support the feature in the same way that the ICU class itself does (even though the summary incorrectly mentions that it's not supported).

Wilser answered 21/3, 2011 at 14:51 Comment(12)
I wonder, how many times has it been asked on good old forums.sun.com? Almost daily, isn't it? ;)Cacophony
I wanted to use it my Android App, but what is worrying me is that Jar file size is 9MB. My app currently is of size 2.5 MB, so adding 9MB to it seems like overkillImprobability
try using new DecimalFormat("₹ ##,##,##1");Stickle
@WandMaker For Android DecimalFormat seems to work. Look at Kiran's answer below.Reck
Solution given by @Unsocial is better. Uses the inbuild Java librariesTrondheim
@Funkyidol: re-read the question. The answer you mention doesn't give the desired output.Wilser
@JoachimSauer It does. I used the solution provided by CleanX and it worked perfectly for me. I did not had to include a new library to my Android appTrondheim
How to remove rupees symbolAfc
@MustafaShaikh: please ask this as a separate question.Wilser
I have searched for above in golang I got this library github.com/punithck/indianmoneyBivens
how to remove trailing "00"?Brachyuran
@PradipVadher: if you have a separate question, please post that as a question, not as a comment on a 9 year old answer.Wilser
E
31

With Android, this worked for me:

new DecimalFormat("##,##,##0").format(amount);

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.

Edom answered 31/8, 2013 at 3:51 Comment(4)
It gives me "450,501" which is not the right answer!Piecemeal
Surprisingly it's working in android and not in Java 8. Don't know why. Isn't it Java :DCashbook
@Cashbook Yes it works in Android. Tried this ##,##,###.##Memorize
I have searched for above in golang I got this library github.com/punithck/indianmoneyBivens
U
17

here is simple thing u can do ,

 float amount = 100000;

 NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en", "IN"));

 String moneyString = formatter.format(amount);

 System.out.println(moneyString);

The output will be Rs.100,000.00.

Unsocial answered 30/8, 2013 at 11:6 Comment(2)
But this is not what OP wants. He wants 1,00,000Cashbook
The code snippet above does not yet format the currency in Indian format of separation of every 2 digits by a comma and the last 3 digits before the decimal place.Demantoid
P
7

I also got myself in same problem. I was working with DecimalFormat.

I have no knowledge of JSTL but you can figure out something by my solution.

As, grouping size remains constant in DecimalFormat. I separated both parts, formatted them with different patterns and concat both. Here is the code.

public static String format(double value) {
    if(value < 1000) {
        return format("###", value);
    } else {
        double hundreds = value % 1000;
        int other = (int) (value / 1000);
        return format(",##", other) + ',' + format("000", hundreds);
    }
}

private static String format(String pattern, Object value) {
    return new DecimalFormat(pattern).format(value);
}

It will provide format like Indian Numbering System.

If you want decimal points, just add ".##" in both conditions.

"###" to "###.##" and "000" to "000.##".

Papacy answered 6/12, 2013 at 6:1 Comment(1)
This code has a huge bug. If you input 1999.95, it'll format it as 1,1000Cashbook
Z
7
public String getIndianCurrencyFormat(String amount) {
    StringBuilder stringBuilder = new StringBuilder();
    char amountArray[] = amount.toCharArray();
    int a = 0, b = 0;
    for (int i = amountArray.length - 1; i >= 0; i--) {
        if (a < 3) {
            stringBuilder.append(amountArray[i]);
            a++;
        } else if (b < 2) {
            if (b == 0) {
                stringBuilder.append(",");
                stringBuilder.append(amountArray[i]);
                b++;
            } else {
                stringBuilder.append(amountArray[i]);
                b = 0;
            }
        }
    }
    return stringBuilder.reverse().toString();
}

This is what i did, for getting Indian currency format. if input is 1234567890 means output is 1,23,45,67,890.

Zizith answered 13/3, 2017 at 8:42 Comment(2)
does this take care of floating point values?Litmus
no it not. but we can do it like find decimal values and keep separately and then add it with end result.Zizith
A
7

Try this:

NumberFormat.getCurrencyInstance(new Locale("en","IN")).format(number)

"en" is for English. "IN" is for the country (India).

Arnulfo answered 7/7, 2020 at 17:43 Comment(0)
B
5

enter image description here

Just Copy past this function. :)

  public static String rupeeFormat(String value){
            value=value.replace(",","");
            char lastDigit=value.charAt(value.length()-1);
            String result = "";
            int len = value.length()-1;
            int nDigits = 0;

            for (int i = len - 1; i >= 0; i--)
            {
                result = value.charAt(i) + result;
                nDigits++;
                if (((nDigits % 2) == 0) && (i > 0))
                {
                    result = "," + result;
                }
            }
            return (result+lastDigit);
        }
Breadwinner answered 16/7, 2015 at 8:13 Comment(2)
Instead of doing String concatenation, use StringBuilder.Odie
I liked the way you separated the last digit and simplified the problem!Congressional
K
4

The simple solution is -

Double amount = 5356673553123.0; //amount is an example ,can be used with any double value

**DecimalFormat IndianCurrencyFormat = new DecimalFormat("##,##,###.00");**

then use it as -

String formattedAmount = IndianCurrencyFormat.format(amount);
Kory answered 9/3, 2016 at 6:14 Comment(1)
Though I am very late to this topic, here are results of trying your code on a regular laptop with Java 8. The amount you have used gives the output as 5,356,673,553,123.00 This is still not the Indian format where every 2 digits are separated by comma except the last set of 3 digits before the decimal point.Demantoid
P
4

Please find below snippet to print currency according to locale by giving inputs

import java.util.*;
import java.text.*;

public class CurrencyPayment {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double payment = scanner.nextDouble();
        scanner.close();

        System.out.println("US: " + NumberFormat.getCurrencyInstance(Locale.US).format(payment));
        System.out.println("India: " + NumberFormat.getCurrencyInstance(new Locale("en","IN")).format(payment));
        System.out.println("China: " + NumberFormat.getCurrencyInstance(Locale.CHINA).format(payment));
        System.out.println("France: " + NumberFormat.getCurrencyInstance(Locale.FRANCE).format(payment));
    }
}
Pained answered 15/10, 2021 at 9:35 Comment(0)
C
3

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.

    Locale locale = new Locale("en","IN");
    DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getCurrencyInstance(locale);
    DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(locale);
    dfs.setCurrencySymbol("\u20B9");
    decimalFormat.setDecimalFormatSymbols(dfs);
    System.out.println(decimalFormat.format(payment));

Output:

₹12,324.13
Carlstrom answered 27/7, 2017 at 6:22 Comment(1)
This is the best answer for Android, however not sure if it works on other Java platforms.Zomba
E
2

On Android android.icu.text.NumberFormat is available after api level 24 only. So to support lower version I wrote my own method in java.

public static String formatIndianCommaSeparated(long rupee){
    // remove sign if present
    String raw = String.valueOf(Math.abs(rupee));
    int numDigits = raw.length();
    StringBuilder sb = new StringBuilder(raw);
    // Reverse the string to start from right most digits
    sb = sb.reverse();
    // Counter to keep track of number of commas placed
    int commas = 0;
    for (int i=0; i<numDigits; i++){
        // Insert a comma if i is in the range [3, 5, 7, 9, ...)
        if (i % 2 == 1 && i != 1 ){
            sb.insert(i+commas, ",");
            commas++;
        }
    }
    // Reverse the string back to get original number
    String sign = (rupee < 0) ? "-" : "";
    return sign + sb.reverse().toString();
}
Enscroll answered 12/10, 2017 at 7:56 Comment(0)
T
2

Kotlin version, It works on Android API 26

fun currencyLocale(value: Double): String {
    val formatter = NumberFormat.getCurrencyInstance(Locale("en", "in"))
    return formatter.format(value)
}

fun parseCommaSeparatedCurrency(value: String): Number {
    return NumberFormat.getCurrencyInstance(Locale("en", "in")).parse(value)
}
Tannate answered 1/11, 2017 at 5:22 Comment(0)
T
2

Few options that I explored are as below

    import java.text.NumberFormat;
    import java.util.Locale;

    class NumberFormatDemo {

        public static void main(String[] args) {
            Double d = 45124853123456.78941;
            NumberFormat nf = NumberFormat.getInstance(Locale.ITALY);
            System.out.println("ITALY representation of " + d + " : " + nf.format(d));

            nf = NumberFormat.getInstance(Locale.GERMANY);
            System.out.println("GERMANY representation of " + d + " : " + nf.format(d));

            nf = NumberFormat.getInstance(Locale.CHINESE);
            System.out.println("CHINESE representation of " + d + " : " + nf.format(d));

            nf = NumberFormat.getInstance(Locale.US);
            System.out.println("US representation of " + d + " : " + nf.format(d));

            nf = NumberFormat.getInstance(Locale.ENGLISH);
            System.out.println("ENGLISH representation of " + d + " : " + nf.format(d));

            nf = NumberFormat.getInstance(Locale.UK);
            System.out.println("UK representation of " + d + " : " + nf.format(d));

            //===================================================
            //ICU4j example
            com.ibm.icu.text.NumberFormat format = com.ibm.icu.text.NumberFormat.getCurrencyInstance(new Locale("en", "in"));
            System.out.println("INDIA representation of " + d + " : " + nf.format(d));
        }
    }

The last one reacquires following dependency

<dependency>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
<version>65.1</version>
</dependency>
Tammany answered 20/11, 2019 at 8:12 Comment(1)
works perfectly for meHogue
M
1
//Input:
long num = 450500;

// Unlike other countries, there is no direct Locale field for India.Therefore, we need to construct a locale for India.
Locale loc = new Locale("en", "in"); // This will display currency with "Rs." symbol.

// or use below to display currency with "INR" symbol.
Locale loc = new Locale("", "in");

NumberFormat indiacurrency = NumberFormat.getCurrencyInstance(loc);
String result = indiacurrency.format(num);
System.out.print(result);
Monkish answered 1/12, 2016 at 15:49 Comment(0)
P
1
public static String paiseToString(long paise)
{
    DecimalFormat fmt = new DecimalFormat("#0.00");
    boolean minus = paise < 0;
    StringBuilder sb = new StringBuilder(fmt.format(Math.abs(paise)/100.0));
    for (int index = sb.length()-6; index > 0; index-=2)
    {
        sb.insert(index,',');
    }
    if (minus)
       sb.insert(0,'-');
    return sb.toString();
}

public static String rupeesToString(long rupees)
{
    boolean minus = rupees < 0;
    StringBuilder sb = new StringBuilder(Long.toString(Math.abs(rupees)));
    for (int index = sb.length()-3; index > 0; index-=2)
    {
        sb.insert(index,',');
    }
    if (minus)
       sb.insert(0,'-');
    return sb.toString();
}

// Test the functions
public static void main(String[] args)
{
    // Test for positive values
    long val = 1;
    while (val < Long.MAX_VALUE/10)
    {
        System.out.printf("%28s %28s\n",paiseToString(val),rupeesToString(val));
        val *= 10;
    }
    // Test for negative values
    val = -1;
    while (val > Long.MIN_VALUE/10)
    {
        System.out.printf("%28s %28s\n",paiseToString(val),rupeesToString(val));
        val *= 10;
    }       
}
Priestcraft answered 20/2, 2020 at 10:0 Comment(1)
Thanks a lot. This is compact, works like a charm for Indian rupees.Demantoid
A
0

The default methods in existing libraries can only show thousands seperator. so we need to write custom function for this. You can use multiple substring operation to get the desired result.

In java,

function indianCurrencyNumberFormat(rupee) {
    string explore_remaining_units = "";
    if (rupee.length() > 3) {
        last_three_digits = rupee.substring((rupee.length()-3), rupee.length());
        remaining_units = rupee.substring(0, (rupee.length()-3)); 
        remaining_units =  ((remaining_units.length()) % 2 == 1) ? "0"+remaining_units : remaining_units; 
        split_rupee = remaining_units.split("(?<=^(.{2})+)")
        for (i = 0; i < sizeof(split_rupee); i++) {
          explore_remaining_units += ((i == 0) ? ( (int) split_rupee[i]+"," ) : ( split_rupee[i]+"," ));  
        }
        formatted_rupee = explore_remaining_units+last_three_digits;
    } else {
        formatted_rupee = rupee;
    }
    return formatted_rupee; 
}

And in php:

function indianCurrencyNumberFormat($rupee) {
    $explore_remaining_units = "";
    if (strlen($rupee) > 3) {
        $last_three_digits = substr($rupee, strlen($rupee) - 3, strlen($rupee));
        $remaining_units = substr($rupee, 0, strlen($rupee) - 3); 
        $remaining_units = (strlen($remaining_units) % 2 == 1) ? "0".$remaining_units : $remaining_units; 
        $split_rupee = str_split($remaining_units, 2);
        for ($i = 0; $i < sizeof($split_rupee); $i++) {
          $explore_remaining_units .= (($i == 0) ? ( (int) $split_rupee[$i] . "," ) : ( $split_rupee[$i] . "," ));  
        }
        $formatted_rupee = $explore_remaining_units.$last_three_digits;
    } else {
        $formatted_rupee = $rupee;
    }
    return $formatted_rupee; 
}

You can see more details here.

Alley answered 31/5, 2014 at 4:56 Comment(0)
W
0
import java.util.*;

public class string1 {

     public static void main(String args[])
     {
         int i,j;
         boolean op=false;

         StringBuffer sbuffer = new StringBuffer();
         Scanner input = new Scanner(System.in);
         System.out.println("Enter a string");
         sbuffer.append(input.nextLine());

         int length=sbuffer.length();
         if(sbuffer.length()<3)
         {
             System.out.println("string="+sbuffer);
         }
         else
         {
             for ( i = sbuffer.length(); i >0; i--) 
             {

                 if (i==length-3)
                 {
                     sbuffer.insert(i, ",");
                      op=true;
                 }
                 while(i>1 && op==true)
                 {
                     i=i-2;

                     if(i>=1)
                     {

                     sbuffer.insert(i, ",");
                     }
                 }
             }

         }
         System.out.println("string="+sbuffer);
     }
}
Wooldridge answered 27/9, 2016 at 2:49 Comment(1)
Some text explaining this code would be more helpful.Mccallum
I
0

It is better answer and works dynamically instead of specifying single Locale in code manually.

public String convertToDefaultCurrencyFormat(String amountToConvert){
    NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.getDefault());
    String moneyString = formatter.format(Double.valueOf(amountToConvert));
    return moneyString;
}   

for Indian rupees format change Language in your Android device:

Setting > Language & Input Settings > choose English(India)

Output:

₹10,00,000 (Starting with Indian Rupee symbol)
Impound answered 20/1, 2017 at 7:39 Comment(0)
T
0

Working fine for me in Android:

public static String priceFormatWithDec(String price) {
    DecimalFormat decimalFormat = new DecimalFormat("#,##,###.00");
    String format = decimalFormat.format(Double.parseDouble(price));
    return String.format("%s", format);
}
Tightlipped answered 1/4, 2020 at 13:38 Comment(0)
I
0

using Locale class and getCurrencyInstance the Indian currency format can be obtained.

while defining the new Locale for India use "en" for English and "hi" for Hindi.

for locale refer https://docs.oracle.com/javase/8/docs/api/java/util/Locale.html

for getCurrencyInstance refer https://docs.oracle.com/javase/8/docs/api/java/text/NumberFormat.html#getCurrencyInstance--

here is a small implementation of the same.

import java.util.*;
import java.text.*;
import java.text.NumberFormat;
import java.util.Locale;

public class Solution {

    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    double payment = scanner.nextDouble();
    scanner.close();

    Locale indialocale=new Locale("en","IN");
    NumberFormat india  = NumberFormat.getCurrencyInstance(indialocale);
    System.out.println("India: " + india.format(payment));
    }

}

Inaptitude answered 11/5, 2020 at 18:59 Comment(0)
S
0

This is working for me ..

public String indianCurrencyFormat(String s) {

    String orignalNo = s;
    String formatted = "";

    if(orignalNo.startsWith("-")) {
        s = s.replace("-","");
    }

    if(orignalNo.contains(".")) {
        if(s.length() > 6){
            StringBuilder sb=new StringBuilder(s);
            s = sb.reverse().toString();

            formatted = s.substring(0,6);
            s = s.substring(6);

            while(s.length() > 1) {
                formatted += "," + s.substring(0,2);
                s = s.substring(2);
            }

            sb = new StringBuilder(formatted+(StringUtils.isNotBlank(s) ? ","+s :""));
            formatted = sb.reverse().toString();
        } else {
            formatted = s;
        }
    } else {
        if(s.length() > 3){
            StringBuilder sb=new StringBuilder(s);
            s = sb.reverse().toString();

            formatted = s.substring(0,3);
            s = s.substring(3);

            while(s.length() > 1) {
                formatted += "," + s.substring(0,2);
                s = s.substring(2);
            }

            sb = new StringBuilder(formatted+(StringUtils.isNotBlank(s) ? ","+s :""));
            formatted = sb.reverse().toString();
        } else {
            formatted = s;
        }
    }

    if (orignalNo.startsWith("-")){
        formatted = "-"+formatted;
    }

    return formatted;
}
Southwest answered 10/6, 2020 at 10:13 Comment(0)
T
0

It worked for me:

fun getFormattedPrice(price: Double?): String {
        if (price == null) return "0"
        val formatter = DecimalFormat("##,##,###.00").format(price)
        var formattedPrice = formatter.format(price)
        if (formattedPrice.endsWith(".00")) formattedPrice = formattedPrice.dropLast(3)
        if (formattedPrice.isEmpty()) formattedPrice = "0"
        return formattedPrice
    }
Teleology answered 14/7, 2022 at 10:55 Comment(0)
C
0

Try this:

double number = 100000.00

NumberFormat numberFormat = new NumberFormat();

Locale locale = new Locale("hi","IN");

numberFormat = Numberformat.getCurrencyInstance(locale);

double yourFormattedNumber = numberFormat(number);

OutPut = ₹1,00,000.00

//Remove "₹" using String.replace()

String myFormattedNumber = numberFormat.format(number).replace("₹","");

OutPut = 1,00,000.00 Enjoy!! Happy coding

Consultant answered 15/1, 2023 at 8:32 Comment(0)
L
0

I faced a similar question in an interview and I used the below code.

 import java.util.Scanner;

class AssignmentFour {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        sc.close();
        StringBuilder sb = new StringBuilder(str);
        int length = sb.length();
        if (length > 4) {
            for (int i = length - 3; i > 0; i -= 2) {
                sb.insert(i, ",");
            }
        }
        System.out.println(sb.toString());
    }
}
Lothario answered 14/3, 2023 at 9:50 Comment(0)
T
0
public static String addCommaToCurrency(String value) {
    // 100
   if(value.length()>3) {
       String[] arr = value.split("\\.");
       System.out.println(arr[0]);
       //0987654321
       
       boolean addCommaAfterThree = true;
       
       StringBuilder reverseValue = new StringBuilder(arr[0]).reverse();
       String commaAddedValue = "";
       int counter = 0;
       System.out.println("reverseValue length: "+reverseValue.length());
       
       for(int i=0; i<reverseValue.length(); i++) {
           if(addCommaAfterThree && counter == 3) {
               commaAddedValue = commaAddedValue+","+reverseValue.charAt(i); //098,7
               counter = 1;
               addCommaAfterThree = false;
           } else if(counter == 2 && !addCommaAfterThree) {
               commaAddedValue = commaAddedValue+","+reverseValue.charAt(i); //098,7
               counter = 1;
           } else {
               commaAddedValue = commaAddedValue+reverseValue.charAt(i) +""; 
               counter = counter +1;
           }
       }
       
       System.out.println("Comma Added value "+new StringBuilder(commaAddedValue).reverse().append("."+arr[1]));
       return new StringBuilder(commaAddedValue).reverse().append("."+arr[1]).toString();
   }
   return value;}

Kindly use this method it working it was my project requirement

Teeth answered 6/10, 2023 at 13:26 Comment(0)
P
0
import com.ibm.icu.text.NumberFormat;
import java.util.Locale;

// use 'en_IN' as language in Locale. This will give you desired output without "Rs" before number

Locale indianLocale = new Locale("en_IN", "IN");
NumberFormat indianFormat1 = NumberFormat.getNumberInstance(indianLocale);
Plumate answered 12/2, 2024 at 14:55 Comment(1)
As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.Vergos
S
-1
 fun currencyFormatter(inputNumbers: String?): String {
        var formattedNumber = ""
        var decimalPoint=""
        var inputNumber=""

        if (inputNumbers != null) {
            try {
                val sp=inputNumbers.split(".")
                inputNumber=sp[0]
                decimalPoint=sp[1]
            } catch (e: Exception) {
                inputNumber=inputNumbers
            }


            formattedNumber = when {
                inputNumber.length <= 3 -> {
                    inputNumber
                }
                inputNumber.length <= 5 -> {
                    String.format("%s,%s", inputNumber.substring(0, inputNumber.length - 3),
                        inputNumber.substring(inputNumber.length - 3))
                }
                inputNumber.length <= 7 -> {
                    String.format("%s,%s,%s",
                        inputNumber.substring(0, inputNumber.length - 5),
                        inputNumber.substring(inputNumber.length - 5, inputNumber.length - 3),
                        inputNumber.substring(inputNumber.length - 3)
                    )
                }
                inputNumber.length <= 9 -> {
                    String.format("%s,%s,%s,%s",
                        inputNumber.substring(0, inputNumber.length - 7),
                        inputNumber.substring(inputNumber.length - 7, inputNumber.length - 5),
                        inputNumber.substring(inputNumber.length - 5, inputNumber.length - 3),
                        inputNumber.substring(inputNumber.length - 3)
                    )
                }
                else -> inputNumber
            }
        }
        return "$formattedNumber.$decimalPoint"
    }

main(){
 val rs=1200.55f
    print(currencyFormatter(rs.toString()))
}

Shebashebang answered 26/1, 2020 at 19:9 Comment(0)
A
-1
  1. Converting any Number into Indian Rupee Format in Golang.
  2. Function IndianRupeeFormat takes paramter as string and returns as string
    func IndianRupeeFormat(DisplayAmount string) string {
        AmountDisplayed := DisplayAmount[:len(DisplayAmount)-3] // just removing decimal point numbers.
        IndianRupee := ""
        if len(AmountDisplayed) > 3 { // amount should to greater than 999 if "," should appear , so length should be greater than 3
            startIndex := math.Mod(float64(len(AmountDisplayed)), 2) // startIndex is taken as slicing part to add comma.
            noOfCommas := (len(AmountDisplayed) / 2) - 1             // No of Commas appear in the number.
            startSlice := 0                                          // start of the slice
            for i := 0; i < noOfCommas; i++ {
                IndianRupee = IndianRupee + DisplayAmount[startSlice:int64(startIndex)+1] + ","
                startIndex = startIndex + 2 // adding +2 because after first comma we are skipping 2 digits to add another comma.
                startSlice = int(startIndex) - 1
            }
            k := len(DisplayAmount) - 6
            IndianRupee = IndianRupee + DisplayAmount[k:] // adding the rest of digits.
        } else {
            IndianRupee = DisplayAmount
        }
        return IndianRupee
    }
    
    Amount1 := IndianRupeeFormat(fmt.Sprintf("%.2f",100))
    Amount2 := IndianRupeeFormat(fmt.Sprintf("%.2f",1000.345))
    Amount3 := IndianRupeeFormat(fmt.Sprintf("%.2f",10000.02))
    Amount4 := IndianRupeeFormat(fmt.Sprintf("%.2f",100000.100))
    Amount5 := IndianRupeeFormat(fmt.Sprintf("%.2f",1000000.))
    Amount6 := IndianRupeeFormat(fmt.Sprintf("%.2f",1000.090))
    fmt.Println(Amount1)
    fmt.Println(Amount2)
    fmt.Println(Amount3)
    fmt.Println(Amount4)
    fmt.Println(Amount5)
    fmt.Println(Amount6)
    // Output: 100
    // Output: 1,000.34
    // Output: 10,000.02
    // Output: 1,00,000.10
    // Output: 10,00,000.00
    // Output: 1,000.90
    
Ara answered 7/1, 2022 at 11:45 Comment(0)
X
-2

I know this is an old question but I'll add my answer just in case. It is possible to use the same decimal formatter in a roundabout way to achieve the result but it isn't the most efficient solution, just a simpler one.

import java.math.RoundingMode;
import java.text.DecimalFormat;

public class IndianMoneyFormat {

    static String indianCurrencyFormat(double money) {
        String result = null;

        double aboveThousands = money / 1000;
        double thousands = money % 1000;

        if (aboveThousands > 1) {
            DecimalFormat formatter = new DecimalFormat("##,##");
            formatter.setRoundingMode(RoundingMode.DOWN); //will round towards zero whether negative or positive. Same as truncating.
            String one = formatter.format(aboveThousands);

            formatter.applyPattern("###.00");
            formatter.setRoundingMode(RoundingMode.HALF_EVEN); //default rounding mode of DecimalFormat
            String two = formatter.format(thousands);

            result = one + "," + two;
            return result;
        } else {
            DecimalFormat formatter = new DecimalFormat("###.00");
            result = formatter.format(money);
            return result;
        }
    }

    public static void main(String[] args) {
        double money1 = 123000999.5;
        double money2 = 999.39;
        System.out.println(indianCurrencyFormat(money1));
        System.out.println(indianCurrencyFormat(money2));
    }
}

Above code will provide the following result:

12,30,00,999.50
999.39
Xebec answered 16/9, 2021 at 8:56 Comment(0)
D
-4

ALTER FUNCTION [dbo].[udf_CurrencyFormat](@UC varchar(50)) RETURNS varchar(50) AS BEGIN declare @FC varchar(50),@Scale varchar(3),@i bigint=1,@a int=3,@b int=2,@WhileLength bigint,@UCScale varchar(50), @Con varchar(20) set @Scale=charindex('.',@UC) --if number has '.' then value else '0' if(@Scale!='0') begin set @UCScale=@UC set @Con=substring(@UCScale,charindex('.',@UCScale),3) set @UC=substring(@UC,0,charindex('.',@UC)) -- substring end if(cast(len(@UC) as bigint)%2!=0) --if odd begin set @WhileLength=(cast(len(@UC) as bigint)-3)/2 while(@i<=@WhileLength) -- length-3/2=3 if length is 9 (cast(len(@UC) as bigint)-3)/2 begin set @a=3*@i set @UC = stuff(@UC,@a,0,',') set @i=@i+1 end --while set @FC=@UC end --if odd Scale '0' else if(cast(len(@UC) as bigint)%2=0) --if even begin set @WhileLength=(((cast(len(@UC) as bigint)-1)-3)/2)+1 while(@i<=@WhileLength) begin if(@i=1) begin set @UC=stuff(@UC,@b,0,',') end else begin set @b=@b+3 set @UC=stuff(@UC,@b,0,',') end set @i=@i+1 end set @FC=@UC end if(@Scale!='0') begin set @FC=@FC+@Con end --if(@Scale!='0') --set @FC=@UC return @FC END

Dicker answered 2/6, 2017 at 5:1 Comment(1)
This TSQL function formats yours currency value with required commas, like 1000 to 1,000 or 10000 to 10,000. You just need to call copy-paste & execute the function and call like this : select dbo.udf_CurrencyFormat(123456)Dicker

© 2022 - 2025 — McMap. All rights reserved.