知识大全 将数字转为中文金额的大写方式
Posted 中文
篇首语:别裁伪体亲风雅,转益多师是汝师。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 将数字转为中文金额的大写方式相关的知识,希望对你有一定的参考价值。
public class Trans RMB
/**
* 测试程序的可行性
* @param args
*/
public static void main(String[] args)
System out println( 将数字转换成中文金额的大写形式 \\n );
Trans RMB t r = new Trans RMB();
String s = t r cleanZero(t r splitNum(t r roundString(t r getNum())));
// 如果转换过后是一个空串 则不输出屏幕
if(! equals(s))
System out println( 转换成中文后为 + s);;
System out println( \\n );
/**
* 从命令行接收一个数 在其中调用 checkNum() 方法对其进行
* 验证 并返回相应的值
* @return 如果输入合法 返回输入的这个数
*/
private String getNum()
String s = null;
System out println( 请输入一个数字(精确到小数点后两位) );
// 从命令行输入这个浮点数
java util Scanner scanner = new java util Scanner(System in);
s = scanner next();
// 判断用户输入是否合法
// 若合法 返回这个值 若非法返回
if(this checkNum(s))
return s;
else
return ;
/**
* 判断用户输入的数据是否合法 用户只能输入大于零的数字 不能输入其它字符
* @param s String
* @return 如果用户输入数据合法 返回 true 否则返回 false
*/
private boolean checkNum(String s)
// 如果用户输入的数里有非数字字符 则视为非法数据 返回 false
try
float f = Float valueOf(s);
// 如果这个数小于零则视为非法数据 返回 false
if(f < )
System out println( 非法数据 请检查! );
return false;
else
return true;
catch (NumberFormatException e)
System out println( 非法数据 请检查! );
return false;
/**
* 把用户输入的数以小数点为界分割开来 并调用 numFormat() 方法
* 进行相应的中文金额大写形式的转换
* 注 传入的这个数应该是经过 roundString() 方法进行了四舍五入操作的
* @param s String
* @return 转换好的中文金额大写形式的字符串
*/
private String splitNum(String s)
// 如果传入的是空串则继续返回空串
if( equals(s))
return ;
// 以小数点为界分割这个字符串
int index = s indexOf( );
// 截取并转换这个数的整数部分
String intOnly = s substring( index);
String part = this numFormat( intOnly);
// 截取并转换这个数的小数部分
String smallOnly = s substring(index + );
String part = this numFormat( smallOnly);
// 把转换好了的整数部分和小数部分重新拼凑一个新的字符串
String newS = part + part ;
return newS;
/**
* 对传入的数进行四舍五入操作
* @param s String 从命令行输入的那个数
* @return 四舍五入后的新值
*/
private String roundString(String s)
// 如果传入的是空串则继续返回空串
if( equals(s))
return ;
// 将这个数转换成 double 类型 并对其进行四舍五入操作
double d = Double parseDouble(s);
// 此操作作用在小数点后两位上
d = (d * + ) / ;
// 将 d 进行格式化
s = new java text DecimalFormat( ## ) format(d);
// 以小数点为界分割这个字符串
int index = s indexOf( );
// 这个数的整数部分
String intOnly = s substring( index);
// 规定数值的最大长度只能到万亿单位 否则返回
if(intOnly length() > )
System out println( 输入数据过大!(整数部分最多 位!) );
return ;
// 这个数的小数部分
String smallOnly = s substring(index + );
// 如果小数部分大于两位 只截取小数点后两位
if(smallOnly length() > )
String roundSmall = smallOnly substring( );
// 把整数部分和新截取的小数部分重新拼凑这个字符串
s = intOnly + + roundSmall;
return s;
/**
* 把传入的数转换为中文金额大写形式
* @param flag int 标志位 表示转换整数部分 表示转换小数部分
* @param s String 要转换的字符串
* @return 转换好的带单位的中文金额大写形式
*/
private String numFormat(int flag String s)
int sLength = s length();
// 货币大写形式
String bigLetter[] = 零 壹 贰 三 肆 伍 陆 柒 捌 玖 ;
// 货币单位
String unit[] = 元 拾 佰 仟 万
// 拾万位到仟万位
拾 佰 仟
// 亿位到万亿位
亿 拾 佰 仟 万 ;
String small[] = 分 角 ;
// 用来存放转换后的新字符串
String newS = ;
// 逐位替换为中文大写形式
for(int i = ; i < sLength; i ++)
if(flag == )
// 转换整数部分为中文大写形式(带单位)
newS = newS + bigLetter[s charAt(i) ] + unit[sLength i ];
else if(flag == )
// 转换小数部分(带单位)
newS = newS + bigLetter[s charAt(i) ] + small[sLength i ];
return newS;
/**
* 把已经转换好的中文金额大写形式加以改进 清理这个字
* 符串里面多余的零 让这个字符串变得更加可观
* 注 传入的这个数应该是经过 splitNum() 方法进行处理 这个字
* 符串应该已经是用中文金额大写形式表示的
* @param s String 已经转换好的字符串
* @return 改进后的字符串
*/
private String cleanZero(String s)
// 如果传入的是空串则继续返回空串
if( equals(s))
return ;
// 如果用户开始输入了很多 去掉字符串前面多余的 零 使其看上去更符合习惯
while(s charAt( ) == 零 )
// 将字符串中的 零 和它对应的单位去掉
s = s substring( );
// 如果用户当初输入的时候只输入了 则只返回一个 零
if(s length() == )
return 零 ;
// 字符串中存在多个 零 在一起的时候只读出一个 零 并省略多余的单位
/* 由于本人对算法的研究太菜了 只能用 个正则表达式去转换了 各位大虾别介意哈 */
String regex [] = 零仟 零佰 零拾 ;
String regex [] = 零亿 零万 零元 ;
String regex [] = 亿 万 元 ;
String regex [] = 零角 零分 ;
// 第一轮转换把 零仟 零佰 零拾 等字符串替换成一个 零
for(int i = ; i < ; i ++)
s = s replaceAll(regex [i] 零 );
// 第二轮转换考虑 零亿 零万 零元 等情况
// 亿 万 元 这些单位有些情况是不能省的 需要保留下来
for(int i = ; i < ; i ++)
// 当第一轮转换过后有可能有很多个零叠在一起
// 要把很多个重复的零变成一个零
s = s replaceAll( 零零零 零 );
s = s replaceAll( 零零 零 );
s = s replaceAll(regex [i] regex [i]);
// 第三轮转换把 零角 零分 字符串省略
for(int i = ; i < ; i ++)
s = s replaceAll(regex [i] );
// 当 万 到 亿 之间全部是 零 的时候 忽略 亿万 单位 只保留一个 亿
s = s replaceAll( 亿万 亿 );
return s;
/**
* 程序目的
* 从命令行接收一个数 并将其转化为中文金额的大写方式
* 例如 > 壹佰贰拾三元肆角伍分
* @author LovinChan
*
* 看到网上有很多这样的例子程序 不过觉得很不满意 有些程序我从命名上就觉得
* 实在是不符合规范 程序里面的算法没有让人明白得很清楚的注释 读上去觉得有
* 点难度 可读性不强 而且很多程序还存在不少bug 随便一测就测出来了
* 所以本人还是决定重新写一下这个程序 并且尽量做到消除不必要的bug 这个程
* 序我没有用什么很精妙的算法 不过用了一些Java类库中的类 像是正则表达式之类
* 的东西 由于本人对算法不怎么在行 在做转换操作的时候用的是很笨的方法 望各位
* 大虾海涵 呵呵
*
* 程序的注释我尽量写得详细一点 如果觉得这个程序哪里有问题或者是哪里有改进的
* 地方欢迎随时跟我交流
* 我的msn:
* QQ: (注上为什么加我就可以了)
* 我的blog:_chen
* 欢迎交流
*/
public class Trans RMB
/**
* 测试程序的可行性
* @param args
*/
public static void main(String[] args)
System out println( 将数字转换成中文金额的大写形式 \\n );
Trans RMB t r = new Trans RMB();
String s = t r cleanZero(t r splitNum(t r roundString(t r getNum())));
// 如果转换过后是一个空串 则不输出屏幕
if(! equals(s))
System out println( 转换成中文后为 + s);;
System out println( \\n );
/**
* 从命令行接收一个数 在其中调用 checkNum() 方法对其进行
* 验证 并返回相应的值
* @return 如果输入合法 返回输入的这个数
*/
private String getNum()
String s = null;
System out println( 请输入一个数字(精确到小数点后两位) );
// 从命令行输入这个浮点数
java util Scanner scanner = new java util Scanner(System in);
s = scanner next();
// 判断用户输入是否合法
// 若合法 返回这个值 若非法返回
if(this checkNum(s))
return s;
else
return ;
/**
* 判断用户输入的数据是否合法 用户只能输入大于零的数字 不能输入其它字符
* @param s String
* @return 如果用户输入数据合法 返回 true 否则返回 false
*/
private boolean checkNum(String s)
// 如果用户输入的数里有非数字字符 则视为非法数据 返回 false
try
float f = Float valueOf(s);
// 如果这个数小于零则视为非法数据 返回 false
if(f < )
System out println( 非法数据 请检查! );
return false;
else
return true;
catch (NumberFormatException e)
System out println( 非法数据 请检查! );
return false;
/**
* 把用户输入的数以小数点为界分割开来 并调用 numFormat() 方法
* 进行相应的中文金额大写形式的转换
* 注 传入的这个数应该是经过 roundString() 方法进行了四舍五入操作的
* @param s String
* @return 转换好的中文金额大写形式的字符串
*/
private String splitNum(String s)
// 如果传入的是空串则继续返回空串
if( equals(s))
return ;
// 以小数点为界分割这个字符串
int index = s indexOf( );
// 截取并转换这个数的整数部分
String intOnly = s substring( index);
String part = this numFormat( intOnly);
// 截取并转换这个数的小数部分
String smallOnly = s substring(index + );
String part = this numFormat( smallOnly);
// 把转换好了的整数部分和小数部分重新拼凑一个新的字符串
String newS = part + part ;
return newS;
/**
* 对传入的数进行四舍五入操作
* @param s String 从命令行输入的那个数
* @return 四舍五入后的新值
*/
private String roundString(String s)
// 如果传入的是空串则继续返回空串
if( equals(s))
return ;
// 将这个数转换成 double 类型 并对其进行四舍五入操作
double d = Double parseDouble(s);
// 此操作作用在小数点后两位上
d = (d * + ) / ;
// 将 d 进行格式化
s = new java text DecimalFormat( ## ) format(d);
// 以小数点为界分割这个字符串
int index = s indexOf( );
// 这个数的整数部分
String intOnly = s substring( index);
// 规定数值的最大长度只能到万亿单位 否则返回
if(intOnly length() > )
System out println( 输入数据过大!(整数部分最多 位!) );
return ;
// 这个数的小数部分
String smallOnly = s substring(index + );
// 如果小数部分大于两位 只截取小数点后两位
if(smallOnly length() > )
String roundSmall = smallOnly substring( );
// 把整数部分和新截取的小数部分重新拼凑这个字符串
s = intOnly + + roundSmall;
return s;
/**
* 把传入的数转换为中文金额大写形式
* @param flag int 标志位 表示转换整数部分 表示转换小数部分
* @param s String 要转换的字符串
* @return 转换好的带单位的中文金额大写形式
*/
private String numFormat(int flag String s)
int sLength = s length();
// 货币大写形式
String bigLetter[] = 零 壹 贰 三 肆 伍 陆 柒 捌 玖 ;
// 货币单位
String unit[] = 元 拾 佰 仟 万
// 拾万位到仟万位
拾 佰 仟
// 亿位到万亿位
亿 拾 佰 仟 万 ;
String small[] = 分 角 ;
// 用来存放转换后的新字符串
String newS = ;
// 逐位替换为中文大写形式
for(int i = ; i < sLength; i ++)
if(flag == )
// 转换整数部分为中文大写形式(带单位)
newS = newS + bigLetter[s charAt(i) ] + unit[sLength i ];
else if(flag == )
// 转换小数部分(带单位)
newS = newS + bigLetter[s charAt(i) ] + small[sLength i ];
return newS;
/**
* 把已经转换好的中文金额大写形式加以改进 清理这个字
* 符串里面多余的零 让这个字符串变得更加可观
* 注 传入的这个数应该是经过 splitNum() 方法进行处理 这个字
* 符串应该已经是用中文金额大写形式表示的
* @param s String 已经转换好的字符串
* @return 改进后的字符串
*/
private String cleanZero(String s)
// 如果传入的是空串则继续返回空串
if( equals(s))
return ;
// 如果用户开始输入了很多 去掉字符串前面多余的 零 使其看上去更符合习惯
while(s charAt( ) == 零 )
// 将字符串中的 零 和它对应的单位去掉
s = s substring( );
// 如果用户当初输入的时候只输入了 则只返回一个 零
if(s length() == )
return 零 ;
// 字符串中存在多个 零 在一起的时候只读出一个 零 并省略多余的单位
/* 由于本人对算法的研究太菜了 只能用 个正则表达式去转换了 各位大虾别介意哈 */
String regex [] = 零仟 零佰 零拾 ;
String regex [] = 零亿 零万 零元 ;
String regex [] = 亿 万 元 ;
String regex [] = 零角 零分 ;
// 第一轮转换把 零仟 零佰 零拾 等字符串替换成一个 零
for(int i = ; i < ; i ++)
s = s replaceAll(regex [i] 零 );
// 第二轮转换考虑 零亿 零万 零元 等情况
// 亿 万 元 这些单位有些情况是不能省的 需要保留下来
for(int i = ; i < ; i ++)
// 当第一轮转换过后有可能有很多个零叠在一起
// 要把很多个重复的零变成一个零
s = s replaceAll( 零零零 零 );
s = s replaceAll( 零零 零 );
s = s replaceAll(regex [i] regex [i]);
// 第三轮转换把 零角 零分 字符串省略
for(int i = ; i < ; i ++)
s = s replaceAll(regex [i] );
// 当 万 到 亿 之间全部是 零 的时候 忽略 亿万 单位 只保留一个 亿
s = s replaceAll( 亿万 亿 );
return s;
cha138/Article/program/Java/hx/201311/27056
相关参考