How to convert a number into a formatted string?

• Ralph Callaway

7 years ago

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?] : 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

• 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