今天面试的一道编程题目 输入任意18位整数,输出中文比如输入“123456789”输出“一亿两千三百四十五万六千七百八十九”要考虑到各种异常和越界我写了一个,结果第一个测试数据1000000000000就不对。大家一起讨论下这个程序怎么写最完美? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 参考一下这个吧/**-----------人民币 大写转换 * * @param num ----要转化的数字 * @return */public static String makeUpperCaseSum(String numStr) { String isNeg = "";//正或者负 double num = Double.parseDouble(numStr); if (num < 0) { num *= -1; isNeg = "负"; numStr = numStr.substring(1); } final String[] upper_number = { "零","壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; final String[] number_dw = { "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万" }; String operate = numStr; String upper_str = ""; String upper_str_pre = ""; String upper_str_later = ""; String vsDx; int i, j, point_pos, int_len; if (num < 0.01) { return "零圆整"; } upper_str_pre = ""; point_pos = operate.indexOf("."); if (point_pos == -1) { int_len = operate.length(); } else { int_len = point_pos; } if (int_len > number_dw.length) { return "too long !!!"; } if (num > 0) { for (i = 0; i < operate.length(); i++) { j = int_len - i; if(j>0){//整数部分 int k = Integer.parseInt(operate.substring(i, i + 1)); if(k==0){//数字为0时 if(j==5||j==9)//单位为亿或者万时 upper_str_pre += upper_number[k] + number_dw[j-1]; else upper_str_pre += upper_number[k]; } else upper_str_pre += upper_number[k] + number_dw[j-1]; }else if(j<0){//小数部分 int k = Integer.parseInt(operate.substring(i, i + 1)); upper_str_later += upper_number[k]; if(j==-1) upper_str_later += "角"; else upper_str_later += "分"; } } //end for } //end if upper_str_pre += "圆"; while(upper_str_pre.indexOf("零零")!=-1){ upper_str_pre = upper_str_pre.replaceAll("零零","零"); } upper_str_pre = upper_str_pre.replaceAll("零万","万"); upper_str_pre = upper_str_pre.replaceAll("零亿","亿"); upper_str_pre = upper_str_pre.replaceAll("亿万","亿零"); upper_str_pre = upper_str_pre.replaceAll("零零","零"); upper_str_pre = upper_str_pre.replaceAll("零圆","圆"); if("圆".equals(upper_str_pre)) upper_str_pre = ""; upper_str = isNeg+upper_str_pre + upper_str_later; upper_str = upper_str.replaceAll("零角零分","整"); if(point_pos == -1) upper_str += "整"; return upper_str;} public class Currency{ public static String transfer(String s){ boolean flag2 = true; //判断碰到‘0’是否要打印出‘零’。 boolean flag = true; //每隔4位判断是打印‘萬’或‘億’。 String str=""; for(int i=s.length()-1,j=1;i>=0;i--,j++){ String ss = sToL(s.charAt(i)); if(ss.equals("error")) return "格式不正确!"; int m = j%4; //4位一循环 if(m==1) { if(!ss.equals("")) { str = ss + str; flag2 = true; } else flag2 = false; } if(m==2) { if(ss.equals("")){ if(flag2){ str = "零" + str; flag2 = false; } }else { str = ss + "拾" + str; flag2 = true; } } if(m==3) { if(ss.equals("")){ if(flag2){ str = "零" + str; flag2 = false; } }else{ str = ss + "佰" + str; flag2 = true; } } if(m==0) { if(ss.equals("")){ if(flag2){ str = "零" + str; flag2 = false; } }else{ str = ss + "仟" + str; flag2 = true; } if(i>0) { if(flag) str = "萬" + str; else str = "億" + str; flag = !flag; } } } return escape(str); } //消去多余的‘萬’字。 public static String escape(String str){ int pos = str.indexOf("億"); while(pos != -1){ if(str.charAt(pos + 1)=='萬'){ str = str.substring(0,pos+1) + str.substring(pos +2); } pos = str.indexOf("億",pos+1); } return str; } //阿拉伯数字与中文的对应 public static String sToL(char c){ if(c=='0'){ return ""; } if(c=='1'){ return "壹" ; } if(c=='2'){ return "貳" ; } if(c=='3'){ return "叁" ; } if(c=='4'){ return "肆" ; } if(c=='5'){ return "伍" ; } if(c=='6'){ return "陸" ; } if(c=='7'){ return "柒" ; } if(c=='8'){ return "捌" ; } if(c=='9'){ return "玖" ; } return "error"; } public static void main(String[] args){ System.out.println(transfer("1234567890")); }} 上面最好控制下 位数多了就变成 System.out.println(Money.transfer("123456789012345678"));壹拾貳億叁仟肆佰伍拾陸萬柒仟捌佰玖拾億壹仟貳佰叁拾肆萬伍仟陸佰柒拾捌 上面的该为:1)生成含有零“位”的中文字串。2)定义一寄存“位”(UNICODE CHAR),并初始化为中文字串的最高的位(如“千”什么的)。定义一状态标志(BOOLEAN)。3)将比较指针向后移动一位。4)比较寄存“位”和比较指针上的“位”,小于则将比较指针上的“位”存到寄存“位”,大于则再判断比较指针“位”前面的字符是否“零”,如果是就将这个“位”和其前面的“零”字符删除,并将状态标志置为“TRUE”,如果不是,就再判断状态标志是否为“TRUE”,如果“TRUE”就在比较指针所指字符的前面字符前插入“零”字符。5)比较指针向后移动两个字符直到中文字符串末。6)转到“4)”。 先要了解大写的规则才能实现,规则是:从个到千不断循环,进位分别是个,万,亿和兆,没有千兆以上,关于零,则在个到千之间有空缺时补零。实现的代码如下: /** * @param sNum 123020349821734 * @return */ public String transfer(String sNum){ String money = ""; String[] han = {"", "十", "百", "千"}; String[] wei = {"", "万", "亿", "兆"}; int count = 0; int pos = 0; boolean hasShow = false; for(int i=sNum.length()-1; i>=0; i--){ if(count > 3){ count = 0; pos ++; hasShow = false; } if(pos > 3){ money = "E" + money; break; } String n = sNum.substring(i, i+1); if(hasShow){ money = this.getHanNum(n) + han[count] + money; }else{ money = this.getHanNum(n) + han[count] + wei[pos] + money; } hasShow = true; count ++; } //format for(int i=2; i<4; i++){ money = money.replaceAll(han[i] + this.getHanNum("0") , han[i] + "零" + this.getHanNum("0")); } //0 if(money.substring(money.length()-1).equals("0")){ money = money.substring(0, money.length()-1); } for(int i=1; i<4; i++){ money = money.replaceAll(this.getHanNum("0") + han[i], ""); } money = money.replaceAll(this.getHanNum("1")+ han[1], han[1]); for(int i=1; i<4; i++){ money = money.replaceAll(this.getHanNum("0") + wei[i], wei[i]); } //零 while(money.indexOf("零零") > 0){ money = money.replaceAll("零零", "零"); } if(money.substring(money.length()-1).equals("零")){ money = money.substring(0, money.length()-1); } for(int i=1; i<3; i++){ money = money.replaceAll(wei[i+1] + "零" + wei[i], wei[i + 1]); } for(int i=1; i<4; i++){ money = money.replaceAll("零" + wei[i], wei[i]); } return money + "元"; } private String getHanNum(String num){ String[] hans ={"0", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; String hanNum = ""; hanNum = hans[Integer.parseInt(num)]; return hanNum; } 赴日软件工程师:1.两年工作经验,至少有一年软件项目经验2.日语可基本交流,能流利交流更佳3.学历:本科学士学位,计算机相关专业,或大专(正规全日制大专,同时拥有信息产业部的程序员证书)国内开发部SE:1.熟悉java、 vb、.net其中一种;2.有一定日语基础,能看懂日文式样书;3.两年以上软件开发经验。联系方式:[email protected](邮件并MSN) 输入地 是数字, 但你可以按TEXT 来处理(EDIT 里面用户输入地就是数字,但还是text) ,也就你读的是 文本 ,只不果 转换成 中文 数字输出而已 , public static String numtochinese(String input) { String s1 = "零壹贰叁肆伍陆柒捌玖"; String s4 = "分角整元拾佰仟万拾佰仟亿拾佰仟"; String temp = ""; String result = ""; if (input == null) return "输入字串不是数字串只能包括以下字符('0'~'9','.'),输入字串最大只能精确到仟亿,小数点只能两位!"; temp = input.trim(); float f; try { f = Float.parseFloat(temp); } catch (Exception e) { return "输入字串不是数字串只能包括以下字符('0'~'9','.'),输入字串最大只能精确到仟亿,小数点只能两位!"; } int len = 0; if (temp.indexOf(".") == -1) len = temp.length(); else len = temp.indexOf("."); if (len > s4.length() - 3) return ("输入字串最大只能精确到仟亿,小数点只能两位!"); int n1, n2 = 0; String num = ""; String unit = ""; for (int i = 0; i < temp.length(); i++) { if (i > len + 2) { break; } if (i == len) { continue; } n1 = Integer.parseInt(String.valueOf(temp.charAt(i))); num = s1.substring(n1, n1 + 1); n1 = len - i + 2; unit = s4.substring(n1, n1 + 1); result = result.concat(num).concat(unit); } if ( (len == temp.length()) || (len == temp.length() - 1)) result = result.concat("整"); if (len == temp.length() - 2) result = result.concat("零分"); return result; } 用C#写的http://blog.csdn.net/LeoMaya/archive/2006/12/24/1458747.aspx 100分! JDK中的socketRead0(。。。)方法在哪个DLL中定义的? 求阶级的算法,参考参考 系统实际使用的JRE不是我安装的版本,怎么办?(怀疑和Oracle有关) 简单问题:请问用JAVA如何实现一个简单的递归算法? java加密文件夹 急! Cipher cipher = Cipher.getInstance("RSA");为什么提示找不到RSA算法? 请教:如何在Applet中得到某一点像素的颜色? Applet在IE下没有效果 eclipse中怎样才能快速看到JDS类的源代码? help me!! JAVA的迷茫之路,还望高人指点..... xml参数实体问题
/**-----------人民币 大写转换
*
* @param num ----要转化的数字
* @return
*/
public static String makeUpperCaseSum(String numStr) {
String isNeg = "";//正或者负
double num = Double.parseDouble(numStr);
if (num < 0) {
num *= -1;
isNeg = "负";
numStr = numStr.substring(1);
}
final String[] upper_number = { "零","壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
final String[] number_dw = { "", "拾", "佰", "仟", "万", "拾", "佰",
"仟", "亿", "拾", "佰", "仟", "万" };
String operate = numStr;
String upper_str = "";
String upper_str_pre = "";
String upper_str_later = "";
String vsDx;
int i, j, point_pos, int_len;
if (num < 0.01) {
return "零圆整";
} upper_str_pre = "";
point_pos = operate.indexOf(".");
if (point_pos == -1) {
int_len = operate.length();
} else {
int_len = point_pos;
}
if (int_len > number_dw.length) {
return "too long !!!";
} if (num > 0) {
for (i = 0; i < operate.length(); i++) {
j = int_len - i;
if(j>0){//整数部分
int k = Integer.parseInt(operate.substring(i, i + 1));
if(k==0){//数字为0时
if(j==5||j==9)//单位为亿或者万时
upper_str_pre += upper_number[k] + number_dw[j-1];
else
upper_str_pre += upper_number[k];
}
else
upper_str_pre += upper_number[k] + number_dw[j-1];
}else if(j<0){//小数部分
int k = Integer.parseInt(operate.substring(i, i + 1));
upper_str_later += upper_number[k];
if(j==-1)
upper_str_later += "角";
else
upper_str_later += "分";
}
} //end for
} //end if
upper_str_pre += "圆";
while(upper_str_pre.indexOf("零零")!=-1){
upper_str_pre = upper_str_pre.replaceAll("零零","零");
}
upper_str_pre = upper_str_pre.replaceAll("零万","万");
upper_str_pre = upper_str_pre.replaceAll("零亿","亿");
upper_str_pre = upper_str_pre.replaceAll("亿万","亿零");
upper_str_pre = upper_str_pre.replaceAll("零零","零");
upper_str_pre = upper_str_pre.replaceAll("零圆","圆");
if("圆".equals(upper_str_pre))
upper_str_pre = "";
upper_str = isNeg+upper_str_pre + upper_str_later;
upper_str = upper_str.replaceAll("零角零分","整");
if(point_pos == -1)
upper_str += "整";
return upper_str;
}
public static String transfer(String s){
boolean flag2 = true; //判断碰到‘0’是否要打印出‘零’。
boolean flag = true; //每隔4位判断是打印‘萬’或‘億’。
String str="";
for(int i=s.length()-1,j=1;i>=0;i--,j++){
String ss = sToL(s.charAt(i));
if(ss.equals("error")) return "格式不正确!";
int m = j%4; //4位一循环
if(m==1) {
if(!ss.equals(""))
{
str = ss + str;
flag2 = true;
}
else flag2 = false;
}
if(m==2) {
if(ss.equals("")){
if(flag2){
str = "零" + str;
flag2 = false;
}
}else
{
str = ss + "拾" + str;
flag2 = true;
}
}
if(m==3) {
if(ss.equals("")){
if(flag2){
str = "零" + str;
flag2 = false;
}
}else{
str = ss + "佰" + str;
flag2 = true;
}
}
if(m==0) {
if(ss.equals("")){
if(flag2){
str = "零" + str;
flag2 = false;
}
}else{
str = ss + "仟" + str;
flag2 = true;
}
if(i>0) {
if(flag)
str = "萬" + str;
else
str = "億" + str;
flag = !flag;
}
}
}
return escape(str);
}
//消去多余的‘萬’字。
public static String escape(String str){
int pos = str.indexOf("億");
while(pos != -1){
if(str.charAt(pos + 1)=='萬'){
str = str.substring(0,pos+1) + str.substring(pos +2);
}
pos = str.indexOf("億",pos+1);
}
return str;
}
//阿拉伯数字与中文的对应
public static String sToL(char c){
if(c=='0'){
return "";
}
if(c=='1'){
return "壹" ;
}
if(c=='2'){
return "貳" ;
}
if(c=='3'){
return "叁" ;
}
if(c=='4'){
return "肆" ;
}
if(c=='5'){
return "伍" ;
}
if(c=='6'){
return "陸" ;
}
if(c=='7'){
return "柒" ;
}
if(c=='8'){
return "捌" ;
}
if(c=='9'){
return "玖" ;
}
return "error";
}
public static void main(String[] args){
System.out.println(transfer("1234567890"));
}
}
System.out.println(Money.transfer("123456789012345678"));
壹拾貳億叁仟肆佰伍拾陸萬柒仟捌佰玖拾億壹仟貳佰叁拾肆萬伍仟陸佰柒拾捌
1)生成含有零“位”的中文字串。
2)定义一寄存“位”(UNICODE CHAR),并初始化为中文字串的最高的位(如“千”什么的)。定义一状态标志(BOOLEAN)。
3)将比较指针向后移动一位。
4)比较寄存“位”和比较指针上的“位”,小于则将比较指针上的“位”存到寄存“位”,大于则再判断比较指针“位”前面的字符是否“零”,如果是就将这个“位”和其前面的“零”字符删除,并将状态标志置为“TRUE”,如果不是,就再判断状态标志是否为“TRUE”,如果“TRUE”就在比较指针所指字符的前面字符前插入“零”字符。
5)比较指针向后移动两个字符直到中文字符串末。
6)转到“4)”。
实现的代码如下:
/**
* @param sNum 123020349821734
* @return
*/
public String transfer(String sNum){
String money = "";
String[] han = {"", "十", "百", "千"};
String[] wei = {"", "万", "亿", "兆"};
int count = 0;
int pos = 0;
boolean hasShow = false;
for(int i=sNum.length()-1; i>=0; i--){
if(count > 3){
count = 0;
pos ++;
hasShow = false;
}
if(pos > 3){
money = "E" + money;
break;
}
String n = sNum.substring(i, i+1);
if(hasShow){
money = this.getHanNum(n) + han[count] + money;
}else{
money = this.getHanNum(n) + han[count] + wei[pos] + money;
}
hasShow = true;
count ++;
}
//format
for(int i=2; i<4; i++){
money = money.replaceAll(han[i] + this.getHanNum("0") , han[i] + "零" + this.getHanNum("0"));
}
//0
if(money.substring(money.length()-1).equals("0")){
money = money.substring(0, money.length()-1);
}
for(int i=1; i<4; i++){
money = money.replaceAll(this.getHanNum("0") + han[i], "");
}
money = money.replaceAll(this.getHanNum("1")+ han[1], han[1]);
for(int i=1; i<4; i++){
money = money.replaceAll(this.getHanNum("0") + wei[i], wei[i]);
}
//零
while(money.indexOf("零零") > 0){
money = money.replaceAll("零零", "零");
}
if(money.substring(money.length()-1).equals("零")){
money = money.substring(0, money.length()-1);
}
for(int i=1; i<3; i++){
money = money.replaceAll(wei[i+1] + "零" + wei[i], wei[i + 1]);
}
for(int i=1; i<4; i++){
money = money.replaceAll("零" + wei[i], wei[i]);
} return money + "元";
} private String getHanNum(String num){
String[] hans ={"0", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
String hanNum = "";
hanNum = hans[Integer.parseInt(num)];
return hanNum;
}
2.日语可基本交流,能流利交流更佳
3.学历:本科学士学位,计算机相关专业,或大专(正规全日制大专,同时拥有信息产业部的程序员证书)
国内开发部SE:1.熟悉java、 vb、.net其中一种;
2.有一定日语基础,能看懂日文式样书;
3.两年以上软件开发经验。联系方式:[email protected](邮件并MSN)
String s1 = "零壹贰叁肆伍陆柒捌玖";
String s4 = "分角整元拾佰仟万拾佰仟亿拾佰仟";
String temp = "";
String result = "";
if (input == null)
return "输入字串不是数字串只能包括以下字符('0'~'9','.'),输入字串最大只能精确到仟亿,小数点只能两位!";
temp = input.trim();
float f;
try {
f = Float.parseFloat(temp); }
catch (Exception e) {
return "输入字串不是数字串只能包括以下字符('0'~'9','.'),输入字串最大只能精确到仟亿,小数点只能两位!";
}
int len = 0;
if (temp.indexOf(".") == -1)
len = temp.length();
else
len = temp.indexOf(".");
if (len > s4.length() - 3)
return ("输入字串最大只能精确到仟亿,小数点只能两位!");
int n1, n2 = 0;
String num = "";
String unit = ""; for (int i = 0; i < temp.length(); i++) {
if (i > len + 2) {
break;
}
if (i == len) {
continue;
}
n1 = Integer.parseInt(String.valueOf(temp.charAt(i)));
num = s1.substring(n1, n1 + 1);
n1 = len - i + 2;
unit = s4.substring(n1, n1 + 1);
result = result.concat(num).concat(unit);
}
if ( (len == temp.length()) || (len == temp.length() - 1))
result = result.concat("整");
if (len == temp.length() - 2)
result = result.concat("零分");
return result;
}