How to convert a number into a formatted string?

  • Note: there is an extensive discussion on converting a string into a decimal. This question asks how to convert a number into a formatted string.

    Given a decimal variable, how can I convert that into a formatted string, such as a currency string, i.e. 2000 would become "$2,000.00"? I would have thought this would be an easy task, given the formatting options available in visualforce, e.g. <apex:outputtext value="{0,number,$#,###.##}">, but there doesn't seem to be analagous functionality for apex. Is there a simple method for achieve this?

    I first looked at the decimal.format() method, but this doesn't take any parameters. Was hoping for something like this

    Decimal input = 2000;
    String output = input.format('$#,###.##');
    

    I also looked at the String.format(formatString, inputArray) but you can only use string data types for the input array. Was hoping for something like this

    Decimal input = 2000;
    String output = String.format('$#,###.##',new Object[] { input });
    

    This is discussed at length in this existing SFSE thread: [What is a concise function that formats a (String) decimal into a currency format in Apex?][1] [1]: http://salesforce.stackexchange.com/questions/318/what-is-a-concise-function-that-formats-a-string-decimal-into-a-currency-forma

    @greenstork, I saw that, but it's focused primarily on the reverse case, given a currency string how do I convert it to a decimal.

    @Bachovski am I missing something or is this not a duplicate? The other question is talking about String -> Decimal, this is the opposite, Decimal -> String. What am I missing?

    @highfive am I missing something or is this not a duplicate? The other question is talking about String -> Decimal, this is the opposite, Decimal -> String. What am I missing?

    @Tepsi am I missing something or is this not a duplicate? The other question is talking about String -> Decimal, this is the opposite, Decimal -> String. What am I missing?

    @AtulRajguru9 am I missing something or is this not a duplicate? The other question is talking about String -> Decimal, this is the opposite, Decimal -> String. What am I missing?

    @greenstork am I missing something or is this not a duplicate? The other question is talking about String -> Decimal, this is the opposite, Decimal -> String. What am I missing?

    sorry guys, it's too late at night, apparently I can't read

    [Decimal].format() formats the Decimal value into the locale of the current user. Is there a way of formatting a Decimal to an arbitrary locale (or format) in Apex? e.g. Decimal decimalValue = 10000.00; String stringValue = decimalValue.format('###,###,##0.00');

    @cyorkston post a new question and reference this one, i'm the only who would see this comment, to the best of my knowledge you'd need to write you're own function, but a new question would get a lot more people to look at and confirm

  • John Watson

    John Watson Correct answer

    6 years ago

    The format method automatically does the commas and periods or visa versa (depending on whether your profile is in the US or elsewhere)

    Assuming the $ sign applies to all cases in your org you can simply use

    Decimal input = 2000;
    String output = '$' + String.valueOf(input.format());
    

    Note the String.valueOf(). This is required because the input variable is defined as a Decimal.

    Edit: I noticed a bug with the Decimal.format() method where it will not show any numbers past the decimal point if there are only zeros there, ex. $100.00. To solve this I came up with this method.

    private String getCents(Decimal x){
        String y = String.valueOf(x);
        String z = '.';
        if(y.contains(',')) z = ',';
        y = y.substring(0, y.indexOf(z));
        if(x - Decimal.valueOf(y) == 0)
            return String.valueOf(x.format()) + z + '00';
        else return String.valueOf(x.format());
    }
    

    Then to update the example above, it would be:

    Decimal input = 2000;
    String output = '$' + getCents(input);
    

    Nice approach, it doesn't take care of the currency part, but at least we get a number in the correct locale ...

    Your String.valueOf() is unnecessary. The Decimal.format() method returns a string by default. https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_decimal.htm

License under CC-BY-SA with attribution


Content dated before 7/24/2021 11:53 AM