Reputation: 5577
In AngularJS, I am trying to figure out how many hours, for a current worker, are standard vs overtime. I have a formula that works well, if the hours are integers, but fails if it has decimals.
I have to account for situations where one of the numbers may not have been provided. This is my current approach:
laborItem.StraightHours = (parseFloat((laborItem.HoursB4Today | 0)) + parseFloat(laborItem.Hours | 0)) < 40 ?
(parseFloat(laborItem.Hours | 0)) :
40 - parseFloat(laborItem.HoursB4Today | 0);
This returns only the whole hours.
I have also tried:
laborItem.StraightHours = (parseFloat((laborItem.HoursB4Today | 0).toFixed(2)) + parseFloat(laborItem.Hours | 0).toFixed(2)) < 40 ?
(parseFloat(laborItem.Hours | 0).toFixed(2)) :
40 - parseFloat(laborItem.HoursB4Today | 0).toFixed(2);
But, this just adds two decimals. I need to preserve the decimal values.
How do I modify my formula to get this to work? And, do I really need to use parseFloat
at all, or is there another/better way?
Upvotes: 2
Views: 1713
Reputation: 1611
You can try the following code
laborItem.HoursB4Today = parseFloat(laborItem.HoursB4Today || 0);
laborItem.Hours = parseFloat(laborItem.Hours || 0);
laborItem.StraightHours = (laborItem.HoursB4Today + laborItem.Hours) < 40 ? laborItem.Hours : 40 - laborItem.HoursB4Today;
I just modified you code little bit but this can ensure that the future usage of the variables (HoursB4Today,Hours) of laborItem gurantees that they are pointing to a numeric values. You don't need to parse them again and again.
Upvotes: 4
Reputation: 35358
I guess you rather want to use ||
instead of |
in e.g. laborItem.HoursB4Today | 0
A single pipe is the bit-wise OR operator and 'converts' your numbers - if existing - into integers. The ||
is usually used to provide a default value in case the first operand evaluates to false
.
So try changing the expressions like
laborItem.HoursB4Today | 0
into
laborItem.HoursB4Today || 0
Upvotes: 3