• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

Money and digits problem

 
Ranch Hand
Posts: 211
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I'm writing a program that does some simple math problems on user inputted dollar amounts. I'm currently using double for those amounts.

Sometimes, the user might enter 7.25 and 2.20, in which case, if its subtraction I need my output to be 5.05, but for larger numbers like 15,000 and 3000 I want my output to be "12,000" not "12,000.00". Is there an easy way around this or would I have to check my numbers and adjust the format every time?
 
lowercase baba
Posts: 13089
67
Chrome Java Linux
  • Likes 1
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Tyson Lindner wrote:I'm writing a program that does some simple math problems on user inputted dollar amounts. I'm currently using double for those amounts.


That is a mistake. Money comes in discrete units, therefore you should use an integer type. In the U.S., the atomic unit would be cents, so the user input should be converted to pennies and all computations done that way with integer arithmetic. Otherwise, you will start finding weird rounding errors.
 
Marshal
Posts: 28193
95
Eclipse IDE Firefox Browser MySQL Database
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
As for the formatting of "larger" versus "non-larger" numbers: Yes, you're going to have to write code which says "If X is a larger number then format it this way, otherwise format it that way".
 
Rancher
Posts: 4803
7
Mac OS X VI Editor Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Never use float or double for money. Store the integer number of pennies. This works for US, Canadian, Austrailian, etc. dollars, Euros and other kinds of money.

Then use Formats to add or remove the decimal points into the right places.
 
Tyson Lindner
Ranch Hand
Posts: 211
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Thanks for the replies, i'll definitely convert to int but just a quick follow up question:

The user input will still be double, is there a way to check how specific the input is? That way if the user puts in "125" I can have one print format, if its "125.75" I can have another, and if its "125.12352" I can print an error message.

I think I'll just scrap the idea of format depending on the size of the number, I don't really care if large numbers have the decimal places if that's how the user inputted them.
 
Pat Farrell
Rancher
Posts: 4803
7
Mac OS X VI Editor Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Tyson Lindner wrote:The user input will still be double, is there a way to check how specific the input is? That way if the user puts in "125" I can have one print format, if its "125.75" I can have another, and if its "125.12352" I can print an error message.



No! The user input is not double. The user input is a String. its a String that may have look like: "125.12" or "125.12352"
It is never a double. The user input may also look like "12S.L2" where there is an S and a L instead of the proper digits 5 and 1 (one). It can look like "125.12 125.12"

You have to process/parse the user's input, see if it makes sense, and use it or give an error message.
 
Tyson Lindner
Ranch Hand
Posts: 211
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Pat Farrell wrote:

Tyson Lindner wrote:The user input will still be double, is there a way to check how specific the input is? That way if the user puts in "125" I can have one print format, if its "125.75" I can have another, and if its "125.12352" I can print an error message.



No! The user input is not double. The user input is a String. its a String that may have look like: "125.12" or "125.12352"
It is never a double. The user input may also look like "12S.L2" where there is an S and a L instead of the proper digits 5 and 1 (one). It can look like "125.12 125.12"

You have to process/parse the user's input, see if it makes sense, and use it or give an error message.



Yeah I was parsing the string using Double.parseDouble() and catching a NumberFormatException, but 12.24523 is bad input for my purposes but won't throw an exception, so I'm wondering how I catch that.
 
Sheriff
Posts: 67746
173
Mac Mac OS X IntelliJ IDE jQuery TypeScript Java iOS
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I'll second Pat on that. For no purposes at all should double or float ever be used for money. Ever.
 
Pat Farrell
Rancher
Posts: 4803
7
Mac OS X VI Editor Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Tyson Lindner wrote:Yeah I was parsing the string using Double.parseDouble() and catching a NumberFormatException, but 12.24523 is bad input for my purposes but won't throw an exception, so I'm wondering how I catch that.



Very bad to parse with .parseDouble(), as you'll be tempted to use the result. Plus, as you say, it doesn't catch a number of frequently occurring real world errors.

The standard approach is to use the Pattern and Matcher classes to process a regular expression. This also allows you to accept and ignore commas in the number. Sadly, its a bit complex to get the regex exactly right, you can get it close with a few minutes of effort, but getting it exact for all cases is a lot of effort.
 
Tyson Lindner
Ranch Hand
Posts: 211
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Jeff Verdegan wrote:

Pat Farrell wrote:Never use float or double for money.


I don't think that will work. I don't think you can use the formatting tools in the core API to add decimal points to integers. You'd have to roll your own, I believe.



Yeah I'm currently trying to figure this out. I can convert the double to int, but now I'm having trouble finding a way to print the integer back out with decimal places (if needed) in a JLabel. I suppose I can convert back to double and figure out how formatting works for JLabel which is something I was going to have to do anyway.
 
Bartender
Posts: 6109
6
Android IntelliJ IDE Java
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Tyson Lindner wrote:

Jeff Verdegan wrote:

Pat Farrell wrote:Never use float or double for money.


I don't think that will work. I don't think you can use the formatting tools in the core API to add decimal points to integers. You'd have to roll your own, I believe.



Yeah I'm currently trying to figure this out. I can convert the double to int,



You won't convert double to int. If you take that approach, you'll only use int (or long). You'll never use double at all. Instead of storing and calculating in dollars, you'll do it in pennies. Then, when you want to display it in dollars, you'll have to convert your int to a String, and insert a decimal point before the last two digits (and also insert a leading zero if the int value is less than 10). [EDIT: Or use format() as Pat shows a couple posts further down. I had a total brain f**t thinking we couldn't do that. It's cleaner that way, but make sure you understand what it's doing and why it works if you decide to use it.]

but now I'm having trouble finding a way to print the integer back out with decimal places (if needed) in a JLabel.



See above.

I suppose I can convert back to double



No, that totally defeats the purpose of using ints in the first place.
 
Pat Farrell
Rancher
Posts: 4803
7
Mac OS X VI Editor Linux
  • Likes 2
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Tyson Lindner wrote:Yeah I'm currently trying to figure this out. I can convert the double to int, but now I'm having trouble finding a way to print the integer back out with decimal places (if needed) in a JLabel. I suppose I can convert back to double and figure out how formatting works for JLabel which is something I was going to have to do anyway.



No, never double.

You want code like:



 
Tyson Lindner
Ranch Hand
Posts: 211
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Pat Farrell wrote:
The standard approach is to use the Pattern and Matcher classes to process a regular expression. This also allows you to accept and ignore commas in the number. Sadly, its a bit complex to get the regex exactly right, you can get it close with a few minutes of effort, but getting it exact for all cases is a lot of effort.



Thanks, I guess I'll have to look into these although I wish there was an easier way.
 
Don't get me started about those stupid light bulbs.
reply
    Bookmark Topic Watch Topic
  • New Topic