Method to Insert Commas into Large Numbers - java

Is there a method that already exists and if not can a method be written that can format large numbers and insert commas into them?
100 = 100
1000 = 1,000
10000 = 10,000
100000 = 100,000
1000000 = 1,000,000
public String insertCommas(Integer largeNumber) {
}

With NumberFormat you can do this easily:
NumberFormat format = NumberFormat.getInstance(Locale.US);
System.out.println(format.format(100));
System.out.println(format.format(1000));
System.out.println(format.format(1000000));
will ouput:
100
1,000
1,000,000

You can use NumberFormat#getNumberInstance with Locale.US:
A Locale object represents a specific geographical, political, or
cultural region. An operation that requires a Locale to perform its
task is called locale-sensitive and uses the Locale to tailor
information for the user. For example, displaying a number is a
locale-sensitive operation— the number should be formatted according
to the customs and conventions of the user's native country, region,
or culture.
System.out.println(NumberFormat.getNumberInstance(Locale.US).format(10000000));
This will print:
10,000,000
Side note: In Java 7, you can write an int with underscores: 1_000_000.

Have you looked at DecimalFormat (a derivation of the abstract NumberFormat)? You can customise the format to your needs.
DecimalFormat myFormatter = new DecimalFormat("###,###.###");
String output = myFormatter.format(value);
Note also that you can determine formatting based upon the locale.

Have you tried java.text.NumberFormat?

I tried to be very clear with what i'm doing, it could be done in much less lines.
The algorithm is simple, i reverse the input string, then i split the number using a regex, in each match we add a comma.
If the number size module 3 is zero (for example 123456) we have to remove the last comma.
Now we restore original string order by reversing it again, and voilá.
public String insertCommas(Integer largeNumber) {
String result;
String reversedNum = new StringBuilder(""+largeNumber).reverse().toString();
String reversedResult = "";
Pattern pattern = Pattern.compile("\\d{3}");
Matcher matcher = pattern.matcher(reversedNum);
int lastIndex = reversedNum.length();
while(matcher.find()){
reversedResult += matcher.group()+",";
lastIndex = matcher.end();
}
String remaining = reversedNum.substring(lastIndex);
reversedResult += remaining;
result = new StringBuilder(reversedResult).reverse().toString();
if(remaining.isEmpty()){
result = new StringBuilder(reversedResult).reverse().toString().substring(1);
}else{
result = new StringBuilder(reversedResult).reverse().toString();
}
return result;
}

Related

how to display a string with two decimal places which is carrying currency value in dollar

I'm taking a value from the mobile application which I'm getting in string format something like "$000"(which actually $0.00 ) similarly I want to convert all the value into two decimal place say if I get "$279"(which is in application actually $2.79)
I don't know the correct approach because further in I have compair this value to some other string.
so I want to keep this as String but at the same time I want to put decimal after two place always whatever the number.
I tried to Decimal formatter for money but gave me "object as a number format" exception
sends
String accLastFourDigits, getCurrAmt, currAmt;
getCurrAmt = getDriver().findElement(by("overview.current_balance")).getText();
DecimalFormat money = new DecimalFormat("$0.00");
currAmt = money.format(getCurrAmt);
You could use builtin NumberFormat provided by JAVA to parse different country Currencies as shown below. Also I am dividing the resulting number by 100, so as to satisfy the requirement, that $978 is read as 9.78.
NumberFormat usFormat = NumberFormat.getCurrencyInstance(Locale.US);
String currencyValue = "$100";
try {
System.out.println(usFormat.parse(currencyValue).intValue()/100);
}catch(ParseException e) {
e.printStackTrace();
}
Here, I am setting the currency to US and then parsing a string with dollar sign.
You could also use the format method of NumberFormat to print the currency value in respective currency formats, as shown below
NumberFormat usFormat = NumberFormat.getCurrencyInstance(Locale.US);
String currencyValue = "$100";
try {
Number value = usFormat.parse(currencyValue).intValue()/100;
System.out.println("Number value : " + value);
System.out.printf("In Currency : "+usFormat.format(value));
}catch(ParseException e) {
e.printStackTrace();
}
You have this exception because format method expect number type argument. What you need to do then is to remove all non digits characters from the input string
getCurrAmt = getCurrAmt.replaceAll("[^\\d.]", ""); // please note that replaceAll method has poor performance
and parse it to Integer when calling format method
money.format(Integer.parseInt(getCurrAmt))
As pointed out replaceAll method is not very efficient because it needs to compile Pattern every single time and it's better to use Matcher - you can read about this in this topic:
String replaceAll() vs. Matcher replaceAll() (Performance differences)
How about this?
String inputStr = "$279";
NumberFormat usCurrency = NumberFormat.getCurrencyInstance(Locale.US);
usCurrency.setParseIntegerOnly(true);
long num = (Long)usCurrency.parse(inputStr);
BigDecimal amount = new BigDecimal(num);
amount = amount.scaleByPowerOfTen(-2);
log.info("amount: {}", usCurrency.format(amount));

