阳光石油网|石油技术交流|石油人论坛

 找回密码
 欢迎注册
查看: 3367|回复: 4

将EXCEL中的数字变成中文大写

[复制链接]
  • TA的每日心情
    开心
    2021-9-7 09:16
  • 签到天数: 471 天

    [LV.9]以坛为家II

    发表于 2010-6-7 22:23:26 | 显示全部楼层 |阅读模式

    马上注册,下载丰富资料,享用更多功能,让你轻松玩转阳光石油论坛。

    您需要 登录 才可以下载或查看,没有账号?欢迎注册

    x
    (1)单纯数字
         右键选该单元格,设置单元格格式,数字,特殊,中文大写
    (2)文字和数字组合
         比如数字在A1格为456,要在B1格得到肆佰伍拾陆元整,函数如下“=TEXT(A1,"[Dbnum2]")&"元整"”,其中[dbnum2] 是格式函数, 数字转中文大写,有一内建函数与 [dbnum2]有相同作用, 是numberstring 以上函数也可以写成“=numberstring(A1,2)&"元整"”
    (3)复杂数字转中文大写
         比如,要将A1格的123456.65转变为壹拾贰万叁仟肆佰伍拾陆圆陆角伍分,在B1格输入以下公式
    “=TEXT(TRUNC(A1),"[Dbnum2]")&"圆"&IF(ROUND((A1-TRUNC(A1))*100,1)<>0,IF(LEN(ROUND((A1-TRUNC(A1))*100,1))=1,"零角"&TEXT(ROUND((A1-TRUNC(A1))*100,1),"[Dbnum2]")&"分",TEXT((ROUND((A1-TRUNC(A1))*100,1)-MOD(ROUND((A1-TRUNC(A1))*100,1),10))/10,"[Dbnum2]")&"角"&TEXT(MOD(ROUND((A1-TRUNC(A1))*100,1),10),"[Dbnum2]")&"分"),"零角零分 ")”
    另有网友编为:
    “=IF((INT(A1*10)-INT(A1)*10)=0,TEXT(INT(A1),"[DBNum2]")&"圆"&IF((INT(A1*100)-INT((A1)*10)*10)=0,"整","零"&TEXT(INT(A1*100)-INT(A1*10)*10,"[DBNum2]")&"分"),TEXT(INT(A1),"[DBNum2]")&"圆"&IF((INT(A1*100)-INT((A1)*10)*10)=0,TEXT((INT(A1*10)-INT(A1)*10),"[DBNum2]")&"角整",TEXT((INT(A1*10)-INT(A1)*10),"[DBNum2]")&"角"&TEXT(INT(A1*100)-INT(A1*10)*10,"[DBNum2]")&"分"))”
    也不错,能显示整。
    如题所示,在EXCEL里面,如何将123456这样的阿拉伯数字转换为中文大写呢,这里使用了一个函数,一个不常为人们使用的函数!
    NUMBERSTRING函数(没有人民币功能)
    其用法是: NUMBERSTRING(数值,转换方式)
    数值为已填写的数字或单元格数据,转换方式提供三种,参数分别为1,2,3;三种方式显示的中文各不相同,下面按图操作即可!

    知识扩展: 博誉财税 gzboyu.com
    TEXT(1234567890,"[DBNum1]") → 一十二亿三千四百五十六万七千八百九十
    TEXT(1234567890,"[DBNum2]") → 壹拾贰亿叁仟肆佰伍拾陆万柒仟捌佰玖拾 www.vzxi.com 维智财税
    TEXT(1234567890,"[DBNum1]0") → 一二三四五六七八九○
    TEXT(1234567890,"[DBNum2]0") → 壹贰叁肆伍陆柒捌玖零
    第三种:(不太好用)
    1.首先鼠标右键单击需要用大写金额显示的单元格。   
       
    2.(*假设此单元格金额为123.50元*) → 设置单元格格式 → 数字 → 自定义 → 在类型框中输入 [dbnum2]0"百"0"拾"0"元"0"角""整" 即可将选中的单元格中的数字显示为大写金额:(壹百贰拾叁元伍角整)。   
       
    (*假设此单元格金额为1234.51元*) → 设置单元格格式 → 数字 → 自定义 → 在类型框中输入 [dbnum2]0"千"0"百"0"拾"0"元"0"角"0"分""整" 即可将选中的单元格中的数字显示为大写金额:(壹千贰百叁拾肆元伍角壹分整)。
    第四种:(不知怎么用~)
    金额数字转中文大写
    处理能力:
    整数部分:9999999999999999(16位长,仟万亿)
    小数部分:3位,多于3位舍去(不做四舍五入)
    运行结果:
    1.23 壹元贰角叁分
    1234567890123456.123 壹仟贰佰叁拾肆万伍仟陆佰柒拾捌亿玖仟零壹拾贰万叁仟肆佰伍拾陆元壹角贰分叁厘
    0.0798 柒分玖厘
    10,001,000.09 壹仟万零壹仟元玖分
    01.107700 壹元壹角柒厘
    public class MoneyUtil {
    /** 大写数字 */
    private static final String[] NUMBERS = { "零", "壹", "贰", "叁", "肆", "伍", "陆",
          "柒", "捌", "玖" };
    /** 整数部分的单位 */
    private static final String[] IUNIT = { "元", "拾", "佰", "仟", "万", "拾", "佰",
          "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟" };
    /** 小数部分的单位 */
    private static final String[] DUNIT = { "角", "分", "厘" };
    /**
       * 得到大写金额。
       */
    public static String toChinese(String str) {
        str = str.replaceAll(",", "");// 去掉","
        String integerStr;// 整数部分数字
        String decimalStr;// 小数部分数字
        // 初始化:分离整数部分和小数部分
        if (str.indexOf(".") > 0) {
          integerStr = str.substring(0, str.indexOf("."));
          decimalStr = str.substring(str.indexOf(".") + 1);
        } else if (str.indexOf(".") == 0) {
          integerStr = "";
          decimalStr = str.substring(1);
        } else {
          integerStr = str;
          decimalStr = "";
        }
        // integerStr去掉首0,不必去掉decimalStr的尾0(超出部分舍去)
        if (!integerStr.equals("")) {
          integerStr = Long.toString(Long.parseLong(integerStr));
          if (integerStr.equals("0")) {
            integerStr = "";
          }
        }
        // overflow超出处理能力,直接返回
        if (integerStr.length() > IUNIT.length) {
          System.out.println(str + ":超出处理能力");
          return str;
        }
        int[] integers = toArray(integerStr);// 整数部分数字
        boolean isMust5 = isMust5(integerStr);// 设置万单位
        int[] decimals = toArray(decimalStr);// 小数部分数字
        return getChineseInteger(integers, isMust5) + getChineseDecimal(decimals);
    }
    /**
       * 整数部分和小数部分转换为数组,从高位至低位
       */
    private static int[] toArray(String number) {
        int[] array = new int[number.length()];
        for (int i = 0; i < number.length(); i++) {
          array = Integer.parseInt(number.substring(i, i + 1));
        }
        return array;
    }
    /**
       * 得到中文金额的整数部分。
       */
    private static String getChineseInteger(int[] integers, boolean isMust5) {
        StringBuffer chineseInteger = new StringBuffer("");
        int length = integers.length;
        for (int i = 0; i < length; i++) {
          // 0出现在关键位置:1234(万)5678(亿)9012(万)3456(元)
          // 特殊情况:10(拾元、壹拾元、壹拾万元、拾万元)
          String key = "";
          if (integers == 0) {
            if ((length - i) == 13)// 万(亿)(必填)
              key = IUNIT[4];
            else if ((length - i) == 9)// 亿(必填)
              key = IUNIT[8];
            else if ((length - i) == 5 && isMust5)// 万(不必填)
              key = IUNIT[4];
            else if ((length - i) == 1)// 元(必填)
              key = IUNIT[0];
            // 0遇非0时补零,不包含最后一位
            if ((length - i) > 1 && integers != 0)
              key += NUMBERS[0];
          }
          chineseInteger.append(integers == 0 ? key
              : (NUMBERS[integers] + IUNIT[length - i - 1]));
        }
        return chineseInteger.toString();
    }
    /**
       * 得到中文金额的小数部分。
       */
    private static String getChineseDecimal(int[] decimals) {
        StringBuffer chineseDecimal = new StringBuffer("");
        for (int i = 0; i < decimals.length; i++) {
          // 舍去3位小数之后的
          if (i == 3)
            break;
          chineseDecimal.append(decimals == 0 ? ""
              : (NUMBERS[decimals] + DUNIT));
        }
        return chineseDecimal.toString();
    }
    /**
       * 判断第5位数字的单位"万"是否应加。
       */
    private static boolean isMust5(String integerStr) {
        int length = integerStr.length();
        if (length > 4) {
          String subInteger = "";
          if (length > 8) {
            // 取得从低位数,第5到第8位的字串
            subInteger = integerStr.substring(length - 8, length - 4);
          } else {
            subInteger = integerStr.substring(0, length - 4);
          }
          return Integer.parseInt(subInteger) > 0;
        } else {
          return false;
        }
    }
    public static void main(String[] args) {
        String number = "1.23";
        System.out.println(number + " " + MoneyUtil.toChinese(number));
        number = "1234567890123456.123";
        System.out.println(number + " " + MoneyUtil.toChinese(number));
        number = "0.0798";
        System.out.println(number + " " + MoneyUtil.toChinese(number));
        number = "10,001,000.09";
        System.out.println(number + " " + MoneyUtil.toChinese(number));
        number = "01.107700";
        System.out.println(number + " " + MoneyUtil.toChinese(number));
    }
    }
  • TA的每日心情
    慵懒
    2013-8-6 14:46
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2010-6-23 08:41:48 | 显示全部楼层
    我就看看,懂不懂无所谓

    该用户从未签到

    发表于 2010-10-24 18:22:50 | 显示全部楼层
    看了帖就要顶下哦。刚才看了快播电影剑雨,不过是效果很差那种的。 要是能看到清晰版的剑雨就好了 ,慢慢等吧,早晚会看到不模糊版本的快播电影剑雨         www.modao.net
    您需要登录后才可以回帖 登录 | 欢迎注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|阳光石油网 ( 鲁ICP备2021003870号-1 )

    GMT+8, 2024-12-23 09:22 , Processed in 0.085149 second(s), 23 queries .

    Powered by Discuz! X3.4 Licensed

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表