1.30 Java周末总结①控制显示多少位小数位②读txt和写txt模拟ATM数据库

1.30 Java周末总结①控制显示多少位小数位②读txt和写txt模拟ATM数据库

一、控制显示多少位小数位

有些时候小数位数太多了,想保留多少位小数,这里介绍一种利用四舍五入保留想要的小数位数
Math.round四舍五入到整数位,所以把小数乘以整10或整百,在除以整10或整百,就得到想要的位数了

double a = 3.14159265359;
double weishu = 5;
double b = Math.pow(10,weishu);
a = Math.round(a*b)/b;

二、读txt和写txt模拟ATM数据库
在模拟ATM存取钱的时候,第二次运行就没有上一次的数据了,没有把信息储存到本地。在网上查了些txt

的读写。

经过理解之后,发现主要是以下步骤:
①载入txt的文件,主要代码是: File filename = new File("d:/bankinfo.txt")
②然后把文件放入文件输入流,再放入读取缓存,再用一行一行读取的方法,主要代码如下

BufferedReader reader = new BufferedReader(new FileReader(file));
String tempString = reader.readLine();
得到每一行的数据可以打印输出,也可以把这一行的数据用正则表达式拆分出自己想要的信息。
比如我这里就是把账户名,密码和余额放一起的。

写入的时候,是先全部读在缓存中,一行一行的读取,并一行一行的写入,到最后一行为空的时候,写入

新的数据。
主要代码如下:
String temp = br.readLine()
StringBuffer buf = buf.append(temp)

以上的代码都不是很懂,不会灵活运用,但是不妨碍根据自己的需求修改。
需求分析:
1、需要n组银行的账号,密码,余额。
2、输入账号和密码的时候匹配每一行txt的账户,密码,并得到余额。
3、存取钱的时候余额需要修改

设计思路:
1、账号用随机数生成银行卡后八位,随机生成6位数密码,随机生成10万以内的余额,并且保存到txt的

一行。
2、输入账号和密码后,读取txt的每一行,每一行取出后,根据正则表达式拆分成数组,存着账户余额密

码。依次遍历看是否匹配账户,如果匹配在看是否匹配密码。登录成功返回true,并且取出余额,还有此

行的行数,用于写数据
3、余额修改时,在写txt的时候,写到账户那一行,就把账户,密码,余额重写一次,其他行也重写一次

,其他不变

