Pit Digger
Pit Digger

Reputation: 9780

Converting a String that contains decimal to Long

I have following sample (link to ideone).

long lDurationMillis =  0;
lDurationMillis = Long.parseLong("30000.1");
System.out.print("Play Duration:" + lDurationMillis);

It throws an exception:

Exception in thread "main" java.lang.NumberFormatException: For input string: "30000.1"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Long.parseLong(Long.java:419)
at java.lang.Long.parseLong(Long.java:468)
at Main.main(Main.java:9)

But why it wont let me convert that number to a string directly ?I can convert number to integer and than convert to double . But is there any other way ?

Upvotes: 24

Views: 84074

Answers (5)

Ankush soni
Ankush soni

Reputation: 1459

You can do NumberFormat handling as below :

long lDurationMillis =  0;
        try{
            NumberFormat nf = NumberFormat.getInstance();
            lDurationMillis = nf.parse("30000.1").longValue();
            System.out.print("Play Duration:" + lDurationMillis);
        }catch(ParseException e)
        {
            e.printStackTrace();
        }

Output:

Play Duration:30000

Upvotes: 2

Reimeus
Reimeus

Reputation: 159754

The value 30000.1 is an invalid long value. You could parse the double value first:

lDurationMillis = (long)Double.parseDouble("30000.1");

Upvotes: 52

Miserable Variable
Miserable Variable

Reputation: 28752

The title says converting string to long, first question is about coverting number to string, next statement about converting number to integer to string. I am confuse.

But for anything to do with floating points, I have to point you at obligatory reference What Every Computer Scientist Should Know About Floating-Point Arithmetic .

In java, int and long do not have fractional parts, so a string like 3000.1 cannot be covnerted to one of these. It can be converted to float or double but if you read the above article you will realize that the coversion can be lossy, i.e. if you canvert that double back to a String you may not get the original 3000.1 back. It will be something close, for appropriate defintion of close, but may not be same.

If you want to use exact precision then BigDecimal is your friend. It will be much slower then the number types, but it will be precise.

Upvotes: 4

Gijs Overvliet
Gijs Overvliet

Reputation: 2691

You could use BigDecimal in this case:

BigDecimal bd = new BigDecimal("30000.1");
long l = bd.setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
System.out.println(l);

Upvotes: 7

Jigar Joshi
Jigar Joshi

Reputation: 240870

Because long can't have fractional part, you could convert it to double and then cast it to long ignoring fractional part

Upvotes: 2

Related Questions