知识大全 将数字转为中文金额的大写方式

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

相关参考

知识大全 在PB中实现数字的英文大写和中文大写[3]

在PB中实现数字的英文大写和中文大写[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 在PB中实现数字的英文大写和中文大写[2]

在PB中实现数字的英文大写和中文大写[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 在PB中实现数字的英文大写和中文大写[1]

在PB中实现数字的英文大写和中文大写[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 C#实现阿拉伯数字到大写中文的转换

C#实现阿拉伯数字到大写中文的转换  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ///<

知识大全 delphi编程小写金额转换

  财务软件中总少不了大写的金额表示方式如下为一个简单的小写金额转换为大写的函数其思路简单(可以说烂吧居然利用了位置来转换)但是它却几乎可以无限制的转换只要你能读得出来和写得进去  functionT

备案表有哪些填制要求?

(1)进口单位代码应填写企业法人代码;  (2)一份备案表,仅允许标注一种结算方式;  (3)付汇币种、金额及金额大写不允许涂改;  (4)付汇金额小写与大写应一致;  (5)备案表填制应字迹规范整齐

知识大全 Java转换大写金额的代码

Java转换大写金额的代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  此代码根据网上搜集到的

知识大全 支票日期中日期是30日,大写该如何写呢

支票日期中日期是30日,大写该如何写呢?零叁拾日吗?,支票日期写零贰拾叁日能受理吗支票日期中的30日,前面不需要加零,直接写叁拾日即可。详见如下:支票日期填写:出票日期(大写)、数字必须大写,大写数字

知识大全 开支票100000元,将怎样大写?

开支票100000元,将怎样大写?支票的大写应该这样写:壹拾万元整支票在会计日常工作中接触得非常多,签发和接收支票中也存在着很多细节,工作中稍不注意这些细节,支票就得作废。首先了解下支票要填写的内容:

知识大全 要开一张现金支票 日期为12月30日,正确的大写是怎么写的?

要开一张现金支票日期为12月30日,正确的大写是怎么写的?贰零壹零年壹拾贰月零叁拾日今天我也要开一张开一张现金支票,日期是2011年4月25日,日期该怎么正确填写?左边存根联直接写小写阿拉伯数字:20