Java Methods and return statement - java

I am trying to test a class i'm working on. I want to run a print statement that takes a monthly salary for an employee multiply it by 12 to give me the annual salary then adds 10%. I have gotten everything to work except for the last part
Here is my code so far (This is just partial code)
constructors
public double findSal(){
return this.monthlySalary * 12;
}
public double giveRaise(){
return this.monthlySalary * 12 * 0.10;
}
System.out.printf("The yearly salary for " +employee1.getfirstName()+" " + employee1.getlastName()+" " + "With a 10% raise is: $" +employee1.giveRaise()+ "\n");
System.out.printf("The yearly salary for " +employee2.getfirstName()+" " + employee2.getlastName()+" " + "With a 10% raise is: $" +employee2.giveRaise()+ "\n");
This is the error I am getting when I run
Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = 'r'
at java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2691)
at java.util.Formatter$FormatSpecifier.(Formatter.java:2720)
at java.util.Formatter.parse(Formatter.java:2560)
at java.util.Formatter.format(Formatter.java:2501)
at java.io.PrintStream.format(PrintStream.java:970)
at java.io.PrintStream.printf(PrintStream.java:871)
at labex4oop.employeeTest.main(employeeTest.java:35)
Java Result: 1

Your code suffers from a minor oversight:
Public double giveRaise(){
return this.monthlySalary * 12.0 * 1.10; // was 0.10
}
You also need to convert from double When printing the values and you have to escape the percent sign in your literals (since you use printf where % has placeholder semantics):
System.out.printf("The yearly salary for " +employee2.getfirstName()+" " + employee2.getlastName()+" " + "With a 10%% raise is: $" +String.valueOf(employee2.giveRaise())+ "\n");

System.out.printf("With [...] a 10% raise [...]");
^ // your problem is here
printf() is for formatted output. Placeholders in the format string are introduced via %. 10% raise in your code is interpreted as a %r formatting specifier. Since you neither have any arguments to format nor is %r a valid printf format specifier, you get the error message telling you that your format string is wrong.
To include a literal % you must use %%. Or stop using printf() at all because you are not using its capabilities:
System.out.println("The yearly salary for "
+ employee2.getfirstName()
+ " " + employee2.getlastName()
+ " with a 10% raise is: $"
+ employee2.giveRaise() + "\n"
);

This should give you the correct answer.
I have tried it.public double giveRaise(){
return this.monthlySalary * 12 * 1.10;
}

Related

Set length of field padding and decimal precision at the same time

Is it possible to set length of field padding in the same line as setting the decimal precision? I want firstPlaceTime to display with 3 decimal points, like 8.250 instead of 8.25. Perhaps something like %8s%3f or %8s.3f?
System.out.format("%-10s%1s%-18s%1s%8s%1s%16s%-10s","Level " + level, "| ", firstPlaceName, "| ", firstPlaceTime + "s ", "|", timeGain + "s ahead |", " " + numberOfRunners + " runners");
This code shows an approach to building the format String as well as using the %8.3f to display a double.
public static void main(String[] args)
{
String level = "Beginning";
String firstPlaceName = "TheWinner!";
double firstPlaceTime = 180.234534D;
double timeGain = 10.2D;
int numberOfRunners = 10;
StringBuilder sb = new StringBuilder();
sb.append("Level %-10s"); //the level
sb.append("|"); //divider
sb.append("%-18s"); //name of winner
sb.append("|"); //divider
sb.append("%8.3f s "); //winning time
sb.append("|"); //divider
sb.append("%8.3f s ahead"); //time gain
sb.append("|"); //divider
sb.append("%5d runners"); // # of runners
System.out.format(sb.toString(),
level,
firstPlaceName,
firstPlaceTime,
timeGain,
numberOfRunners);
}
Output:
Level Beginning |TheWinner! | 180.235 s | 10.200 s ahead| 10 runners
Edit: to elaborate on a question in the comment. The OP indicated an attempt to use %8.3f and received a format error. firstPlaceTime is a double. However, the parameter was specified as:
...,firstPlaceTime + "s ",...
When the + "s " was provided as a parameter, it would have been converted to a String, and then passed to the .format(). As a String, it would not be a double to format via the %8.3f specification. It is part of the reason for suggesting moving the text into the format specification rather than attempting
the various String concatenations in the parameters.