Double with specific format and two decimals

I'm trying to format the numbers to look like a certain way.
So, I have like the number 1007,2, and I want it to look like 1 007,20
This has two factors needed:
Thousands format
Two decimal places
I have a code that sets the thousands format:
Double total_value = Double.valueOf(1007,2);
String formatedValue = NumberFormat.getNumberInstance(Locale.CANADA_FRENCH).format(total_value);
And the output is:
1 007,2€
And I have the code for the two decimal places:
Double total_value = Double.valueOf(1007,2);
String formatedValue = String.format("%.2f", total_value);
The problem is, for using this two format methods at the same time they get always problems, because the two of them return Strings, and both need to receive the values for formatting in Double.
If I receive one in String, when I try to parse the String to Double like String value = Double.parseDouble(formatedValue);or String value = Double.valueOf(formatedValue) they always get an error. I've already tried the DecimalFormat to but it returns a String too.
So, I dont know how to do to conjugue the two methods to work together!
If you have any idea please comment it :)
You don't want to combine NumberFormat and String.format().
You can further configure your NumberFormat object to tell it to use two decimal places:
NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.CANADA_FRENCH);
numberFormat.setMinimumFractionDigits(2);
assertThat(numberFormat.format(1007.2), is("1 007,20"));
(and possibly setMaximumFractionDigits() etc., depending on your needs -- see the Javadoc)
Take care - NumberFormat.format() is not thread-safe.
Alternatively you can use String.format(locale, format, args):
assertThat(String.format(Locale.CANADA_FRENCH, "%,.2f", 1007.2), is("1 007,20"));
The , flag in the format tells the formatter to use a thousands-separator, and the locale tells it that the separator is a space.
After setting the thousand format you could do someting like:
String[] splitter = formatedValue.split("\\,");
int decimalDigits = 0;
if (splitter.length > 1) {
formatedValue = splitter[1].length();
} else {
formatedValue += ",";
}
for (int i = 0; i < 2 - decimalDigits; i++) {
formatedValue += "0";
}
I have not tested this, and it is not the really pretty, but i am using something similar for the english format.
To make sure you have only two decimal digits you should probably round your total value at the beginning.

How to format 6 or 9 digit number like #,##,###

