字符串转换 怎么将人民币(¥2561011.56) 转换成(贰佰伍拾陆万壹千零壹拾壹元伍角陆分) 高手们帮帮忙吧?急需 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用java.text包下的类能实现去查查API,应该比较简单,可试试 /** * @(#):DigitalToCharacter.java * @ description:将人民币小写转换为大写 * @ author:茫茫大海 * @ version:v2010 * @ copyright:茫茫大海 */package zhchljr.cn.com.sina.blog;import java.util.Scanner;public class DigitalToCharacter { /** * @ description:构造方法私有化,防止外部产生该类的实例 */ private DigitalToCharacter() { } /** * * @param sDigital 小写的人民币 * @return 转换成人民币的大小字符串 * @throws Exception 若sDigital中含有除"."外的非数字字符,就返回异常 */ public static String convert(String sDigital) throws Exception { String[] digital = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; String[][] unit = { { "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟" }, { "厘", "分", "角" } }; StringBuffer result = new StringBuffer(); try { String[] sParts = sDigital.split("\\."); if(sParts.length > 2) { throw new Exception("小数点位数太多,请检查!"); } for(int i=sParts.length-1; i>=0; --i) { StringBuffer sPart = new StringBuffer(sParts[i]); if(i == 0) { //处理整数部分 sPart.reverse(); for(int j=0; j<sPart.length() && j<unit[i].length; ++j) { if(sPart.charAt(j) - '0' < 0 || sPart.charAt(j) - '9' > 0) { throw new Exception("含有非数字字符!"); } else { result.insert(0, digital[sPart.charAt(j) - '0'] + unit[i][j]); } } } else { //处理小数部分,最多保留三位小数 sPart.reverse(); for(int j=0; j<sPart.length() && j<unit[i].length; ++j) { if(sPart.charAt(j) - '0' < 0 || sPart.charAt(j) - '9' > 0) { throw new Exception("含有非数字字符!"); } else { result.insert(0, digital[sPart.charAt(j) - '0'] + unit[i][j]); } } } } } catch (Exception e) { throw e; } //处理零 for (int i=0; i<result.length(); ++i){ if (result.charAt(i) == '零'){ if (result.charAt(i+1) == '元' || result.charAt(i+1) == '万' || result.charAt(i+1) == '亿'){ result.replace(i, i+1, "$"); } else{ if ((i+2 == result.length()) || ((i+2 < result.length()) && (result.charAt(i+2) == '零'))){ result.replace(i, i+2, "$$"); } else{ result.replace(i+1, i+2, "$"); } } } } return result.toString().replace("$", ""); } /** * * @param args */ public static void main(String[] args) { System.out.println("请输入一串数字:"); Scanner input = new Scanner(System.in); String sDigital = input.next(); try{ System.out.println(convert(sDigital)); } catch (Exception e) { System.out.println(e.getMessage()); } }} 但是还是得修改程序 ,有bug /**怎么将人民币(¥2561011.56) 转换成(贰佰伍拾陆万壹千零壹拾壹元伍角陆分) 高手们帮帮忙吧?急需*/import java.util.regex.Matcher;import java.util.regex.Pattern;public class Test{ private static String regex = null; private static Pattern pattern = null; private static Matcher matcher = null; public static void main(String[] args){ String content = "¥2561011.56"; String result = process(content); System.out.println(result); } private static String process(String content){ //最多支持到999999999.999 regex = "^¥(\\d{1,9})(?:\\.(\\d{1,3}))?$"; pattern = Pattern.compile(regex); matcher = pattern.matcher(content); String left = null; String right = null; if(matcher.matches()){ left = matcher.group(1); right = matcher.group(2); //如果没有小数部分 right == null if(right == null){ right = ""; } }else{ throw new IllegalArgumentException("content = " + content + " isn't valid!"); } right = process_right(right); left = process_left(left); content = left + right; return content; } private static String process_right(String right){ //处理点号右边 String[] r_signs = {"角","分","厘"}; regex = "(\\d)(?=\\d|$)"; //这里的正则表示数字后面是数字或者是直接结尾 pattern = Pattern.compile(regex); matcher = pattern.matcher(right); int index = 0; while(matcher.find()){ right = right.replaceFirst(regex,"$1" + r_signs[index ++]);//将对应的sign放入到对应的位置 matcher = pattern.matcher(right); } //到这里实际还没结束,有可能出现类似 52.002 这时候的读法应该是 。。零几厘,而不是 零角零分贰厘 right = right.replaceAll("0.","0"); right = right.replaceAll("0+","0");//当多个零一起时候消除成一个零 right = transfer(right); return right; } private static String process_left(String left){ //处理点号左边 这个相对比较容易 String[] l_signs = {"元","十","百","千","万","十","百","千","亿","十","百","千"}; int index = 0; left = left + l_signs[index ++]; regex = "(\\d+)(\\d)(?!\\d)(.*)$"; pattern = Pattern.compile(regex); matcher = pattern.matcher(left); while(matcher.find()){ left = matcher.group(1) + l_signs[index ++] + matcher.group(2)+matcher.group(3); matcher = pattern.matcher(left); } //这里同样要对零的情况进行处理 left = left.replaceAll("0.","0"); left = left.replaceAll("0+","0"); left = transfer(left); return left; } private static String transfer(String content){ String[] nums = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; for(int i = 0 ; i < 10 ; i ++){ content = content.replaceAll(i + "" , nums[i]); } return content; } } String[] l_signs = {"元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟"};这里需要改成这样子 regex = "^¥(\\d{1,12})(?:\\.(\\d{1,3}))?$";可以把正则的范围变大,这样的话支持的数字可以到 1千亿贰仟贰佰贰拾贰亿贰仟贰佰伍拾陆万壹仟零壹拾壹元伍角陆分 java中IO流将字节码转换成图片的问题? 一道关于异常的题目 使用范类型的时候,为什么会报“unchecked cast”的警告。 初学JDBC请教基础问题 一个关于多线程的初级问题 使用jspsmartupload上传文件名为中文的文件时的问题? 在linux下,JBuilder6中做好的工程运行第一次可以看见效果,以后就看不到了? 急!急!能否用applet建立一个新的进程通过http协议访问服务器上的文件? java 泛型和反射,求神指导~ 如何通过 请求header获取cookie? 收集各类JAVA实现的设计模式代码 按一定概率产生随机数的问题!!!!!!
去查查API,应该比较简单,可试试
/**
* @(#):DigitalToCharacter.java
* @ description:将人民币小写转换为大写
* @ author:茫茫大海
* @ version:v2010
* @ copyright:茫茫大海
*/package zhchljr.cn.com.sina.blog;import java.util.Scanner;public class DigitalToCharacter {
/**
* @ description:构造方法私有化,防止外部产生该类的实例
*/
private DigitalToCharacter() {
}
/**
*
* @param sDigital 小写的人民币
* @return 转换成人民币的大小字符串
* @throws Exception 若sDigital中含有除"."外的非数字字符,就返回异常
*/
public static String convert(String sDigital) throws Exception {
String[] digital = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
String[][] unit = {
{ "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟",
"万", "拾", "佰", "仟" }, { "厘", "分", "角" } };
StringBuffer result = new StringBuffer();
try {
String[] sParts = sDigital.split("\\.");
if(sParts.length > 2) {
throw new Exception("小数点位数太多,请检查!");
}
for(int i=sParts.length-1; i>=0; --i) {
StringBuffer sPart = new StringBuffer(sParts[i]);
if(i == 0) {
//处理整数部分
sPart.reverse();
for(int j=0; j<sPart.length() && j<unit[i].length; ++j) {
if(sPart.charAt(j) - '0' < 0 || sPart.charAt(j) - '9' > 0) {
throw new Exception("含有非数字字符!");
} else {
result.insert(0, digital[sPart.charAt(j) - '0'] + unit[i][j]);
}
}
} else {
//处理小数部分,最多保留三位小数
sPart.reverse();
for(int j=0; j<sPart.length() && j<unit[i].length; ++j) {
if(sPart.charAt(j) - '0' < 0 || sPart.charAt(j) - '9' > 0) {
throw new Exception("含有非数字字符!");
} else {
result.insert(0, digital[sPart.charAt(j) - '0'] + unit[i][j]);
}
}
}
}
} catch (Exception e) {
throw e;
}
//处理零
for (int i=0; i<result.length(); ++i){
if (result.charAt(i) == '零'){
if (result.charAt(i+1) == '元' || result.charAt(i+1) == '万' || result.charAt(i+1) == '亿'){
result.replace(i, i+1, "$");
}
else{
if ((i+2 == result.length()) || ((i+2 < result.length()) && (result.charAt(i+2) == '零'))){
result.replace(i, i+2, "$$");
}
else{
result.replace(i+1, i+2, "$");
}
}
}
}
return result.toString().replace("$", "");
}
/**
*
* @param args
*/
public static void main(String[] args) {
System.out.println("请输入一串数字:");
Scanner input = new Scanner(System.in);
String sDigital = input.next();
try{
System.out.println(convert(sDigital));
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
/*
*怎么将人民币(¥2561011.56) 转换成(贰佰伍拾陆万壹千零壹拾壹元伍角陆分) 高手们帮帮忙吧?急需
*/import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test{ private static String regex = null;
private static Pattern pattern = null;
private static Matcher matcher = null; public static void main(String[] args){
String content = "¥2561011.56";
String result = process(content); System.out.println(result);
} private static String process(String content){
//最多支持到999999999.999
regex = "^¥(\\d{1,9})(?:\\.(\\d{1,3}))?$";
pattern = Pattern.compile(regex);
matcher = pattern.matcher(content);
String left = null;
String right = null;
if(matcher.matches()){
left = matcher.group(1);
right = matcher.group(2);
//如果没有小数部分 right == null
if(right == null){
right = "";
}
}else{
throw new IllegalArgumentException("content = " + content + " isn't valid!");
} right = process_right(right);
left = process_left(left); content = left + right; return content;
} private static String process_right(String right){
//处理点号右边
String[] r_signs = {"角","分","厘"}; regex = "(\\d)(?=\\d|$)"; //这里的正则表示数字后面是数字或者是直接结尾
pattern = Pattern.compile(regex);
matcher = pattern.matcher(right);
int index = 0;
while(matcher.find()){
right = right.replaceFirst(regex,"$1" + r_signs[index ++]);//将对应的sign放入到对应的位置
matcher = pattern.matcher(right);
} //到这里实际还没结束,有可能出现类似 52.002 这时候的读法应该是 。。零几厘,而不是 零角零分贰厘 right = right.replaceAll("0.","0");
right = right.replaceAll("0+","0");//当多个零一起时候消除成一个零 right = transfer(right);
return right;
} private static String process_left(String left){
//处理点号左边 这个相对比较容易
String[] l_signs = {"元","十","百","千","万","十","百","千","亿","十","百","千"}; int index = 0; left = left + l_signs[index ++]; regex = "(\\d+)(\\d)(?!\\d)(.*)$";
pattern = Pattern.compile(regex);
matcher = pattern.matcher(left);
while(matcher.find()){
left = matcher.group(1) + l_signs[index ++] + matcher.group(2)+matcher.group(3);
matcher = pattern.matcher(left);
} //这里同样要对零的情况进行处理 left = left.replaceAll("0.","0");
left = left.replaceAll("0+","0"); left = transfer(left);
return left;
} private static String transfer(String content){
String[] nums = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
for(int i = 0 ; i < 10 ; i ++){
content = content.replaceAll(i + "" , nums[i]);
}
return content;
}
}
String[] l_signs = {"元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟"};这里需要改成这样子
regex = "^¥(\\d{1,12})(?:\\.(\\d{1,3}))?$";可以把正则的范围变大,这样的话支持的数字可以到 1千亿贰仟贰佰贰拾贰亿贰仟贰佰伍拾陆万壹仟零壹拾壹元伍角陆分