如何换算金额大小写?? 请问如果随便给一个小写的数字,怎么能得出的结果是大写的?比如:123元,最后结果是:壹佰贰拾三元整.谁知道这个怎么换算啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 /** * * <p> * Title: 人民币转成大写 * </p> * <p> * Description: * </p> * <p> * Copyright: Copyright (c) 2004 * </p> * <p> * Company: www.fqf.com.cn * </p> * * @author 范庆丰 * @version 1.0 */public class ChangeToBig{ public ChangeToBig() { } public String hangeToBig(double value) { char[] hunit = { '拾', '佰', '仟' }; // 段内位置表示 char[] vunit = { '万', '亿' }; // 段名表示 char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 数字表示 long midVal = (long) (value * 100); // 转化成整形 String valStr = String.valueOf(midVal); // 转化成字符串 String head = valStr.substring(0, valStr.length() - 2); // 取整数部分 String rail = valStr.substring(valStr.length() - 2); // 取小数部分 String prefix = ""; // 整数部分转化的结果 String suffix = ""; // 小数部分转化的结果 // 处理小数点后面的数 if (rail.equals("00")) { // 如果小数部分为0 suffix = "整"; } else { suffix = digit[rail.charAt(0) - '0'] + "角" + digit[rail.charAt(1) - '0'] + "分"; // 否则把角分转化出来 } // 处理小数点前面的数 char[] chDig = head.toCharArray(); // 把整数部分转化成字符数组 char zero = '0'; // 标志'0'表示出现过0 byte zeroSerNum = 0; // 连续出现0的次数 for (int i = 0; i < chDig.length; i++) { // 循环处理每个数字 int idx = (chDig.length - i - 1) % 4; // 取段内位置 int vidx = (chDig.length - i - 1) / 4; // 取段位置 if (chDig[i] == '0') { // 如果当前字符是0 zeroSerNum++; // 连续0次数递增 if (zero == '0') { // 标志 zero = digit[0]; } else if (idx == 0 && vidx > 0 && zeroSerNum < 4) { prefix += vunit[vidx - 1]; zero = '0'; } continue; } zeroSerNum = 0; // 连续0次数清零 if (zero != '0') { // 如果标志不为0,则加上,例如万,亿什么的 prefix += zero; zero = '0'; } prefix += digit[chDig[i] - '0']; // 转化该数字表示 if (idx > 0) prefix += hunit[idx - 1]; if (idx == 0 && vidx > 0) { prefix += vunit[vidx - 1]; // 段结束位置应该加上段名如万,亿 } } if (prefix.length() > 0) prefix += '圆'; // 如果整数部分存在,则有圆的字样 return prefix + suffix; // 返回正确表示 } public static void main(String args[]) { ChangeToBig a = new ChangeToBig(); System.out.print(a.hangeToBig(120000.12)); }} import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;import java.util.Iterator;/** * @author songyunpeng */public class Rmb { static boolean ISIGNORE = false;//参数用来设置是否忽略错误,true为忽略错误,默认为false static List digits = new ArrayList(); static List setDigits = new ArrayList(); static { digits.add("拾");//0:拾 digits.add("佰");//1:佰 digits.add("仟");//2:仟 digits.add("萬");//,3:萬 digits.add("拾");//4:拾萬 digits.add("佰");//,5:佰萬 digits.add("仟");//6:仟萬 digits.add("亿");//,7:亿 digits.add("拾");//8:拾亿 digits.add("佰");//,9:佰亿 digits.add("仟");//10:仟亿 digits.add("兆");//11:兆 digits.add("拾");//12:拾兆 digits.add("佰");//,13:佰兆 digits.add("仟");//仟兆// digits.add("京"); //.// digits.add("拾");//12:拾京// digits.add("佰");//,13:佰京// digits.add("仟");//??? //..... setDigits.add("萬"); setDigits.add("亿"); setDigits.add("兆");// setDigits.add("京"); // //..... //百度搜索:个、十、百、千、万、十万、百万、千万、亿、兆(10的12次方)、京〔10的16次方)、垓、秭、穰、沟、涧、正、载、极(10的48次方)、恒河沙、阿僧示氏、(梵文译音、意思是无量)、那由他、不可思议(10的64次方)、无量数(∞)。 } public String run(double moneyDb) throws Exception { java.text.DecimalFormat fmt = new java.text.DecimalFormat(".00"); String moneyStr = fmt.format(moneyDb); if(moneyDb == 0) { return "零圆整"; } return ConvertData(moneyStr); } // 转换RMB函数 String ConvertData(String moneyParam) throws Exception { System.out.println("=====try to fmt:"+moneyParam); StringBuffer returnValue = new StringBuffer(); String [] strMoneys = java.util.regex.Pattern.compile("\\.").split(moneyParam); int len = strMoneys[0].length(); if(strMoneys[0].startsWith("-")) { returnValue.append("负"); len--; } strMoneys[0] = strMoneys[0].replaceFirst("-", ""); // 判断可不可以转 if(len>digits.size()+1) { if(this.ISIGNORE) { return moneyParam; } throw new Exception("函数:RMB出错:数字太大或太小,无法换算."); } //转整数 for(int i = 0; i < strMoneys[0].length(); i++) { String value = strMoneys[0].charAt(i)+""; returnValue.append(Convert1Digit(value,strMoneys[0].length()-2-i)); } String tmp = returnValue.toString(); //linlin.. java.util.regex.Pattern p = java.util.regex.Pattern.compile(".*零零.*");//("零零|零萬|零亿"); java.util.regex.Matcher m = p.matcher(tmp); while(m.find()) { tmp = tmp.replaceAll("零零","零"); m = p.matcher(tmp); } //lindigits String preDigitsName="",digitsName; for(int i = 0; i < setDigits.size(); i++) { digitsName = (String)setDigits.get(i); tmp = tmp.replaceAll("零"+digitsName,digitsName); } if(!setDigits.isEmpty()) { preDigitsName = (String) setDigits.get(0); } for(int i = 1; i < setDigits.size(); i++) {//tmp = tmp.replaceAll("亿萬","亿零"); digitsName = (String) setDigits.get(i); if(tmp.matches(".*"+digitsName.concat(preDigitsName)+".*")) { tmp = tmp.replaceAll(digitsName.concat(preDigitsName), digitsName); if(digitsName != "" && !(digitsName.equals(""))) { tmp = tmp.replaceAll(digitsName, digitsName+"零"); tmp = tmp.replaceAll("零零", "零"); //System.out.println("===138"); } } preDigitsName = digitsName; //java.util.regex.Pattern.matches(regex, input) } //end of lin if(tmp.endsWith("零")) { tmp = tmp.substring(0,tmp.length()-1); } tmp = tmp.concat("圆"); if(tmp.startsWith("圆")) { tmp = tmp.substring(1); } //转小数 if(strMoneys[1].equals("00")) { return tmp.concat("整"); } else { String rstr = ""; String tmpstr = strMoneys[1].substring(0, 1); String ret = Convert1Digit(tmpstr,-2); if(ret != "零" && !(ret.equals("零"))) { rstr = ret.concat("角"); } else if(tmp != "") { rstr = "零"; } tmpstr = strMoneys[1].substring(1, 2); rstr = rstr.concat(Convert1Digit(tmpstr,-2) + "分"); return tmp.concat(rstr); } } // digit为-1时是个位-2是小数位不加位名称直接返回大写数 private String Convert1Digit(String str,int digit) { StringBuffer reStr = new StringBuffer(""); //System.out.println ("length:"+reStr.length()); int num = java.lang.Integer.parseInt(str); if(digit != -2 && num == 0) {//整数对零的处理 if(digit >= 0 && setDigits.contains(digits.get(digit))) {//万位和亿位是零要念一个万或亿 reStr.append(digits.get(digit)); } else { reStr.append("零"); } return reStr.toString(); } // digit = -1 为个位 switch(num) {//取值名称, case 0: reStr.append("零"); break; case 1: reStr.append("壹"); break; case 2: reStr.append("贰"); break; case 3: reStr.append("叁"); break; case 4: reStr.append("肆"); break; case 5: reStr.append("伍"); break; case 6: reStr.append("陆"); break; case 7: reStr.append("柒"); break; case 8: reStr.append("捌"); break; case 9: reStr.append("玖"); break; } // -1为个位-2为小数, if(digit >= 0 ) {//取位名称 reStr.append(digits.get(digit)); } return reStr.toString(); } //test=== public static void main(String[] args) throws Exception { Rmb rmb = new Rmb(); System.out.println(rmb.run(101001001)); } } java打包成jar可执行文件 在JAVA中,如何使用本地用户登录SQL SERVER 2000 import com.opensymphony.xwork2.ActionSupport;出错 java菜鸟的问题 Java的引用怎么有值了? (初学者)高人指点,在线等候~~~ 我刚入门java麻烦各位高手帮帮忙谢谢! 如何实现文件的拷贝与剪切? 不能发帖子 熟悉Weblogic6.0的高手请进,不难的一个问题 主线程结束不了,打上断点就结束,求解 请问这段小程序里换掉一句后,为何小球就不动了。 问个关于DecimalFormat类的问题
*
* <p>
* Title: 人民币转成大写
* </p>
* <p>
* Description:
* </p>
* <p>
* Copyright: Copyright (c) 2004
* </p>
* <p>
* Company: www.fqf.com.cn
* </p>
*
* @author 范庆丰
* @version 1.0
*/
public class ChangeToBig
{ public ChangeToBig()
{
}
public String hangeToBig(double value)
{
char[] hunit = { '拾', '佰', '仟' }; // 段内位置表示
char[] vunit = { '万', '亿' }; // 段名表示
char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 数字表示
long midVal = (long) (value * 100); // 转化成整形
String valStr = String.valueOf(midVal); // 转化成字符串 String head = valStr.substring(0, valStr.length() - 2); // 取整数部分
String rail = valStr.substring(valStr.length() - 2); // 取小数部分 String prefix = ""; // 整数部分转化的结果
String suffix = ""; // 小数部分转化的结果
// 处理小数点后面的数
if (rail.equals("00"))
{ // 如果小数部分为0
suffix = "整";
}
else
{
suffix = digit[rail.charAt(0) - '0'] + "角"
+ digit[rail.charAt(1) - '0'] + "分"; // 否则把角分转化出来
}
// 处理小数点前面的数
char[] chDig = head.toCharArray(); // 把整数部分转化成字符数组
char zero = '0'; // 标志'0'表示出现过0
byte zeroSerNum = 0; // 连续出现0的次数
for (int i = 0; i < chDig.length; i++)
{ // 循环处理每个数字
int idx = (chDig.length - i - 1) % 4; // 取段内位置
int vidx = (chDig.length - i - 1) / 4; // 取段位置
if (chDig[i] == '0')
{ // 如果当前字符是0
zeroSerNum++; // 连续0次数递增
if (zero == '0')
{ // 标志
zero = digit[0];
}
else if (idx == 0 && vidx > 0 && zeroSerNum < 4)
{
prefix += vunit[vidx - 1];
zero = '0';
}
continue;
}
zeroSerNum = 0; // 连续0次数清零
if (zero != '0')
{ // 如果标志不为0,则加上,例如万,亿什么的
prefix += zero;
zero = '0';
}
prefix += digit[chDig[i] - '0']; // 转化该数字表示
if (idx > 0)
prefix += hunit[idx - 1];
if (idx == 0 && vidx > 0)
{
prefix += vunit[vidx - 1]; // 段结束位置应该加上段名如万,亿
}
} if (prefix.length() > 0)
prefix += '圆'; // 如果整数部分存在,则有圆的字样
return prefix + suffix; // 返回正确表示
}
public static void main(String args[])
{
ChangeToBig a = new ChangeToBig();
System.out.print(a.hangeToBig(120000.12));
}
}
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Iterator;/**
* @author songyunpeng
*/
public class Rmb {
static boolean ISIGNORE = false;//参数用来设置是否忽略错误,true为忽略错误,默认为false
static List digits = new ArrayList();
static List setDigits = new ArrayList();
static {
digits.add("拾");//0:拾
digits.add("佰");//1:佰
digits.add("仟");//2:仟
digits.add("萬");//,3:萬
digits.add("拾");//4:拾萬
digits.add("佰");//,5:佰萬
digits.add("仟");//6:仟萬
digits.add("亿");//,7:亿
digits.add("拾");//8:拾亿
digits.add("佰");//,9:佰亿
digits.add("仟");//10:仟亿
digits.add("兆");//11:兆
digits.add("拾");//12:拾兆
digits.add("佰");//,13:佰兆
digits.add("仟");//仟兆
// digits.add("京"); //.
// digits.add("拾");//12:拾京
// digits.add("佰");//,13:佰京
// digits.add("仟");//???
//.....
setDigits.add("萬");
setDigits.add("亿");
setDigits.add("兆");
// setDigits.add("京"); //
//.....
//百度搜索:个、十、百、千、万、十万、百万、千万、亿、兆(10的12次方)、京〔10的16次方)、垓、秭、穰、沟、涧、正、载、极(10的48次方)、恒河沙、阿僧示氏、(梵文译音、意思是无量)、那由他、不可思议(10的64次方)、无量数(∞)。
}
public String run(double moneyDb) throws Exception {
java.text.DecimalFormat fmt = new java.text.DecimalFormat(".00");
String moneyStr = fmt.format(moneyDb);
if(moneyDb == 0) {
return "零圆整";
}
return ConvertData(moneyStr);
}
// 转换RMB函数
String ConvertData(String moneyParam) throws Exception {
System.out.println("=====try to fmt:"+moneyParam);
StringBuffer returnValue = new StringBuffer();
String [] strMoneys = java.util.regex.Pattern.compile("\\.").split(moneyParam);
int len = strMoneys[0].length();
if(strMoneys[0].startsWith("-")) {
returnValue.append("负");
len--;
}
strMoneys[0] = strMoneys[0].replaceFirst("-", "");
// 判断可不可以转
if(len>digits.size()+1) {
if(this.ISIGNORE) {
return moneyParam;
}
throw new Exception("函数:RMB出错:数字太大或太小,无法换算.");
}
//转整数
for(int i = 0; i < strMoneys[0].length(); i++) {
String value = strMoneys[0].charAt(i)+"";
returnValue.append(Convert1Digit(value,strMoneys[0].length()-2-i));
}
String tmp = returnValue.toString();
//linlin..
java.util.regex.Pattern p = java.util.regex.Pattern.compile(".*零零.*");//("零零|零萬|零亿");
java.util.regex.Matcher m = p.matcher(tmp);
while(m.find()) {
tmp = tmp.replaceAll("零零","零");
m = p.matcher(tmp);
}
//lindigits
String preDigitsName="",digitsName;
for(int i = 0; i < setDigits.size(); i++) {
digitsName = (String)setDigits.get(i);
tmp = tmp.replaceAll("零"+digitsName,digitsName);
}
if(!setDigits.isEmpty()) {
preDigitsName = (String) setDigits.get(0);
}
for(int i = 1; i < setDigits.size(); i++) {//tmp = tmp.replaceAll("亿萬","亿零");
digitsName = (String) setDigits.get(i);
if(tmp.matches(".*"+digitsName.concat(preDigitsName)+".*")) {
tmp = tmp.replaceAll(digitsName.concat(preDigitsName), digitsName);
if(digitsName != "" && !(digitsName.equals(""))) {
tmp = tmp.replaceAll(digitsName, digitsName+"零");
tmp = tmp.replaceAll("零零", "零");
//System.out.println("===138");
}
}
preDigitsName = digitsName;
//java.util.regex.Pattern.matches(regex, input)
}
//end of lin
if(tmp.endsWith("零")) {
tmp = tmp.substring(0,tmp.length()-1);
}
tmp = tmp.concat("圆");
if(tmp.startsWith("圆")) {
tmp = tmp.substring(1);
}
//转小数
if(strMoneys[1].equals("00")) {
return tmp.concat("整");
}
else {
String rstr = "";
String tmpstr = strMoneys[1].substring(0, 1);
String ret = Convert1Digit(tmpstr,-2);
if(ret != "零" && !(ret.equals("零"))) {
rstr = ret.concat("角");
}
else if(tmp != "") {
rstr = "零";
}
tmpstr = strMoneys[1].substring(1, 2);
rstr = rstr.concat(Convert1Digit(tmpstr,-2) + "分");
return tmp.concat(rstr);
}
}
// digit为-1时是个位-2是小数位不加位名称直接返回大写数
private String Convert1Digit(String str,int digit) {
StringBuffer reStr = new StringBuffer("");
//System.out.println ("length:"+reStr.length());
int num = java.lang.Integer.parseInt(str);
if(digit != -2 && num == 0) {//整数对零的处理 if(digit >= 0 && setDigits.contains(digits.get(digit))) {//万位和亿位是零要念一个万或亿
reStr.append(digits.get(digit));
}
else {
reStr.append("零");
}
return reStr.toString();
}
// digit = -1 为个位
switch(num) {//取值名称,
case 0: reStr.append("零"); break;
case 1: reStr.append("壹"); break;
case 2: reStr.append("贰"); break;
case 3: reStr.append("叁"); break;
case 4: reStr.append("肆"); break;
case 5: reStr.append("伍"); break;
case 6: reStr.append("陆"); break;
case 7: reStr.append("柒"); break;
case 8: reStr.append("捌"); break;
case 9: reStr.append("玖"); break;
}
// -1为个位-2为小数,
if(digit >= 0 ) {//取位名称
reStr.append(digits.get(digit));
}
return reStr.toString();
}
//test===
public static void main(String[] args) throws Exception {
Rmb rmb = new Rmb();
System.out.println(rmb.run(101001001));
}
}