How to format 6 or 9 digit number like #,##,### [for 6] and ##,##,##,### [for 9]
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class CheckFormater {
public static void main(String[] args) {
NumberFormat nf6 = new DecimalFormat("#,##,###");
System.out.println(nf6.format(123456d));
NumberFormat nf9 = new DecimalFormat("##,##,##,###");
System.out.println(nf9.format(123456789d));
}
}
I am getting output as follows
123,456
123,456,789
I am expecting as follows
1,23,456
12,34,56,789
How to do costume formatting ?
You can use ICU4J
import com.ibm.icu.text.DecimalFormat;
import com.ibm.icu.text.DecimalFormatSymbols;
public class NewClass {
public static void main(String[] args) {
DecimalFormatSymbols dfs = new DecimalFormatSymbols();
dfs.setGroupingSeparator(',');
DecimalFormat nf6 = new DecimalFormat("#,##,###", dfs);
DecimalFormat nf9 = new DecimalFormat("##,##,##,###", dfs);
System.out.println(nf6.format(123456d));
System.out.println(nf9.format(123456789d));
}
}
//prints
//1,23,456
//12,34,56,789
Here is what Java Docs say:
The grouping separator is commonly used for thousands, but in some countries it separates ten-thousands. The grouping size is a constant number of digits between the grouping characters, such as 3 for 100,000,000 or 4 for 1,0000,0000. 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 "#,##,###,####" == "######,####" == "##,####,####".
So in other words, you can only specify one grouping separator format at a time. Either a thousands separator or ten thousand separator or hundred separator. Even if you try to specify multiple formats in one, the method will use only the interval between the last one and the end of the integer. So in your case you are specifying "#,##,###" but the method will consider only the last comma and the number of digits afterwards which is 3 in your case. That's why the output is a thousand separator.
I was also hoping that selecting a proper locale should address this number formatting issue without needing to specify any pattern. E.g. in India, the numbers are in fact formatted the way you want. The first separator is thousand digit based and the rests are hundred digit based. So if I select Indian English locale, it should automatically address this requirement. But it doesn't.
NumberFormat nf6 = NumberFormat.getInstance(new Locale("en-IN"));
System.out.println(nf6.format(54123756.523d));//Still prints 54,123,756.523 and not 5,41,23,756.523
So unfortunately there is no ready made way to achieve your objective unless you go for the recommendation of using third party libraries in the other answer. However you can always use a heck. It is not neat but achieves the objective. Maybe you can encapsulate this hack in a utility method or something:
double number = 54123756.523d;
int prefix = (int)number / 1000;
NumberFormat nf1 = new DecimalFormat("#,##");
String newPrefix = nf1.format(prefix);
double remainder = number - (prefix * 1000);
NumberFormat nf2 = new DecimalFormat("#,###.##");
String newRemainder = nf2.format(remainder);
String finalNum = newPrefix + "," + newRemainder;
System.out.println("Formatted number is " + finalNum);
So see if you can live with the code sample suggested above. It is not ideal or efficient but will at least serve your purpose and won't need any third party libraries.

Format String currency in java

