`
iehyou
  • 浏览: 135475 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

数字,金额 转 中文大写

    博客分类:
  • J2EE
阅读更多
import java.text.DecimalFormat;

public class Num2Chinese {

  /**
   * 将字符0-9映射成对应的大写,如果digit不在[0,9]之间,返回原来的值;
   * @param digit
   * @return
   */
  private static char digitMap(char digit){
    char ch ;
    switch(digit){
      case '0':
        ch = '零';
        break;
      case '1':
        ch = '壹';
        break;
      case '2':
        ch = '贰';
        break;
      case '3':
        ch = '叁';
        break;
      case '4':
        ch = '肆';
        break;
      case '5':
        ch = '伍';
        break;
      case '6':
        ch = '陆';
        break;
      case '7':
        ch = '柒';
        break;
      case '8':
        ch = '捌';
        break;
      case '9':
        ch = '玖';
        break;
      default:
        ch = digit;
      break;
    }
    return ch;
  }//end digMap

  /**
   * 根据当前正在解释的数字的位置得到该位置对应的单位:
   * 个,十,百,千
   * "","拾","佰","仟"
   * @param pos
   * @return
   */
  private static String unitMap(int pos){
    String res = "";
    int relativePos  = pos % 4;
    switch(relativePos){
      case 0:
        res = "仟";
        break;
      case 1:
      res = "";
        break;
      case 2:
      res = "拾";
        break;
      case 3:
      res = "佰";
        break;
    }

    return res;
  }
  /**
   * 获得当前正在解释的位置有几亿,比如:
   * 第1-8位 没有亿
   * 第9-16位 有一个亿
   * 第17-24位 有两个亿
   * @param pos
   * @return
   */
  private static String getYi(int pos){//a hundred million
    int count = (pos  - 1) / 8;
    String res="";
    for (int i = 0; i < count; i++) {
      res += "亿";
    }

    return res;
  }


  /**
   * 获得当前正在解释的位置有几亿,只有处于第9位,第17位,第25位...才会返回
   * 所包含的亿,其它位置都返回""
   * @param pos
   * @return
   */
  private static String getConditionalYi(int pos){
    String res = "";
    if(( pos - 1 ) % 8 == 0 && pos != 1){
      res = getYi(pos);
    }
    return res;
  }

  /**
   * 获得正在解释的位置上,是否有万,只有处于(5+ n*8) 位置上的值才会
   * 返回"万",其它返回""
   * @param pos
   * @return
   */
  private static String getConditionalWan(int pos){
    String res = "";
    if((pos -5) % 8 == 0){
      res ="万";
    }
    return res;
  }

  /**
   * 获得正在解释的位置上,是否有万,只有处于(5+ n*8) 到(8+ n*8)位置上的值才会
   * 返回"万",其它返回""
   * @param pos
   * @return
   */
  private static String getWan(int pos){
    String res = "";
    if((pos -5) % 8 == 0 || (pos -6) % 8 == 0 || (pos -7) % 8 == 0 || (pos -8) % 8 == 0){
      res ="万";
    }
    return res;
  }

  private Num2Chinese() {
  }

  /**
   * 将浮点数转换成中文数字大写信息,如:
   * 12345.14,用中文的表达习惯是:
   * 壹万贰仟叁佰肆拾伍元壹角肆分整
   * 默认情况下,精确到小数点后2位(即:分),
   * 大于2位将进行四舍五入运算.
   * @param num
   * @return
   */
  public static String translate(double num){
    return translate(num,-3);
  }

  /**
   * 根据指定的精度进行四舍五入
   * @param num
   * @param precisionPos
   * @return
   */
  private static String round(double num,int precisionPos){
    String pattern ;
    if(precisionPos <= -2){
      pattern = "##.##";
    }
    else if(precisionPos == -1){
      pattern = "##.#";
    }
    else if(precisionPos == 0 || precisionPos == 1){
      pattern = "##";
    }
    else{
      num = num /Math.pow(10,precisionPos - 1);
//      System.out.println("Num:" + num);
      pattern = "##";
    }
    DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance();
    df.applyPattern(pattern);
    String result = df.format(num);

    for (int i = 0; i < precisionPos -1; i++) {
      result +='0';
    }
    return result;
  }
/**
 * 将浮点数转换成中文数字大写信息,如:
 * 12345.14,用中文的表达习惯是:
 * 壹万贰仟叁佰肆拾伍元壹角肆分整
 * 可以通过precisionPos 来指定精确到那位,
 * precisionPos可能的值有:
 * 值      精确到的位数
 * < -2        0.01
 * -2          0.01
 * -1          0.1
 * 0           个位
 * 1           个位
 * 2           十位
 * 3           百位
 * .......
 * 最后的值都是一个经过四舍五入运算的值
 * @param num
 * @param precisionPos
 * @return
   */
  public static String translate(double num,int precisionPos){
    String result = round(num,precisionPos);
    String dfResult = transDecimalFration(result);
    String intResult = transInteger(result);
    if(intResult.length() == 0){
      intResult = "零";
    }
    return intResult + "元"+ dfResult +'整';
  }//decimal fraction

  /**
   * 转换小数部分
   * @param num
   * @return
   */
  private static String transDecimalFration(String num){
    String result = "";
    int indexOf = num.indexOf(".");

    if(indexOf < 0 ){
      return result;
    }

      result += digitMap(num.charAt(indexOf+1));
     if(num.charAt(indexOf + 1) != '0'){
       result += "角";
     }
     if(num.length() > indexOf + 2){
       result += digitMap(num.charAt(indexOf +2)) + "分";
     }
    return result;
  }

  /**
   * 转换整数部分
   * @param num
   * @return
   */
  private static String transInteger(String num){
    String res = "";
    int indexOf = num.indexOf(".");
    if(indexOf <0 ){
      indexOf = num.length() - 1;
    }
    else{
      indexOf --;
    }
    int pos = 1;
    int zeroCount = 0;
    int startPos = -1;
    String lastYi = "";
    String lastWan = "";
    boolean bSpanStep = false;
    for (int i = indexOf; i >=0 ; i--) {
      char ch = num.charAt(i);
      if(ch == ','){
        res = ',' + res;
        continue;
      }

      if(ch == '0'){
        if(startPos == -1){
          startPos = pos;
        }
        lastWan = getWan(pos);
        lastYi = getYi(pos);
        pos ++;
        zeroCount ++;

        continue;
      }
      else{
        if(zeroCount > 0){
          if(startPos > 1){
            res = digitMap('0')  + res ;//+ conditionalFiveUnitMap(pos)
          }
          if( ((startPos -1 )%4 != 0) &&((startPos-1) / 4 == (startPos + zeroCount - 2) / 4)){//是否跨了阶段
            lastWan = "";
          }
          if( ((startPos -1 ) % 8 != 0) && (startPos -1) / 8 == (startPos + zeroCount -2 ) / 8 ){
            lastYi = "";
          }
          if(startPos == 1 && zeroCount % 8 == 0){
            lastYi = "";
            lastWan= "";
          }

            res =  lastWan + lastYi + res;
          lastWan ="";
          lastYi = "";
          zeroCount = 0;
          startPos = -1;
        }

      }
      res = digitMap(ch) + unitMap(pos) + getConditionalWan(pos) + getConditionalYi(pos) + res;
      pos ++;
    }


    return res;
  }


  public static void main(String[] args) {
    Num2Chinese nc = new Num2Chinese();
    System.out.println(Num2Chinese.translate(27000));

  }
}
分享到:
评论

相关推荐

    水晶报表数字金额转中文大写

    水晶报表数字金额转中文大写,用于水晶报表中将数字金额转换为中文大写的金额

    LUA 实现数字金额转汉字大写

    LUA 实现数字金额转汉字大写,最近,项目需要在前端实现,数字金额转汉字大写,测试不多,可能存在问题,请多多指教 另外,此段代码中附赠有以下两个字符串函数,也可以单独使用 myremove(str , chr) split(str, chr...

    oracle 数字金额转为汉字大写

    在Oracle数据库环境中,有时我们需要将数字金额转换成汉字大写形式,这在财务报表或理财程序中尤为常见,因为汉字大写是财务领域的一种标准表示方式,可以避免因数字混淆而引发的错误。本篇文章将深入探讨如何在...

    SAP ABAP数字金额转中文大写源代码

    ### SAP ABAP 数字金额转中文大写源代码解析及应用 #### 一、背景介绍 在财务系统中,将数字金额转换成中文大写格式是常见需求之一,尤其是在发票开具、合同签订等正式文件中。SAP作为全球领先的企业管理软件之一,...

    将数字金额转换为中文大写金额

    将数字金额转换为中文大写金额将数字金额转换为中文大写金额将数字金额转换为中文大写金额

    mysql函数,将数字金额转成人民币大写

    将数字金额转成人民币大写,如1999.00,转为:壹仟玖佰玖拾玖元整;2000.00,转为:贰仟元整;2000.01,转为:贰仟元零壹分

    java将数字转换成大写字母

    Java 中实现数字金额到中文大写字符的转换 Java 中实现数字金额到中文大写字符的转换是指将阿拉伯数字转换成中文大写的过程。本文将详细介绍 Java 实现数字金额到中文大写字符的转换的知识点。 知识点一: 数字...

    Android中数字转中文,金额转大写

    本文将深入探讨如何在Android环境中实现这一功能,包括数字转中文以及数字金额转大写,并且会涉及到口语化的转换。 首先,数字转中文主要是将阿拉伯数字(如1、2、3等)转换成中文数字(如一、二、三等)。在Java或...

    将数字转为中文金额的大写方式(Java版)

    将数字转为中文金额的大写方式(Java版) 博文链接:https://lovinchan.iteye.com/blog/202768

    阿拉伯数字金额转换为大写数字金额

    在中文中,阿拉伯数字1至9对应的汉字大写分别是壹、贰、叁、肆、伍、陆、柒、捌、玖。零对应的是零或〇。小数点后的部分,元、角、分分别代表整数部分、十分之一和百分之一。例如,123.45在大写中是壹佰贰拾叁元肆角...

    SQL数字转金额大写函数

    sqlserver数字转金额大写,输入数字返回汉字大写

    金额阿拉伯数字转换中文大写(全)

    在IT领域,尤其是在财务软件开发或数据处理中,经常需要将阿拉伯数字金额转换为中文大写,以便在财务报表、发票或合同中清晰准确地表示金额。这是因为中文大写数字在金融交易中能减少因书写错误导致的混淆,增强财务...

    java实现数字转换人民币中文大写工具

    在人事业务系统中,日期也可以用汉字大写表示,以便于更好地表达日期信息。 Java 实现数字转换人民币中文大写工具的代码实例如下: ```java public class Data2Zh { final static private String NUMBER[] = { "零...

    python金额数字转大写代码

    将金额数字转化为大写,格式规范标准。① 当没有零头时自动加xxxx元整 ② 小数能够精确到角、分、厘 ③ 能够处理1亿一下金额数字 ④ 使用方法:numToBig(金额),返回大写字符串

    FastReport小写金额转大写

    在财务文档或正式报告中,将数字金额转换成大写格式是一种常见的规范要求,尤其在中国。FastReport提供了一种方法,通过编写自定义函数来实现这一转换。本例中的代码展示了一个具体的实现过程,用于将货币类型的数值...

    mysql 函数,可以将数字转换为中文大写形式

    mysql 函数,可以将数字转换为中文大写形式。大写数字是中国特有的数字书写方式,利用与数字同音的汉字取代数字,以防止数目被涂改。 据考证,大写数字最早是由武则天发明,后经朱元璋改进完善。

    将阿拉伯数字转换为金额的汉字大写

    当我们涉及到金融交易或者会计记录时,金额通常需要以汉字大写的形式表示,以避免数字篡改和提高准确性。本文将深入探讨如何使用Java来实现阿拉伯数字到金额汉字大写的转换。 首先,我们需要了解金额汉字大写的基本...

    数字金额转中文大写转换工具

    将阿拉伯数字金额转成中文大写 "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"......

    小写金额转换为大写金额

    在金融和会计领域,金额通常会以两种形式存在:小写和大写。小写金额是常规的数字表示,如123456.78;而大写金额则是为了防止篡改和提高凭证的正式性,常用于支票、合同等正式文档中,例如“壹拾贰万叁仟肆佰伍拾陆...

Global site tag (gtag.js) - Google Analytics