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