请教一个货币大写的算法,万分感谢 我也写了一个,也不满意,总有不对的地方 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自己曾经编的一个,思路混乱,献丑了~~不过自以为考虑还算全面~// MyApp.java//by__www.haisens.org f/*本程序的思想是: 转化 输入 string 为double , 分别取出整数 位放入数组 (inte[13]) ,小数位放入数组(floa[4]) 整数部分根据 (位数/4) 的结果 判断加后缀 (mid[])万亿兆, 和判断 加(end[]) 十百千 考虑例外比较多,各个if else 判断出写出了针对于哪些特殊情况的处理*/import javax.swing.*;import java.awt.*;import java.awt.event.*;class NUMFException extends Exception{}public class MyApp extends JApplet{ protected JTextField in =new JTextField(25), out =new JTextField(25); private JButton btn = new JButton("Num_To_RMB"); private JFrame dlg =new JFrame(); //for JOptionPane/* 捕捉不能识别 的 这样的错误输入 例子: 123d*/ public static void testNUMF(String str) throws NUMFException{ if (str.charAt(str.length()-1)=='d'||str.charAt(str.length()-1)=='f'|| str.charAt(str.length()-1)=='D'||str.charAt(str.length()-1)=='F') throw new NUMFException(); }/*捕捉按钮action */ class Bl implements ActionListener { public void actionPerformed(ActionEvent e) throws NumberFormatException { try { String instr =in.getText(); testNUMF(instr); StringBuffer outstr=new StringBuffer(); outstr= Trans(instr,outstr); out.setText(outstr.toString()); } catch (NUMFException e1) { // 例子:1233d 121.232f JOptionPane.showMessageDialog(dlg, "末尾不能有字母","错误提示",JOptionPane.WARNING_MESSAGE); in.setText(""); } catch (NumberFormatException e2) { // 例子:aaaaa JOptionPane.showMessageDialog(dlg, "输入数字格式错误","错误提示",JOptionPane.WARNING_MESSAGE); in.setText(""); } catch (ArrayIndexOutOfBoundsException e3){ // 例子:1e13 JOptionPane.showMessageDialog(dlg, "数字超出范围","错误提示",JOptionPane.ERROR_MESSAGE); in.setText(""); } } }/***定义转换方法 Trans()***/ public static StringBuffer Trans(String in ,StringBuffer out) { String chn[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; String end[]={"","拾","佰","仟",}; String mid[]={"","万","亿","兆",}; double ind =Double.parseDouble(in); long ind_left =(long)ind; long[] inte= new long[13]; //存放整数位 int[] floa=new int[4]; //存放小数位/*将整数部分放入inte[]*/ for(int i=12;i>=0;i--) { inte[i]=(long)(ind_left/(long)(Math.pow(10,i))); ind_left%=(long)(Math.pow(10,i)); }/*象小数部分放入floa[]*/ int index=in.indexOf('.'); if(index!=-1) { String str=in.substring(index+1); for (int i=0;i<str.length();i++) { floa[i]=Integer.parseInt(str.substring(i,i+1)); } }/**如果整数位不是0,处理整数位 例子:111.1234**/ if ((int)ind!=0) { int i=12; while(inte[i]==0) //查找首位 {i--;}/*输出到 out */ for(int j=i/4;j>=0;j--) { if (j==3) //如果 数字13位,单独处理 1兆 {out.append(chn[(int)(inte[12])]).append(mid[3]); j--;} for(int k=3;k>=0;k--) { int num=4*j+k; if (inte[num]!=0) //再不是0的位上一次添加 十百千 { out.append(chn[(int)(inte[num])]).append(end[k]); } else { if(k==0||k==0&&k==1||k==0&&k==1&&k==2||k==0&&k==1&&k==2&&k==3) {} //如果是 万亿位 的最后几位全是0 则也不输出 else { if (inte[num-1]==0){} //根据后面以为是不是0判断加不加0 例子: 1003 else out.append(chn[0]) ; } } } if(!(inte[j*4+0]==0&&inte[j*4+1]==0&&inte[j*4+2]==0&&inte[j*4+3]==0)) //如果有一段全是0 则也不输出位 例子:1000 0000 0003 不会出现 一千亿 万 零三 out.append(mid[j]); } if (out.charAt(0)=='零') //因为最后一位没有下一位,所以是0则删去 {out.deleteCharAt(0);} //例子 30 }/**如果整数位是0,处理整数位 ,直接加0 例子:0.1234**/ else {out.append('零');}/*处理小数部分*/ /*如果存在小数位*/ if (index!=-1) { out.append('点');//处理小数位 for(int m=0;m<=3;m++) { out.append(chn[floa[m]]); } int zero=out.length()-1; while (out.charAt(zero)=='零') //最后几位如果是0,则删除 {out.deleteCharAt(zero);zero--;} } return out;} public void init() { btn.addActionListener(new Bl()); Container cp =getContentPane(); cp.setLayout(new FlowLayout()); out.setEditable(false); cp.add(in); cp.add(out); cp.add(btn); } public static void main(String[] args) { JFrame frame= new JFrame("数字转化中文"); MyApp my =new MyApp(); frame.getContentPane().add(my); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300,200); my.init(); frame.show(); }} 电力系统员工考核管理系统设计 y=(char)+i是什么意思呢? 关于Math.round取余的问题,简单但是不明白! 大家都来帮忙或学习呀,如何得到一个指定的月中有几周? 谢谢 这个错误提示是怎么回事??? 给来这里的兰州大学计算机系学生的公开信 java中有随机变量吗? 内部类的作用?? 为什么滚动条出不来呢? 诚交JAVA朋友,咱们在QQ里聊 在socket中传送对象流遇到的问题,请大家给点帮助 servlet 原理 javabean 原理
// MyApp.java
//by__www.haisens.org f/*本程序的思想是: 转化 输入 string 为double ,
分别取出整数 位放入数组 (inte[13]) ,小数位放入数组(floa[4])
整数部分根据 (位数/4) 的结果 判断加后缀 (mid[])万亿兆,
和判断 加(end[]) 十百千
考虑例外比较多,各个if else 判断出写出了针对于哪些特殊情况的处理
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;class NUMFException extends Exception{}public class MyApp extends JApplet
{
protected JTextField in =new JTextField(25),
out =new JTextField(25);
private JButton btn = new JButton("Num_To_RMB");
private JFrame dlg =new JFrame(); //for JOptionPane/* 捕捉不能识别 的 这样的错误输入 例子: 123d*/
public static void testNUMF(String str) throws NUMFException{
if (str.charAt(str.length()-1)=='d'||str.charAt(str.length()-1)=='f'||
str.charAt(str.length()-1)=='D'||str.charAt(str.length()-1)=='F')
throw new NUMFException();
}
/*捕捉按钮action */
class Bl implements ActionListener
{
public void actionPerformed(ActionEvent e) throws NumberFormatException
{
try {
String instr =in.getText();
testNUMF(instr);
StringBuffer outstr=new StringBuffer();
outstr= Trans(instr,outstr);
out.setText(outstr.toString());
} catch (NUMFException e1) { // 例子:1233d 121.232f
JOptionPane.showMessageDialog(dlg, "末尾不能有字母","错误提示",JOptionPane.WARNING_MESSAGE);
in.setText("");
} catch (NumberFormatException e2) { // 例子:aaaaa
JOptionPane.showMessageDialog(dlg, "输入数字格式错误","错误提示",JOptionPane.WARNING_MESSAGE);
in.setText("");
} catch (ArrayIndexOutOfBoundsException e3){ // 例子:1e13
JOptionPane.showMessageDialog(dlg, "数字超出范围","错误提示",JOptionPane.ERROR_MESSAGE);
in.setText("");
}
}
}/***定义转换方法 Trans()***/
public static StringBuffer Trans(String in ,StringBuffer out)
{
String chn[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
String end[]={"","拾","佰","仟",};
String mid[]={"","万","亿","兆",}; double ind =Double.parseDouble(in);
long ind_left =(long)ind;
long[] inte= new long[13]; //存放整数位
int[] floa=new int[4]; //存放小数位/*将整数部分放入inte[]*/
for(int i=12;i>=0;i--)
{
inte[i]=(long)(ind_left/(long)(Math.pow(10,i)));
ind_left%=(long)(Math.pow(10,i));
}/*象小数部分放入floa[]*/
int index=in.indexOf('.');
if(index!=-1)
{
String str=in.substring(index+1);
for (int i=0;i<str.length();i++)
{
floa[i]=Integer.parseInt(str.substring(i,i+1));
}
}/**如果整数位不是0,处理整数位 例子:111.1234**/
if ((int)ind!=0)
{
int i=12;
while(inte[i]==0) //查找首位
{i--;}/*输出到 out */
for(int j=i/4;j>=0;j--)
{
if (j==3) //如果 数字13位,单独处理 1兆
{out.append(chn[(int)(inte[12])]).append(mid[3]);
j--;}
for(int k=3;k>=0;k--)
{
int num=4*j+k;
if (inte[num]!=0) //再不是0的位上一次添加 十百千
{
out.append(chn[(int)(inte[num])]).append(end[k]);
}
else
{
if(k==0||k==0&&k==1||k==0&&k==1&&k==2||k==0&&k==1&&k==2&&k==3) {} //如果是 万亿位 的最后几位全是0 则也不输出
else
{
if (inte[num-1]==0){} //根据后面以为是不是0判断加不加0 例子: 1003
else
out.append(chn[0]) ;
}
}
}
if(!(inte[j*4+0]==0&&inte[j*4+1]==0&&inte[j*4+2]==0&&inte[j*4+3]==0)) //如果有一段全是0 则也不输出位 例子:1000 0000 0003 不会出现 一千亿 万 零三
out.append(mid[j]);
} if (out.charAt(0)=='零') //因为最后一位没有下一位,所以是0则删去
{out.deleteCharAt(0);} //例子 30
}
/**如果整数位是0,处理整数位 ,直接加0 例子:0.1234**/
else
{out.append('零');}/*处理小数部分*/
/*如果存在小数位*/
if (index!=-1)
{
out.append('点');//处理小数位
for(int m=0;m<=3;m++)
{
out.append(chn[floa[m]]);
}
int zero=out.length()-1;
while (out.charAt(zero)=='零') //最后几位如果是0,则删除
{out.deleteCharAt(zero);zero--;}
} return out;
}
public void init()
{
btn.addActionListener(new Bl());
Container cp =getContentPane();
cp.setLayout(new FlowLayout());
out.setEditable(false);
cp.add(in);
cp.add(out);
cp.add(btn); } public static void main(String[] args)
{
JFrame frame= new JFrame("数字转化中文");
MyApp my =new MyApp();
frame.getContentPane().add(my);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300,200);
my.init();
frame.show();
}
}