首页 / JAVA / Java实现人民币大写+GUI界面
Java实现人民币大写+GUI界面
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java实现人民币大写+GUI界面,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含18093字,纯文字阅读大概需要26分钟。
内容图文
![Java实现人民币大写+GUI界面](/upload/InfoBanner/zyjiaocheng/639/8e21be9d337c4ebe80c4d1b0b9e05b8a.jpg)
文章标题
1.提要
(1)基本功能:将人民币转换为大写,实现了仟亿级别以内的大写转换,规则和运行结果可参考网站https://link.fobshanghai.com/rmb.htm
(2)实现了简单的GUI界面,对于输入的异常情况有所提示和处理,有测试用例
(3)最终有两个窗口类,一个实现转换的类以及一个测试类
2.算法
(1)因为是自己写的,一边敲,思路就慢慢出来了,所以逻辑性不是那么的严谨,就勉强写出来了吧,最多只可实现仟亿以内的转换
(2)基本算法(实现功能的在Cconvert类中):
1)设置输入的数值为符号串,首先通过int ConvertRMB.Convert.inputflag(String money)
函数将金额字符串分为三种情况,当返回值为0时,输入的金额字符串包含不规则字符,即数字和小数点以外的符号。
2)根据int ConvertRMB.Convert.inputflag(String money)
,的返回值,在String ConvertRMB.Convert.Convertmoney(String money)
函数中通过字符串分割函数将金额划分为小数部分和整数部分,分别执行整数部分转换函数String ConvertRMB.Convert.convertzheng(String money1)
和小数部分转换函数String ConvertRMB.Convert.convertsmall(String money2)
,最后加上“人民币”字符串,再将两者拼接起来即可
3. 代码
(1)界面:windowbuilder插件的使用
(1)先创建项目,再在该项目下,按鼠标右键,选择 New ->other -> application window,新建一个Main的窗口类
(2) 点击 工作区下的Design ,先点击相对布局(也可选择其他布局)放在面板上,再随意添加组件。先点击组件,再将鼠标移到面板,点击即可,不是通过拖动。在Properties区域可以设置组件的响应信息,字体font,内容text等。在Components视图区,可以指定选择已经在在窗口中的组件,以及查看组件的包含关系。
(3)给组件添加事件。鼠标选中组件之后,按右键 -> add event handler,再选择要添加的事件。在sorce代码区,可以添加事件的相应响应效果。
(4)再根据需要修改、添加其中一些代码即可。
(5)最终Main.java类的代码,包括了事件部分
package ConvertRMB;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import java.awt.Font;
import javax.swing.AbstractAction;
import java.awt.event.ActionEvent;
import javax.swing.Action;
import javax.swing.JPopupMenu;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.ActionListener;
public class Main {
private JFrame frame;
private JTextField inputmoney;
private JTextField outputmoney;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Main window = new Main();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Main() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setTitle("\u4EBA\u6C11\u5E01\u5927\u5199\u8F6C\u6362");
frame.setBounds(100, 100, 617, 495);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
frame.setLocationRelativeTo(null); // 设置窗口居中
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/*
* 该类的这行代码frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
* 与Help类的frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
* 这两行代码是设置关闭Help窗口,Main窗口不关闭的
* */
inputmoney = new JTextField();
inputmoney.setFont(new Font("宋体", Font.PLAIN, 17));
inputmoney.setBounds(190, 92, 311, 42);
frame.getContentPane().add(inputmoney);
inputmoney.setColumns(10);
outputmoney = new JTextField();
outputmoney.setFont(new Font("宋体", Font.PLAIN, 17));
outputmoney.setBounds(190, 183, 311, 42);
frame.getContentPane().add(outputmoney);
outputmoney.setColumns(10);
JLabel lblNewLabel = new JLabel("\u5C0F\u5199\u91D1\u989D");
lblNewLabel.setBounds(89, 95, 72, 39);
frame.getContentPane().add(lblNewLabel);
JLabel lblNewLabel_1 = new JLabel("\u5927\u5199\u91D1\u989D");
lblNewLabel_1.setBounds(89, 186, 72, 39);
frame.getContentPane().add(lblNewLabel_1);
JLabel lblNewLabel_2 = new JLabel("\u4EBA\u6C11\u5E01\u5927\u5199\u8F6C\u6362");
lblNewLabel_2.setFont(new Font("宋体", Font.PLAIN, 16));
lblNewLabel_2.setBounds(217, 55, 159, 24);
frame.getContentPane().add(lblNewLabel_2);
JButton help = new JButton("\u67E5\u770B\u5E2E\u52A9");
help.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
new Help();
}
});
help.setBounds(472, 408, 113, 27);
frame.getContentPane().add(help);
JButton btnConvert = new JButton("\u8F6C\u6362\u4E3A\u5927\u5199");
btnConvert.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
String money=inputmoney.getText();//获取 输入内容
int flag=Convert.inputflag(money); //先判断输入的数字是否符合实际情况
if(flag==1) { //有小数点
String money1=money.substring(0,money.indexOf(".")); //整数部分的字符串
String money2=money.substring(money1.length()+1,money.length()); //小数部分
if (money1.length()>12) {
JOptionPane.showMessageDialog(null, "抱歉,当前数值过大,请重新输入,确保数值小于1000000000000");
inputmoney.setText("");
outputmoney.setText("");
}
}
if ( flag == 0 ) { //输入数字不符合规范
JOptionPane.showMessageDialog(null, "对不起,您输入的金额不符合规范,请重新输入!");
inputmoney.setText("");
outputmoney.setText("");
}
else { //只有整数部分
if (money.length()>12) {
JOptionPane.showMessageDialog(null, "抱歉,当前数值过大,请重新输入,确保数值小于1000000000000");
inputmoney.setText("");
outputmoney.setText("");
}
else {
outputmoney.setText(Convert.Convertmoney(money));
}
}
}
});
btnConvert.setBounds(173, 260, 254, 42);
frame.getContentPane().add(btnConvert);
JButton btnClear = new JButton("\u6E05\u7A7A");
btnClear.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
inputmoney.setText("");
outputmoney.setText("");
}
});
btnClear.setBounds(173, 315, 254, 42);
frame.getContentPane().add(btnClear);
JLabel lblNewLabel_3 = new JLabel("\u63D0\u793A\uFF1A\u5F53\u5C0F\u6570\u4F4D\u6570\u8FC7\u591A\u65F6\uFF0C\u81EA\u52A8\u8FDB\u884C\u56DB\u820D\u4E94\u5165");
lblNewLabel_3.setBounds(116, 147, 360, 18);
frame.getContentPane().add(lblNewLabel_3);
}
}
效果:
(6)其中,点击查看帮助按钮后跳出另一个关于人民币大写相关信息的Help窗口。
Help.java 通常是通过windowbuilder插件制作的窗口,再修改了一些,该类读取在该项目文件下的 help.txt 文件,并将内容显示在滚动面板上但是当该项目文件下没有该文件时,会异常,但我没有写出相应的提示信息,只是运行时有问题,这点可以加上。
代码部分:
package ConvertRMB;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import java.awt.Font;
public class Help {
private JFrame frame;
/**
* Create the application.
*/
public Help() {
initialize();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); //设置关闭时退出JVM
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setTitle("\u4EBA\u6C11\u5E01\u5927\u5199\u76F8\u5173\u77E5\u8BC6");
frame.setBounds(100, 100, 890, 710);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(14, 13, 844, 637);
frame.getContentPane().add(scrollPane);
JTextArea help = new JTextArea();
help.setFont(new Font("宋体", Font.PLAIN, 16));
scrollPane.setViewportView(help);
String aline="";
try{
FileReader f1 = new FileReader("help.txt");
BufferedReader br=new BufferedReader(f1);
//arry.clear(); // 清除原数组列表中的数据
while ((aline= br.readLine())!= null)
{
help.append(aline+ "\r\n");
}
f1.close();
br.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
(2)实现人民币转换的类 Convert.java
1)基本算法就是将输入的字符串分为整数部分和小数部分来分别转换,然后需要考虑一些细节,注意一些特殊数字。
2)分别用strDigit[]= {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
数组存储大写字符,strUnit = "元拾佰仟万拾佰仟亿拾佰仟"
和strsmall="角分";
存储各个数量级的单位,字符串可以通过下标得到其中的字符,字符串通过int ch=money.charAt(i);
可以得到其中字符的ASCII码,或char ch=money.charAt(i);
得到字符。其实都可以用字符或者字符串来存储。
3)小数部分比较简单,整数部分注意字符串或者数字是从左往右,而我们正常读数是需要从右往左确定最高位是多少数量级。
4)这个类一共四个方法,第一个是判断输入的字符串是否符合规范和确定是否有小数部分的public static int inputflag(String money) { }
,第二个是整数部分的转换方法public static String convertzheng(String money1) { }
,再就是小数部分转换方法public static String convertsmall(String money2) { }
,最后是将小数部分读法和整数部分读法合起来的方法public static String Convertmoney(String money) { }
。其他类若需要只需要调用public static String Convertmoney(String money) { }
方法就行了。
代码部分:
package ConvertRMB;
/*
* 人民币大写
* */
public class Convert {
//大写数字
static String strDigit[]= {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
//整数部分的单位
static String strUnit = "元拾佰仟万拾佰仟亿拾佰仟"; //最多只可转换到仟亿级别
//小数部分的单位
static String strsmall="角分";
//判断输入的金额是否符合规范,只包含数字或小数点,最高位不能为0,有小数点,但小数点后没有数字
//小数部分与整数部分特殊情况0.00
public static int inputflag(String money) {
int flag=2; //0表示不符合规范,1表示符合规范且有小数点,2表示符合规范但没有小数点
for(int i=0; i<money.length();i++) { //先判断是不是都是数字或者小数点
//System.out.println("当前判定的字符为:"+money.charAt(i));
int ch=money.charAt(i);
//System.out.println("i:"+i+"当前数字为:"+(ch-48));
//System.out.println(ch);
if(ch<46||ch == 47||ch>57) { //判断不是数字且不是小数点
flag=0;
return flag;
}
else {
if(ch==46) {
flag=1;
//System.out.println("flag=1"); //符合规范但有小数点
}
}
}
if (flag == 1) { // 有小数点的情况,判断整数部分最高位(个位以上)是不是0,特例为000.0000,或者小数点后有没有数字
String money1=money.substring(0,money.indexOf(".")); //整数部分的字符串
String money2=money.substring(money1.length()+1,money.length()); //小数部分
int sum=0;
for (int i = 0; i < money1.length(); i++) {
sum=sum+money1.charAt(i)-48;
}
//System.out.println("整数部分和为:"+sum);
if (money1.length()>1 && money1.charAt(0) =='0' && sum!=0) {
flag=0;
return flag;
}
if (money2.length()==0) { // x.
flag=0;
return flag;
}
}
if (flag==2 && money.charAt(0)=='0') { //只有整数,但最高位为0
flag=0;
return flag;
}
return flag;
}
// 整数部分转换大写,特殊情况100001,10000,10111,即数字中间一个0,多个0只读一个0
public static String convertzheng(String money1) {
String convertbig="";
int sum=0;
int length=money1.length();
// 特殊情况 300 0000
for (int i = 1; i < length; i++) {
int number=money1.charAt(i)-48;
sum=sum+number;
}
//System.out.println("整数部分为:"+money1);
//System.out.println(sum);
if (sum == 0 && length >1 ) {
for (int i = 0; i< length ; i++) {
int number=money1.charAt(i)-48;
if (number!=0 && (length-i-1)% 4 !=0 ) { //第一个数字读数
convertbig=convertbig+strDigit[number] + strUnit.charAt(length-i-1);
}
if ( number == 0 && (length-i-1)% 4 == 0 && (length-i-1)/4!= 0 ) { //
convertbig=convertbig+strUnit.charAt(length-i-1);
}
if ((length-i-1)%4==3) {
convertbig=convertbig+"元";
break;
}
}
return convertbig;
}
sum=0;
convertbig="";
for(int i=0; i<length; i++) {
int number=money1.charAt(i)-48; //当前的数字是多少
//System.out.println("当前单位在字符串下标为:"+(length-i-1));
String str=""; //当前数字的单位
str=strUnit.charAt(length-i-1)+"";
//System.out.println("当前数字为:"+number+" 当前数字的单位为:"+str);
if(number!=0) {
convertbig=convertbig+strDigit[number]+str;
sum=0;
}
else { // 该数为 0
if((length-1-i) %4 == 0) { //个位为0,万位为0,亿位为零
str=strUnit.charAt(length-1-i)+"";
convertbig=convertbig+str;
}
else {
sum++;
//System.out.println("当前有"+sum+"个零");
if(sum == 1 ) { //中间有多个零,
convertbig=convertbig+"零";
}
}
}
//System.out.println(convertbig);
//System.out.println();
}
//System.out.println("整数部分读法为:"+convertbig);
return convertbig;
}
//小数部分转换大写,小数部分特殊情况00,10,01
public static String convertsmall(String money2) {
String convertbig="";
int sum=0; //小数部分和
int length=money2.length();
// 先进行四舍五入
if(length>2) {
//System.out.println("提示:当前小数位数过多,自动进行四舍五入,保留两位小数!");
int a=money2.charAt(2)-48; //第三位的数字
if(a>4) {
int b=money2.charAt(1)+1-48;
String c=b+"";
StringBuilder str=new StringBuilder(money2);
str.replace(1, 2, c);
money2=""+str;
}
money2=money2.substring(0,2); //四舍五入后,保留前两位
}
length=money2.length();
// 转换
for (int i = 0; i < length; i++) {
char ch=money2.charAt(i); //当前的字符是什么
int number=money2.charAt(i)-48; //当前的数字是多少
sum=sum+number;
convertbig=convertbig+strDigit[number]+strsmall.charAt(i);
if (i==1) { // 小数部分为 01
if (number==0) {
convertbig=convertbig.substring(0,2); //取前两位
}
if (sum == 0) { //小数部分为00
convertbig="整";
}
}
if( i==0 && number==0) //小数部分为01
convertbig="零";
}
return convertbig;
}
// 转换函数
public static String Convertmoney(String money) {
//System.out.println("这里是Convert类");
System.out.println("人民币大写");
int flag=inputflag(money);
String money1 ="";
String money2="";
String bigmoneyString="";
//System.out.println("flag:"+flag);
//System.out.println("进行转换");
if(flag==1) { //有小数点
money1=money.substring(0,money.indexOf(".")); //整数部分的字符串
money2=money.substring(money1.length()+1,money.length()); //小数部分
// System.out.println("人民币"+convertzheng(money1)+convertsmall(money2));
//System.out.println(money1);
//System.out.println(money2);
if (convertzheng(money1).equals("元") && convertsmall(money2).equals("整")) {
bigmoneyString="人民币零元";
}
else {
if (convertzheng(money1).equals("元")) {
bigmoneyString="人民币"+convertsmall(money2);
}
else {
bigmoneyString="人民币"+convertzheng(money1)+convertsmall(money2);
}
}
//System.out.println(bigmoneyString);
}
if(flag==2) { //只有整数
//System.out.println("当前没有小数部分");
money1=convertzheng(money);
//System.out.println("人民币"+money1);
bigmoneyString="人民币"+convertzheng(money)+"整";
//System.out.println(bigmoneyString);
}
return bigmoneyString;
}
}
(3)测试用例类:使用JUnit测试
(1)将Junit4单元测试包引入JUnit_Test项目。在该项目上单击右键,然后在弹出的快捷菜单中选择“属性”命令。在弹出的“属性”窗口中,首先在左边选择Java Build Path选项,然后到右侧选择Libraries标签,再在最右边单击Add Library按钮,选择JUnit4并单击Finish按钮,将JUnit4软件包加入到JUnit_Test项目。
(2)生成JUnit测试框架。在Eclipse的Package Explorer中用右键单击需要测试的类,在弹出的快捷菜单中选择New a JUnit Test Case,在弹出的对话框中选择setUp()和 teardown()方法。点击Next后,勾选需要测试的方法,自动生成测试类,再自己完善测试用例,即可。
(3)运行。在测试类上单击右键,然后在弹出的快捷菜单中选择Run AS a JUnit Test命令,运行结果如图3-3。
(4)代码部分:
package ConvertRMB;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class ConvertTest {
private static Convert convertest=new Convert();
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testConvertmoney() { //随机测试
String bigmoneyString=convertest.Convertmoney("1688.99");
assertEquals("人民币壹仟陆佰捌拾捌元玖角玖分",bigmoneyString);
}
@Test
public void testConvertmoney1() { //测试特殊值零元
String bigmoneyString=convertest.Convertmoney("0.00");
assertEquals("人民币零元",bigmoneyString);
}
@Test
public void testConvertmoney2() { //测试当整数部分为多个零时的特殊值零元
String bigmoneyString=convertest.Convertmoney("0000.00");
assertEquals("人民币零元",bigmoneyString);
}
@Test
public void testConvertmoney3() { //中间有一个零时
String bigmoneyString=convertest.Convertmoney("105.65");
assertEquals("人民币壹佰零伍元陆角伍分",bigmoneyString);
}
@Test
public void testConvertmoney4() { // 整数
String bigmoneyString=convertest.Convertmoney("1000000000");
assertEquals("人民币壹拾亿元整",bigmoneyString);
}
@Test
public void testConvertmoney5() { //中间有多个零时
String bigmoneyString=convertest.Convertmoney("30005.0563");
assertEquals("人民币叁万零伍元零陆分",bigmoneyString);
}
@Test
public void testConvertmoney6() { //测试个位为零
String bigmoneyString=convertest.Convertmoney("620.5");
assertEquals("人民币陆佰贰拾元伍角",bigmoneyString);
}
@Test
public void testConvertmoney7() { //测试最大级别
String bigmoneyString=convertest.Convertmoney("123456789234");
assertEquals("人民币壹仟贰佰叁拾肆亿伍仟陆佰柒拾捌万玖仟贰佰叁拾肆元整",bigmoneyString);
}
@Test
public void testConvertmoney8() { // 测试整数部分为0,但有小数
String bigmoneyString=convertest.Convertmoney("0.56");
assertEquals("人民币伍角陆分",bigmoneyString);
}
@Test
public void testConvertmoney9() { // 测试万位为0,同理测试亿位为0
String bigmoneyString=convertest.Convertmoney("4501234.45");
assertEquals("人民币肆佰伍拾万壹仟贰佰叁拾肆元肆角伍分",bigmoneyString);
}
@Test
public void testConvertmoney10() { // 测试万位为0,同理测试亿位为0
String bigmoneyString=convertest.Convertmoney("123445011234.45");
assertEquals("人民币壹仟贰佰叁拾肆亿肆仟伍佰零壹万壹仟贰佰叁拾肆元肆角伍分",bigmoneyString);
}
@Test
public void testConvertmoney11() { // 测试四舍五入功能
String bigmoneyString=convertest.Convertmoney("1234.45789");
assertEquals("人民币壹仟贰佰叁拾肆元肆角陆分",bigmoneyString);
}
}
(6)测试结果:
如果有和预期不一样的,会提示Failures,选择是哪一个测试用例有问题,查看预期结果和实际结果的差别就行了,个人觉得比自己写输入语句和System.out.println();
语句对比结果要好,System.out.println();
可以在调bug的时候使用。
4.可改进的地方
(1)对于转换的级别,仟亿后万亿级别的,使用迭代之类的,应该可以实现,有想法和能力,可以尝试一下。代码也可以再精简,逻辑性再强一些。
(2)GUI界面之类的,这种东西肯定是越做越全面,但只是个小实验的话,个人觉得没有什么必要。
(3)对于所有不能处理,或者会出现异常的地方,都应该有相应的提示信息,而不是程序直接不能运行。比如读文件时,如果没有文件,应该报错,给出提示。
内容总结
以上是互联网集市为您收集整理的Java实现人民币大写+GUI界面全部内容,希望文章能够帮你解决Java实现人民币大写+GUI界面所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。