缺点:
此小程序只作于模仿,和真正的数据库差很多,txt也只作于存写数据。只是算txt读写的练习
源代码如下:

  1 package com.ATM;
  2
  3 import java.io.BufferedReader;
  4 import java.io.File;
  5 import java.io.FileReader;
  6 import java.io.IOException;
  7 import java.util.Scanner;
  8 import java.io.FileNotFoundException;
  9 /**
 10  *
 11  * @author YuanqiuChen
 12  * date 1.20-23
 13  *模拟一个简易ATM机
 14  *
 15  *
 16 要求:
 17 先做只有一个用户的:
 18 1、ATM运行之前,准备好一个账户名、账户对应的密码和账户对应的余额,
 19    并且规定,ATM机初始化时默认的剩余金额是15万,最大金额容量为20万,最大取款限额为10万。
 20 2、有一个欢迎界面
 21 3、用户输入账号和密码,并进行验证
 22    如果三次输入错误,则给出提示并退出系统
 23    如果输入正确则显示以下菜单
 24    1.查询余额  2.取款  3.存款  4.退出
 25    提示用户选择菜单
 26    如果用户输入1,则显示余额;
 27    如果用户输入2,则提示输入要取出的金额,
 28        如果金额等于0,相应提示;
 29        如果金额不是100的倍数,则给出相应提示;
 30        如果金额为负数,也提示;
 31        如果金额输入不合法(比如输入了特殊符号或者字母),也提示;
 32        如果输入的金额大于该用户的余额,也要提示,
 33        如果输入的金额超过ATM机中的剩余金额,也要提示。
 34    如果选择3,则显示存款界面,提示用户放入现金:
 35        如果输入的金额加上ATM机中剩余的金额超过了ATM机最大金额容量,则提示用户。
 36    如果选择4.则直接退出系统。
 37  *
 38  */
 39 public class ATM {
 40
 41     public static void main(String[] args){
 42
 43         ATMRunning people = new ATMRunning();
 44         people.welcome("中国银行");
 45
 46         Card card1 = new Card();
 47         if(people.load(card1)){
 48             people.accountOperation(card1);
 49         }
 50
 51
 52     }
 53 }
 54
 55 class ATMRunning{
 56
 57     private int localMoney = 150000;    //提款机本地现有钱数量
 58     private int get_Money_Already = 0;    //用户今天已经取钱数
 59     private final int MAX_LOCAL_MONEY = 200000;    //提款机本地最多存200000
 60     private final int MAX_GET_MONEY = 20000;    //这次取钱最多一共取10000元
 61     private final int MAX_GET_SIGLE_MONEY = 5000;//单次最多取5000
 62
 63     ATMRunning(){
 64
 65     }
 66     public double getLocalMoney() {
 67         return localMoney;
 68     }
 69
 70     public void setLocalMoney(int localMoney) {
 71         this.localMoney = localMoney;
 72
 73     }
 74
 75     int lineNum = 0;                    //定义查到的账户的在文本数据
 76
 77 库里边的行数
 78
 79     public void welcome(String bankName){
 80         System.out.println("*************************************\n\n");
 81         System.out.println("********欢  迎  使  用   " + bankName + " ATM 机
 82
 83 ********\n\n");
 84         System.out.println("*************************************\n");
 85         System.out.println("ATM机正在运行");
 86     }
 87
 88
 89     public boolean accountCheck(Card card1){
 90         Card[] data = new Card[10];
 91         for(int i = 0; i < 4; i++){
 92             data[i] = new Card();
 93         }
 94
 95         data[0].setAccount(1234);
 96         data[0].setPassword(123456);
 97         data[0].setMoney(31689.4);
 98
 99         data[1].setAccount(1111);
100         data[1].setPassword(111111);
101         data[1].setMoney(310000);
102
103
104         File file = new File("d:/bankinfo.txt");
105         BufferedReader reader = null;
106         String str1 = null;
107         String[] str2 = new String[3];
108
109         try {//以行为单位读取文件内容,一次读一整行
110             reader = new BufferedReader(new FileReader(file));
111             int i = 0;
112             while ((str1 = reader.readLine()) != null) {
113                 lineNum = i++;
114                 str2 = splitt(str1);
115                 if(card1.getAccount() == Double.parseDouble(str2[0])){
116                     if(card1.getPassword() == Double.parseDouble(str2
117
118 [1])){
119                         card1.setMoney(Double.parseDouble(str2[2]));
120
121     //问题,card1变了,data还没有变
122                         return true;
123                     }
124                 }
125             }
126             reader.close();
127         } catch (FileNotFoundException e) {
128             e.printStackTrace();
129         } catch (IOException e) {
130             e.printStackTrace();
131         } finally {
132             if (reader != null) {
133                 try {
134                     reader.close();
135                 } catch (IOException e) {
136                     e.printStackTrace();
137                 }
138             }
139         }
140
141         return false;
142     }
143
144
145     public String[] splitt(String str) {
146         String strr = str.trim();
147         String[] strnew = strr.split("[\\p{Space}]+");
148         return strnew;
149     }
150
151
152     public boolean load(Card card1) { //传进来一个新的空的card类型,用户输入对其赋值,然
153
154 后和数据库进行比较,检测是否登录成功
155
156
157         long account_input , password_input;
158         for(int i = 0; i < 3 ; i++){
159             Scanner scan = new Scanner(System.in);    //问题 这个放前边会(输入错
160
161 误时)出错
162             System.out.println("请输入卡号:");
163             if(scan.hasNextLong()){                 //检测账号是
164
165 否为int型,否则跳出当次
166                 account_input = scan.nextLong();
167                 card1.setAccount(account_input);
168             }else{
169                 if(i == 2 ){
170                     System.out.println("输入错误三次,已吞卡,请联系我行
171
172 客服!");
173                     return false;
174                 }
175                 System.out.println("无效账号,请重输:");
176                 continue;
177             }
178
179             System.out.println("请输入密码:");    //检测密码是否为int型,否则
180
181 跳出当次
182             if(scan.hasNextInt()){
183                 password_input = scan.nextInt();
184                 card1.setPassword(password_input);
185             }else{
186                 if(i == 2 ){
187                     System.out.println("输入错误三次,已吞卡,请联系我行
188
189 客服!");
190                     return false;
191                 }
192                 System.out.println("无效密码,请重输:");
193                 continue;
194             }
195             if(accountCheck(card1)){            //把用户输入的这个账
196
197 号放入数据库进行比较,返回true或者false
198                 System.out.println("登录成功!\n");
199                 return true;
200             }else if(i == 2 ){
201                 System.out.println("输入错误三次,已吞卡,请联系我行客
202
203 服!");
204                 return false;
205             }else{
206                 System.out.println("账号或密码错误,请重输:");
207             }
208
209         }
210
211         return false;
212     }
213
214     public void accountOperation(Card card1){
215         Scanner scan = new Scanner(System.in);
216         while(true){
217             System.out.println("1、查询余额\n2、取款\n3、存款\n4、退出\n");
218             String input = scan.next();
219             if(input.equals("1")){
220                 balanceCheck(card1);
221                 continue;
222             }else if(input.equals("2")){
223                 getMoney(card1);
224                 balanceCheck(card1);
225             }else if(input.equals("3")){
226                 saveMoney(card1);
227             }else if(input.equals("4")){
228                 System.out.println("卡已退出");
229                 System.exit(0);
230             }else{
231                 continue;
232             }
233
234         }
235     }
236
237     public void balanceCheck(Card card1){
238         System.out.println("余额为:"+ card1.getMoney() + "\n");
239     }
240
241     public void getMoney(Card card1){
242         int get_Money = 0;        //用户取钱数
243
244         Scanner scan = new Scanner(System.in);
245         System.out.println("请输入取款金额\n1、100元\n2、300元\n3、500元\n4、1000元
246
247 \n5、2000元\n6、输入金额\n");
248         String input = scan.next();
249
250         if(input.equals("1") || input.equals("2") || input.equals("3") ||
251
252 input.equals("4") || input.equals("5") ){
253             double num = Double.parseDouble(input);
254             int num1 = (int)num;
255             switch(num1){
256             case 1 : get_Money = 100;break;
257             case 2 : get_Money = 300;break;
258             case 3 : get_Money = 500;break;
259             case 4 : get_Money = 1000;break;
260             case 5 : get_Money = 2000;break;
261             }
262
263             if(card1.getMoney() < get_Money){
264                 System.out.println("余额不足");
265             }else if(get_Money_Already + get_Money > MAX_GET_MONEY){
266                 System.out.println("本机每天最多取" + MAX_GET_MONEY);
267             }else if(localMoney < get_Money){
268                 System.out.println("本机已无那么多钱");
269             }else{
270                 card1.setMoney((card1.getMoney()-get_Money));    //改变余额
271
272
273                 //在文本信息里写入余额变化
274                 WriteInfo write = new WriteInfo();
275                 try {
276                     write.creatTxtFile();
277                     write.writeTxtFile(lineNum,card1);
278                 } catch (IOException e) {
279                     e.printStackTrace();
280                 }
281
282                 localMoney = (int)(localMoney - get_Money);        //改
283
284 变本机金额
285                 get_Money_Already += get_Money;
286                 System.out.println(get_Money + "元已出,请在规定时间取钱");
287                 System.out.println(get_Money_Already);
288             }
289
290
291
292         }else if(input.equals("6") ){
293             System.out.println("请取钱输入金额:");
294             if(scan.hasNextDouble()){
295                 input = scan.next();
296                 get_Money = (int)(Double.parseDouble(input));
297
298                 if(get_Money < 0){
299                     System.out.println("输入错误,请输入整百数");    //输
300
301 入的是负数等
302                 }else if(get_Money_Already + get_Money > MAX_GET_MONEY){
303                     System.out.println("本机每天最多取" +
304
305 MAX_GET_MONEY);
306                 }else if(get_Money % 100 != 0){
307                     System.out.println("输入的不是整百数");
308                 }else if(card1.getMoney() < get_Money){
309                     System.out.println("余额不足");
310                 }else if(get_Money > MAX_GET_SIGLE_MONEY){
311                     System.out.println("每次最多取" +
312
313 MAX_GET_SIGLE_MONEY);
314                 }else if(get_Money > localMoney){
315                     System.out.println("本机金额余量不足,请重新输入");
316                 }else{
317                     card1.setMoney((card1.getMoney()-get_Money));
318
319                     //把余额信息写入文本信息
320                     WriteInfo write = new WriteInfo();
321                     try {
322                         write.creatTxtFile();
323                         write.writeTxtFile(lineNum,card1);
324                     } catch (IOException e) {
325                         e.printStackTrace();
326                     }
327
328                     localMoney = (int)(localMoney - get_Money);
329                     get_Money_Already += get_Money;
330                     System.out.println(get_Money_Already);
331                     System.out.println(get_Money + "元已出,请在规定时间
332
333 取钱");
334                 }
335
336             }else{
337                 System.out.println("输入错误,请输入整百数");//输入的是字母
338
339 或者其他字符
340             }
341         }
342     }
343
344     public void saveMoney(Card card1){
345         Scanner scan = new Scanner(System.in);
346         String input;
347         double save_Money = 0;
348
349         System.out.println("请输入存钱金额:");
350         if(scan.hasNextDouble()){
351             input = scan.next();
352             save_Money = Double.parseDouble(input);
353             if(save_Money > 0){
354                 if(save_Money % 100 == 0){
355                     if(save_Money + localMoney <= MAX_LOCAL_MONEY){
356                         System.out.println("请将纸币整齐的放入存钱口
357
358 ");
359                         //等待存钱,并且检测真假币
360                         card1.setMoney(card1.getMoney() +
361
362 save_Money);
363
364
365                         //把余额信息写入文本信息
366                         WriteInfo write = new WriteInfo();
367                         try {
368                             write.creatTxtFile();
369                             write.writeTxtFile(lineNum,card1);
370                         } catch (IOException e) {
371                             e.printStackTrace();
372                         }
373
374
375                         localMoney = (int)(localMoney + save_Money);
376                         System.out.println("...   ...   ...");
377                         System.out.println("钱已存入!\n");
378                     }else{
379                         System.out.println("大于本机最大可收取存钱数
380
381 ,请减小存钱数");
382                     }
383                 }else{
384                     System.out.println("本机只能存整百数");
385                 }
386             }else{
387                 System.out.println("存钱金额错误,请输入整百数");    //输
388
389 入的是负数等
390             }
391         }else{
392             System.out.println("输入错误,请输入整百数");//输入的是字母或者其他
393
394 字符
395         }
396     }
397 }

ATMmain

 1 package com.ATM;
 2
 3 public class Card{
 4     private long account ;
 5     private long password ;
 6     private double money ;
 7
 8     public Card(){
 9
10     }
11
12
13     public long getAccount() {
14         return account;
15     }
16     public void setAccount(long account) {
17         this.account = account;
18     }
19     public long getPassword() {
20         return password;
21     }
22     public void setPassword(long password) {
23         this.password = password;
24     }
25     public double getMoney() {
26         return money;
27     }
28     public void setMoney(double money) {
29         this.money = money;
30     }
31
32 }

class Card

  1 package com.ATM;
  2
  3 import java.io.BufferedReader;
  4 import java.io.File;
  5 import java.io.FileInputStream;
  6 import java.io.FileNotFoundException;
  7 import java.io.FileOutputStream;
  8 import java.io.FileReader;
  9 import java.io.IOException;
 10 import java.io.InputStreamReader;
 11 import java.io.PrintWriter;
 12
 13 public class WriteInfo {
 14     private static String filenameTemp = "d:/bankinfo.txt";
 15
 16     public WriteInfo(){
 17
 18     }
 19
 20 //    public static void main(String[] args) {
 21 //        Card card1 = new Card();
 22 //        card1.setAccount(1234);
 23 //        card1.setPassword(123456);
 24 //        card1.setMoney(31689.4);
 25 //
 26 //        WriteInfo write = new WriteInfo();
 27 //        try {
 28 //            write.creatTxtFile();
 29 //            write.writeTxtFile(3,card1);
 30 //
 31 //        } catch (IOException e) {
 32 //            e.printStackTrace();
 33 //        }
 34 //    }
 35
 36
 37     //创建文件
 38
 39     public static boolean creatTxtFile() throws IOException {
 40         boolean flag = false;
 41         File filename = new File(filenameTemp);
 42         if (!filename.exists()) {
 43             filename.createNewFile();
 44             flag = true;
 45         }
 46         return flag;
 47     }
 48
 49     public static boolean writeTxtFile(int num,Card card1) throws IOException {
 50         // 先读取原有文件内容,然后进行写入操作
 51         boolean flag = false;
 52         String filein = card1.getAccount() + "\t" + card1.getPassword() + "\t" +
 53
 54 card1.getMoney();
 55 //        filein = "111111    111111    1000000";
 56         String temp = "";
 57
 58         FileInputStream fis = null;
 59         InputStreamReader isr = null;
 60         BufferedReader br = null;
 61
 62         FileOutputStream fos = null;
 63         PrintWriter pw = null;
 64         try {
 65             // 文件路径
 66             File file = new File(filenameTemp);
 67             // 将文件读入输入流
 68             fis = new FileInputStream(file);
 69             isr = new InputStreamReader(fis);
 70             br = new BufferedReader(isr);
 71             StringBuffer buf = new StringBuffer();
 72
 73             // 保存该文件原有的内容
 74             for (int j = 0; (temp = br.readLine()) != null; j++) {
 75
 76
 77                 if(j != num){
 78                     buf = buf.append(temp);
 79                     buf = buf.append(System.getProperty("line.separator"));
 80                 }else{
 81                     temp = filein;
 82                     buf = buf.append(temp);
 83                     buf = buf.append(System.getProperty("line.separator"));
 84                 }
 85
 86                 // System.getProperty("line.separator")
 87                 // 行与行之间的分隔符 相当于“\n”
 88             }
 89 //            buf.append(filein);//写入
 90
 91             fos = new FileOutputStream(file);
 92             pw = new PrintWriter(fos);
 93             pw.write(buf.toString().toCharArray());
 94             pw.flush();
 95             flag = true;
 96         } catch (IOException e1) {
 97             // TODO 自动生成 catch 块
 98             throw e1;
 99         } finally {
100             if (pw != null) {
101                 pw.close();
102             }
103             if (fos != null) {
104                 fos.close();
105             }
106             if (br != null) {
107                 br.close();
108             }
109             if (isr != null) {
110                 isr.close();
111             }
112             if (fis != null) {
113                 fis.close();
114             }
115         }
116         return flag;
117     }
118
119 }

class WriteInfo

时间: 2024-09-29 21:55:08

1.30 Java周末总结①控制显示多少位小数位②读txt和写txt模拟ATM数据库的相关文章

Eclipse或MyEclipse没有在java类文件上显示Spring图标的问题

Eclipse或MyEclipse没有在java类文件上显示接口图标的问题解决办法: 前: 后:

线程安全变量控制显示隐藏loading框

一.线程安全变量控制显示隐藏loading框 问题描述: 同一页面有两个异步网络请求,第一个请求开始,loading旋转,第二个请求开始loading旋转,第一个结束,loading停止旋转,可是这时第二个请求还没有结束,然后loading就结束了,于是问题就来了. 解决方案: 二.由上面问题引申出的问题: 1. #import <libkern/OSAtomic.h> 这段话是从网上copy过来的,总结了一下原子操作的作用.但是文中提到的osbase.h文件找不到.可能是因为版本升级我的li

Java 访问权限控制:你真的了解 protected 关键字吗?

摘要: 在一个类的内部,其成员(包括成员变量和成员方法)能否被其他类所访问,取决于该成员的修饰词:而一个类能否被其他类所访问,取决于该类的修饰词.Java的类成员访问权限修饰词有四类:private,无(默认情况下,包访问权限),protected 和 public,而其中只有包访问权限和public才能修饰一个类(内部类除外).特别地,很多的介绍Java的书籍对protected介绍的比较笼统,常常会对大家造成误解.因此,本文重点揭示了 protected 关键字的内涵和用法,并介绍了一些其他

采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址

采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址. Truelicense 它是一个开源java license 检验项目. 使用truelicense实现用于JAVAprojectlicense机制(包含license生成和验证)请參考http://www.it165.net/pro/html/201404/11540.html 当中包含license授权机制的原理和制作license的详细步骤 本文主要是

CSS控制显示超出部分,用省略号显示

常用,但是常忘,我又不是写css的,所以记下来: 先设置一下限制的宽度, display:block; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; CSS控制显示超出部分,用省略号显示

Java导出防止小数显示不全工具类

1.说明 在做项目的过程中,发现导出功能中的数据显示不全,如"0.4",会显示成".4":"-0.8"会显示成"-.8" 现在,通过以下Java工具类保证导出的数据(特别是小数)显示全 2.Java工具类 /** * @Title:DecimalPoint.java * @Package:com.you.model * @Description:解决导出时小数前的"0"被去掉的问题 * @Author: 游

Java访问权限控制小结

进行访问权限控制的两个原因 第一,可以控制类成员的可见性,使客户程序员只看到应该看到的内容 第二,可以使类的创建者随意改变类内部的工作方式,而不必担心会对客户端程序产生重大影响 四种访问权限 pulic 默认(包权限) protected private 用于域和方法 public表示所有人对本成员都可以访问 默认访问权限表示同一包下的类可以对本成员进行访问,其他包中的则不可以(!默认包) protected用于类的继承中,protected提供包访问权限,同时,子类也对protected成员具

CSS 相对/绝对(relative/absolute)定位与jQuery的控制显示隐藏

曾经写显示隐藏老是用jq方法控制: dom.show(); dom.hide(); 事实上这样还是有非常多缺陷的. 这是html结构: <div class="holi"> here are some test words </div> <div id="button">点击显示</div> 假设使用position:absolute和top-9999px控制点隐藏 .holi{ width: 200px; heigh

新东西003--android Gridview控制显示高度

一:需求 最近产品决定对公司软件做大修改,他想要实现网易云学习的标签栏效果,如下图(在A区域需要有一系列标签栏(标签栏多少不定,但每行三个,显示时如果超过屏幕2/3就要显示进度条,也就是最大不超过屏幕2/3的显示),B区域是一个listview,中间就是几个button,当B区域往上滑动的时候A区域自动收起,但在最上方显示当前选择的标签,点击标签弹出浮动的标签栏,当B区域滑动到最顶的时候,A区域开始显示.) 在上面的需求上,主要有两个问题 1.上面那一系列不知道多少个的是用button显示还是其