"main" java.util.InputMismatchException [duplicate]

This question already has answers here:
Why am I getting InputMismatchException?
(5 answers)
Closed 6 years ago.
Whenever I try to compile it, it keeps giving me an exception:
This is my source code:
Scanner input = new Scanner(System.in);
DecimalFormat df = new DecimalFormat("#.##");
System.out.print("Gaji Pokok (x 10.000) : ");
double gaji = input.nextDouble();
System.out.print("Lama Tahun Kerja : ");
int th = input.nextInt();
System.out.print("Lama Bulan Kerja : ");
float bl = input.nextFloat();
if ( bl > 12)
{
System.out.println("Inputan bulan anda salah");
System.out.print("Masukkan kembali bulan yang benar : ");
float blnnew = input.nextFloat();
float tukar = blnnew;
bl = tukar;
}
float fak_peng;
fak_peng = Float.valueOf(df.format((th+(bl/12))*2.5));
System.out.print("Jumlah Faktor Penghargaan : " );
System.out.println(fak_peng + " %");
System.out.println("Nilai Sekarang : 1.0000000 " );
float per_mppeg;
per_mppeg = Float.valueOf(df.format(gaji*(fak_peng/100)*1));
System.out.print("Perhitungan MP Pegawai : " );
System.out.println(gaji + " x " + fak_peng + "% x " + " 1.0000000 = Rp." + (per_mppeg) + "(x 10.000)");
System.out.print("MP Perbulan : " );
System.out.println(per_mppeg + " + 100% = Rp." + (per_mppeg) + "(x 10.000)");
System.out.println("MP sekaligus 100% : ");
float peserta;
peserta = Float.valueOf(df.format(100.6650*per_mppeg));
float jd;
jd = Float.valueOf(df.format(14.4820*per_mppeg*0.8));
float anak;
anak = Float.valueOf(df.format(0.6090*per_mppeg*0.8));
float jml;
jml = Float.valueOf(df.format(peserta+jd+anak));
System.out.println(" Peserta = 100.6650 x "+ per_mppeg + " = " + peserta + "(x 10.000)");
System.out.println(" Jd/Dd = 14.4820 x "+ per_mppeg + " x 80% = " + jd + "(x 10.000)" );
System.out.println(" Anak = 0.6090 x "+ per_mppeg + " x 80% = " + anak + "(x 10.000)");
System.out.println("Jumlah Total = "+ jml);
float mpdua;
mpdua = Float.valueOf(df.format (jml*0.2)) ;
float mpdel;
mpdel = Float.valueOf(df.format(per_mppeg*0.8)) ;
System.out.println("MP Sekaligus 20% = "+ mpdua + "(x 10.000)");
System.out.println("MP sekaligus 80% = "+ mpdel + "(x 10.000)");
Your exception is not a compile-time error/exception; it is a runtime exception. It is thrown because the thing the scanner is reading cannot be converted to the type you are asking for (e.g., the next thing the scanner should read is "hello" but you are using scanner.nextInt(), as "hello" cannot be converted to an integer it will raise a InputMismatchException).
In your case the exception is raised when asking for a double. Probably you are using the wrong syntax. You should check which syntax your system uses to represent doubles. On some systems, for example, the fractional and the integer part of a double should be separated with a , and on other systems with a .. So one-half on the first type of system should be written as 0,5 but on the second as 0.5.
In Java the syntax the scanner uses is defined with a Locale instance.
You can check which-one your scanner uses with the locale() method and change it with useLocale() method.
So you should recheck what you give as input.
Besides your problem with the format of double you are creating your DecimalFormat on a discommanded way (see last quote below) and there is another line that may rise an exception ( NumberFormatException ), if you do not pay attention to the Locale instance you are using:
fak_peng = Float.valueOf(df.format((th+(bl/12))*2.5));
As you are using your own format to parse the decimal (new DecimalFormat("#.##");) the string that will be passed to the Float.valueOf method will depend on the Locale instance used to create the DecimalFormat object df (in the code sample you didn't use a specific Locale instance so your systems default Locale instance is used). But Float.valueOf expects its argument to use a specific syntax defined by The Java™ Language Specification regardless to your system as written in the Java API for Float.valueOf:
[...] where Sign, FloatingPointLiteral, HexNumeral, HexDigits, SignedInteger and FloatTypeSuffix are as defined in the lexical structure sections of The Java™ Language Specification, except that underscores are not accepted between digits. If s does not have the form of a FloatValue, then a NumberFormatException is thrown.
(The complete text was too big too include here. Follow this link or the one above to have more info about what Sign, FloatingPointLiteral, HexNumeral, HexDigits, SignedInteger, FloatTypeSuffix and FloatValue exactly represent)
If you want to change the Locale instance used in your DecimalFormat object, read the API for the DecimalFormat class.
To obtain a NumberFormat for a specific locale, including the default locale, call one of NumberFormat's factory methods, such as getInstance(). In general, do not call the DecimalFormat constructors directly, since the NumberFormat factory methods may return subclasses other than DecimalFormat.
In the API (follow link just before quote) they give an example of how you should correctly create an instance of a NumberFormat.
Good luck!

java.util.IllegalFormatConversionException: f != java.lang.String Error

import javax.swing.JOptionPane;
public class Minutes {
public static void main(String[] args) {
double BasePlanCost = 20;
final double BaseCostPerMinute=0.15;
double MinutesUsed = Double.parseDouble(JOptionPane.showInputDialog("Please enter the amount of minutes Used: "));
double CostForMinutes = BaseCostPerMinute * MinutesUsed;
double GrandTotal = BasePlanCost + CostForMinutes;
JOptionPane.showMessageDialog(null, String.format("$%.2f","**IST Wireless Receipt**","\n","Base Plan Cost:" +BasePlanCost,"/n","Cost For Minutes Used: "+ CostForMinutes,"/n","Grand Total :" +GrandTotal));
}
}
This program inputs the amount of minutes the user enters and calculates the grand total by adding the CostForMinutes and BasePlanCost.
CostForMinutes is calculated by multiplying the minutes the user enters and the BaseCostPerMinute. The out is all the numbers outputted by two decimal places and outputted as a receipt.
When I compile the program it lets me input the amount of minutes but the code collapses and gives me this error
exception in thread "main" java.util.IllegalFormatConversionException: f != java.lang.String
can anyone help me out?
EDIT this is what I want the output to look like
http://i.stack.imgur.com/CubfC.png
You have
String.format("$%.2f","**IST Wireless Receipt**",
This means you want to format the second argument which is a String using %.2f which is a float format which won't work.
You need to re-organize your format to be first and the values you want to format after it.
String.format("**IST Wireless Receipt**%n" +
"Base Plan Cost: $%.2f%n" +
"Cost For Minutes Used: $%.2f%n" +
"Grand Total: $%.2f%n",
BasePlanCost, CostForMinutes, GrandTotal)
Try to organize your message as:
String message = String.format(
"**IST Wireless Receipt** \n" +
" Base Plan Cost:$ %.2f \n" +
" Cost For Minutes Used: $ %.2f \n" +
" Grand Total : $ %.2f", BasePlanCost, CostForMinutes, GrandTotal);
JOptionPane.showMessageDialog(null, message);
I recommended you to read the code conventions of the java language
http://www.oracle.com/technetwork/java/codeconventions-135099.html

New line in JTextArea?

This is the question of the program:
Write a Java Application program that will determine the gross pay for each of several employees (Use either ‘while’, ‘for’, or ‘do/while’ loop to input several employees). The company pays "straight time" for the first 40 hours worked by each employee and pays "time-and-a-half" for all hours worked in excess of 40 hours. Your program should ask the user to input the hours worked and the rate per hour.
Put all output in one window. Format your gross pay in two decimal places.
This is what I have coded:
/*
* This is a program that determines the gross pay for employees of a
* company that pays "straight time" for the first 40 hours and "time
* and a half" for all hours excess. The program asks the user to
* input the hours worked and the rate per hour.
*/
// Imports.
import java.text.DecimalFormat;
import javax.swing.*;
public class SalaryCalculator
{
public static void main( String[] args )
{
// Ask for number of employees.
String num = JOptionPane.showInputDialog( "How many employees?" );
int employees = Integer.parseInt( num );
for (int counter = 0; counter != employees; counter++)
{
// Ask for employee info.
String name = JOptionPane.showInputDialog ( "Enter employee name:" );
String rate = JOptionPane.showInputDialog( "Enter standard rate per hour in $:" );
String hours = JOptionPane.showInputDialog( "Enter number of hours worked:" );
// Convert string to double.
double money = Double.parseDouble( rate );
double time = Double.parseDouble( hours );
// Create number format and text area.
DecimalFormat noDecimal = new DecimalFormat( "0.00" );
JTextArea outputArea = new JTextArea( 30, 30 );
// Format text area.
outputArea.append( "Name \t Rate \t Hours \t Total \n\n" );
// Calculations and all.
if ( time <= 40 )
{
outputArea.append( name + "\t" + "$"
+ money + "\t"
+ hours + "\t" + "$"
+ noDecimal.format( money * time ) + "\n" );
}
else if( time > 40 )
{
outputArea.append( name + "\t" + "$"
+ money + "\t"
+ hours + "\t" + "$"
+ noDecimal.format( ( money * 1.5 ) * time ) + "\n" );
}
// Output.
JOptionPane.showConfirmDialog( null,
outputArea, "Gross Pay", JOptionPane.DEFAULT_OPTION,
JOptionPane.PLAIN_MESSAGE );
}
}
}
When the code is executed, it asks for the number of employees. Say I enter 2, for example. The program then proceeds to ask the employee name, pay per hour, and number of hours worked. When I enter all of these, it shows the output nicely in a window like I want.
Picture: Data set 1.
After that, it again asks for employee name, pay, and hours (since I said there are 2 employees). This is where my problem is. When I input the second set of data, it replaces the first in the result window.
Picture: Data set 2 replaces set 1.
I want it to be displayed in a new line below the first on the same window, without having the first omitted.
This is my first time posting on stack overflow. Any help will be greatly appreciated!
You're creating a new JTextArea with each iteration of the loop. Don't do that. Create the JTextArea before the loop, and use the same one.

NumberFormatException occurs with different regional settings

I'm developing an application in Java and found this strange behaviour:
if the regional settings format is set to Hungarian (system default) via the Control Panel, I get this exception, but if I set it to an English one, it works perfectly. Also works on a virtual Mandriva where I'm developing the program in the first place.
This is the code snippet that causes the problem:
public String stattxt(){
double dt = time_avg();
double bpm = (Double.compare(dt, 0) == 0) ? 0 : msec2bpm(dt);
String s = "<html>Number of control points: " + timestamps.size() + "<br>Average dt: " +
Double.valueOf(new DecimalFormat("#.####").format(dt).toString()) + " ms<br>" +
"Average BPM: " + Double.valueOf(new DecimalFormat("#.####").format(bpm).toString()) + "<br>&nbsp</html>";
return s;
}
where both time_avg() and msec2bpm return double (not Double by any chance) values.
How could I make this work regardless to regional settings? Any help would be appreciated.
It seems like you're using
Double.valueOf(new DecimalFormat("#.####").format(dt).toString())
to round a number to 4 decimal places, but this looks like a hack to me and will fail due to regionalization settings (Hungary probably uses a decimal comma, not a decimal point.)
So, instead round doubles using something like:
rounded = Math.round(original * 10000)/10000.0;
And, if you want to create a string which is a double rounded to 4 decimal places, use String.format()
String.format("%.4f", original);
It looks like you should just skip the Double.valueOf:
public String stattxt(){
double dt = time_avg();
double bpm = (Double.compare(dt, 0) == 0) ? 0 : msec2bpm(dt);
String s = "<html>Number of control points: " + timestamps.size() + "<br>Average dt: " +
new DecimalFormat("#.####").format(dt) + " ms<br>" +
"Average BPM: " + new DecimalFormat("#.####").format(bpm) + "<br>&nbsp</html>";
return s;
}
Why are you converting String to Double and then again to String? Do it like this:
public String stattxt(){
double dt=time_avg();
double bpm=(Double.compare(dt, 0)==0)?0:msec2bpm(dt);
String s="<html>Number of control points: "+timestamps.size()+"<br>Average dt: "+
new DecimalFormat("#.####").format(dt).toString()+" ms<br>"+
"Average BPM: "+Double.valueOf(new DecimalFormat("#.####").format(bpm).toString())+"<br>&nbsp</html>";
return s;
}

Categories

Resources