How can I format this pattern: R$123.456.789,12 to this: 123456789.12?
What I tried:
String valor_minimo = mSessao.getString("filtro_pedidos_valor").substring(2);
String valor_maximo = mSessao.getString("filtro_pedidos_valor_maior").substring(2);
DecimalFormat dec = new DecimalFormat("#.## EUR");
dec.setMinimumFractionDigits(2);
String credits = dec.format(valor_maximo);
But that does`t work.
This is a bit messy as my Java is rusty, but I believe what you're looking for is the .replace method. You're likely receiving the IllegalArgumentException because you're trying to format a String.
Give this a try, and rework as needed:
String number = "R$123.456.789,0";
number = number.replace(".", "");
number = number.replace(",", "."); //put this second so the previous line won't wipe out your period
number = number.replace("R", "");
number = number.replace("$", "");
//two ways you can do this. either create an instance of DecimalFormat, or call it anonymously.
//instance call:
DecimalFormat df = new DecimalFormat("#.##");
//now parse the number and feed it to your decimal formatter
number = df.format(Double.parseDouble(number));
//anonymous call:
number = new DecimalFormat("#.##").format(Double.parseDouble(number));
//output test:
System.out.println(number);
Hope this helps!
Edited for a more complete and robust answer.
you may use regex to clean up the format of your string
String cleanStr = inputStr.reaplaceAll("[^0-9,]","").reaplace(",",".");
so you will get simple 123456789.12, which you can parse to double and use as you want

How can I format a String number to have commas and round?

What is the best way to format the following number that is given to me as a String?
String number = "1000500000.574" //assume my value will always be a String
I want this to be a String with the value: 1,000,500,000.57
How can I format it as such?
You might want to look at the DecimalFormat class; it supports different locales (eg: in some countries that would get formatted as 1.000.500.000,57 instead).
You also need to convert that string into a number, this can be done with:
double amount = Double.parseDouble(number);
Code sample:
String number = "1000500000.574";
double amount = Double.parseDouble(number);
DecimalFormat formatter = new DecimalFormat("#,###.00");
System.out.println(formatter.format(amount));
This can also be accomplished using String.format(), which may be easier and/or more flexible if you are formatting multiple numbers in one string.
String number = "1000500000.574";
Double numParsed = Double.parseDouble(number);
System.out.println(String.format("The input number is: %,.2f", numParsed));
// Or
String numString = String.format("%,.2f", numParsed);
For the format string "%,.2f" - "," means separate digit groups with commas, and ".2" means round to two places after the decimal.
For reference on other formatting options, see https://docs.oracle.com/javase/tutorial/java/data/numberformat.html
Given this is the number one Google result for format number commas java, here's an answer that works for people who are working with whole numbers and don't care about decimals.
String.format("%,d", 2000000)
outputs:
2,000,000
Once you've converted your String to a number, you can use
// format the number for the default locale
NumberFormat.getInstance().format(num)
or
// format the number for a particular locale
NumberFormat.getInstance(locale).format(num)
I've created my own formatting utility. Which is extremely fast at processing the formatting along with giving you many features :)
It supports:
Comma Formatting E.g. 1234567 becomes 1,234,567.
Prefixing with "Thousand(K),Million(M),Billion(B),Trillion(T)".
Precision of 0 through 15.
Precision re-sizing (Means if you want 6 digit precision, but only have 3 available digits it forces it to 3).
Prefix lowering (Means if the prefix you choose is too large it lowers it to a more suitable prefix).
The code can be found here. You call it like this:
public static void main(String[])
{
int settings = ValueFormat.COMMAS | ValueFormat.PRECISION(2) | ValueFormat.MILLIONS;
String formatted = ValueFormat.format(1234567, settings);
}
I should also point out this doesn't handle decimal support, but is very useful for integer values. The above example would show "1.23M" as the output. I could probably add decimal support maybe, but didn't see too much use for it since then I might as well merge this into a BigInteger type of class that handles compressed char[] arrays for math computations.
you can also use the below solution
public static String getRoundOffValue(double value){
DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00");
return df.format(value);
}
public void convert(int s)
{
System.out.println(NumberFormat.getNumberInstance(Locale.US).format(s));
}
public static void main(String args[])
{
LocalEx n=new LocalEx();
n.convert(10000);
}
You can do the entire conversion in one line, using the following code:
String number = "1000500000.574";
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number));
The last two # signs in the DecimalFormat constructor can also be 0s. Either way works.
Here is the simplest way to get there:
String number = "10987655.876";
double result = Double.parseDouble(number);
System.out.println(String.format("%,.2f",result));
output:
10,987,655.88
The first answer works very well, but for ZERO / 0 it will format as .00
Hence the format #,##0.00 is working well for me.
Always test different numbers such as 0 / 100 / 2334.30 and negative numbers before deploying to production system.
According to chartGPT
Using DecimalFormat:
DecimalFormat df = new DecimalFormat("#,###.00");
String formattedNumber = df.format(yourNumber);
Using NumberFormat:
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setGroupingUsed(true);
String formattedNumber = nf.format(yourNumber);
Using String.format():
String formattedNumber = String.format("%,.2f", yourNumber);
Note: In all the above examples, "yourNumber" is the double value that you want to format with a comma. The ".2f" in the format string indicates that the decimal places should be rounded to 2 decimal places. You can adjust this value as needed.

Categories