1. class FamilyAccount{
    2. public static void main(String[] args) {
    3. boolean isFlag = true;
    4. //用于记录用户的收入和支出的详情
    5. String details = "收支\t账户金额\t收支金额\t说 明\n";
    6. //初始金额
    7. int balance = 10000;
    8. while(isFlag){
    9. System.out.println("------------------家庭收帐软件------------------\n");
    10. System.out.println(" 1 收支明细");
    11. System.out.println(" 2 登记收入");
    12. System.out.println(" 3 登记支出");
    13. System.out.println(" 4 退 出");
    14. System.out.print(" 请选择(1-4) ");
    15. //获取用户的选择
    16. char selection = Utility.readMenuSelection();
    17. switch(selection){
    18. case '1':
    19. //System.out.println("1 收支明细");
    20. System.out.println("----------------当前收支明细记录----------------");
    21. System.out.println(details);
    22. System.out.println("------------------------------------------------");
    23. break;
    24. case '2':
    25. //System.out.println("2 登记收入");
    26. System.out.print("本次收入金额:");
    27. int addMoney = Utility.readNumber();
    28. System.out.print("本次收入说明:");
    29. String addInfo = Utility.readString();
    30. //处理balance
    31. balance += addMoney;
    32. //处理details,连接符
    33. details += ("收入\t" + balance + "\t\t" + addMoney + "\t\t" + addInfo + "\n");
    34. System.out.println("-------------------登记完成-------------------\n");
    35. break;
    36. case '3':
    37. //System.out.println("3 登记支出");
    38. System.out.print("本次支出金额:");
    39. int minusMoney = Utility.readNumber();
    40. System.out.print("本次支出说明:");
    41. String minusInfo = Utility.readString();
    42. //处理balance
    43. if(balance >= minusMoney){
    44. balance -= minusMoney;
    45. //处理details,连接
    46. details += ("收入\t" + balance + "\t\t" + minusMoney + "\t\t" + minusInfo + "\n");
    47. }else{
    48. System.out.println("支出超出账户额度,支付失败");
    49. }
    50. System.out.println("-------------------登记完成-------------------\n");
    51. break;
    52. case '4':
    53. //System.out.println("4 退 出");
    54. System.out.println("确认是否退出(Y/N): ");
    55. char isExit = Utility.readConfirmSelection();
    56. if(isExit == 'Y'){
    57. isFlag = false;
    58. }
    59. //break;
    60. }
    61. //isFlag = false;
    62. }
    63. }
    64. }
    1. import java.util.*;
    2. /**
    3. Utility工具类:
    4. 将不同的功能封装为方法,就是可以直接通过调用方法使用它的功能,而无需考虑具体的功能实现细节。
    5. */
    6. public class Utility {
    7. private static Scanner scanner = new Scanner(System.in);
    8. /**
    9. 用于界面菜单的选择。该方法读取键盘,如果用户键入’1’-’4’中的任意字符,则方法返回。返回值为用户键入字符。
    10. */
    11. public static char readMenuSelection() {
    12. char c;
    13. for (; ; ) {
    14. String str = readKeyBoard(1);
    15. c = str.charAt(0);
    16. if (c != '1' && c != '2' && c != '3' && c != '4') {
    17. System.out.print("选择错误,请重新输入:");
    18. } else break;
    19. }
    20. return c;
    21. }
    22. /**
    23. 用于收入和支出金额的输入。该方法从键盘读取一个不超过4位长度的整数,并将其作为方法的返回值。
    24. */
    25. public static int readNumber() {
    26. int n;
    27. for (; ; ) {
    28. String str = readKeyBoard(4);
    29. try {
    30. n = Integer.parseInt(str);
    31. break;
    32. } catch (NumberFormatException e) {
    33. System.out.print("数字输入错误,请重新输入:");
    34. }
    35. }
    36. return n;
    37. }
    38. /**
    39. 用于收入和支出说明的输入。该方法从键盘读取一个不超过8位长度的字符串,并将其作为方法的返回值。
    40. */
    41. public static String readString() {
    42. String str = readKeyBoard(8);
    43. return str;
    44. }
    45. /**
    46. 用于确认选择的输入。该方法从键盘读取‘Y’或’N’,并将其作为方法的返回值。
    47. */
    48. public static char readConfirmSelection() {
    49. char c;
    50. for (; ; ) {
    51. String str = readKeyBoard(1).toUpperCase();
    52. c = str.charAt(0);
    53. if (c == 'Y' || c == 'N') {
    54. break;
    55. } else {
    56. System.out.print("选择错误,请重新输入:");
    57. }
    58. }
    59. return c;
    60. }
    61. private static String readKeyBoard(int limit) {
    62. String line = "";
    63. while (scanner.hasNext()) {
    64. line = scanner.nextLine();
    65. if (line.length() < 1 || line.length() > limit) {
    66. System.out.print("输入长度(不大于" + limit + ")错误,请重新输入:");
    67. continue;
    68. }
    69. break;
    70. }
    71. return line;
    72. }
    73. }