-->

数字转大写

1. 简述

数字转大写主要有两种方式:利用数据库SQL语句转与用Java代码转
两种方式Java比SQL语句简介方便,但是SQL语句在数据库,更为稳定,而且可以在进入Java代码之前通过调用存储过程就实现转化

2. SQL语句

整形数字转化:

create function udf_digits2hanzi(num bigint) returns text
    language plpgsql
as
$$
DECLARE
    --节权
    unitPos INTEGER := 1;
    allChinese TEXT :='';
    chineseNum TEXT :='';
    needZero BOOLEAN := FALSE;
    strIns TEXT :='';
    sec INTEGER :=0;
    chnNumChar TEXT[] := ARRAY['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'];
    chnUnitSection TEXT[] := ARRAY['','万','亿','万亿'];
    --权位
    sectionChinese TEXT :='';
    newUnitpos INTEGER := 1;
    v INTEGER := 0;
    zero BOOLEAN := TRUE;
    newSec INTEGER := 0;
    chnUnitChar TEXT[] := ARRAY['','拾','百','千'];
BEGIN
    IF num=0 THEN
        RETURN '零';
    END IF;

    WHILE num > 0 LOOP
            sec := num % 10000;
            IF needZero THEN
                allChinese := chnNumChar[1] || allChinese;
            END IF;
            --//每小节部分用独立操作
            newSec := sec;
            WHILE newSec > 0 LOOP
                    v := newSec % 10;
                    IF v = 0 THEN
                        IF (zero = FALSE) THEN
                            zero := TRUE;
                            chineseNum := chnNumChar[1] || chineseNum;
                        END IF;
                    ELSE
                        zero := FALSE;
                        sectionChinese := chnNumChar[v+1];
                        sectionChinese := sectionChinese || chnUnitChar[newUnitpos];
                        chineseNum := sectionChinese || chineseNum;
                    END IF;
                    newUnitpos := newUnitpos + 1;
                    newSec := newSec/10;
                END LOOP;
            sectionChinese :='';
            newunitpos := 1;
            v := 0;
            zero := TRUE;
            newSec := 0;
            IF sec != 0  THEN
                strIns := chnUnitSection[unitPos];
                chineseNum := chineseNum || strIns;
            ELSE
                strIns := chnUnitSection[1];
                chineseNum := strIns || chineseNum;
            END IF;
            allChinese := chineseNum || allChinese;
            chineseNum := '';
            needZero := (sec < 1000) AND (sec > 0);
            num := num / 10000;
            unitPos := unitPos +1;
        END LOOP;
    IF (SUBSTRING(allChinese,1,2) = '壹拾') THEN
        allChinese := SUBSTRING(allChinese,2);
    END IF;
    RETURN concat(allChinese,'元');
END;
$$;

alter function udf_digits2hanzi(bigint) owner to user_pmxt;


小数点后转化

create function decimals(num integer) returns text
    language plpgsql
as
$$
BEGIN

    IF (num=0) Then return '';
    END IF ;

    IF ((num%10<>0)::INTEGER & (not (num/10<>0))::INTEGER) Then Return concat('零',"left"(udf_digits2hanzi(num%10),1),'分') ;
    Else IF ((num%10<>0)::INTEGER & (num/10<>0)::INTEGER) Then Return concat("left"(udf_digits2hanzi(num/10),1),'角',"left"(udf_digits2hanzi(num%10),1),'分') ;
    Else If (length(concat(num))=1) Then return concat("left"(udf_digits2hanzi(num),1),'角');
    Else IF ((not (num%10<>0))::INTEGER & (num/10<>0)::INTEGER) Then Return concat("left"(udf_digits2hanzi(num/10),1),'角') ;
    Else return '';
    End IF ;
    End IF ;
    End IF ;
    End IF ;



end;
$$;

alter function decimals(integer) owner to user_pmxt;

调用

    @Select("select msrxm, split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'-',1) cjsj1, split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'-',2) cjsj2, split_part(split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'-',3),'T',1) cjsj3, \"left\"(split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'T',2),5) cjsj4, wtr, busi_confirmation.bdbh bh, bdmc, number, szd, concat(busi_confirmation.cjj,'元') cjje, concat(busi_confirmation.yj,'元') yjje, other, concat( udf_digits2hanzi(split_part(zj||'','.',1)::INTEGER),decimals(rpad(split_part(zj||'','.',2),2,'0')::INTEGER)) zjdx, concat(zj,'元') zj, split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'-',1) xdwkts1, split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'-',2) xdwkts2, split_part(to_char((to_date(split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'T',1), 'yyyy-mm-dd') +  xdwkts),'yyyy-mm-dd'),'-',3) xdwkts3, \"left\"(split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'T',2),5) xdwkts4, xdjfts,busi_commission.pmfs pmdfs, busi_commission.wthtbh htbh, rmfymc, zcwyhmc from busi_lot,busi_confirmation, busi_commission where busi_lot.bdbh = #{bdbh} and busi_confirmation.bdbh = #{bdbh} and busi_lot.wthtbh = busi_commission.wthtbh group by msrxm, cjsj, wtr, bh, bdmc, number, szd, cjje, yjje, other, cjsj, jfjzrq, rmfymc, zcwyhmc, zj, xdlhts, pmdfs, htbh, xdjfts, xdwkts,zjdx;")
//    @Select("select msrxm, split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'-',1) cjsj1, split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'-',2) cjsj2, split_part(split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'-',3),'T',1) cjsj3,\"left\"(split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'T',2),5) cjsj4, wtr, busi_confirmation.bdbh bh, bdmc, number, szd, busi_confirmation.cjj cjje, busi_confirmation.yj yjje, other, udf_digits2hanzi(zj::INTEGER) zjdx, zj, split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'-',1) xdwkts1, split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'-',2) xdwkts2, split_part(to_char((to_date(split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'T',1), 'yyyy-mm-dd') +  xdwkts),'yyyy-mm-dd'),'-',3) xdwkts3,\"left\"(split_part(to_char(\"cjsj\",'yyyy-mm-ddThh:mm:ss'),'T',2),5) xdwkts4, xdjfts,busi_commission.pmfs pmdfs, busi_commission.wthtbh htbh, rmfymc, zcwyhmc from busi_lot,busi_confirmation, busi_commission where busi_lot.bdbh = #{bdbh} and busi_confirmation.bdbh = #{bdbh} and busi_lot.wthtbh = busi_commission.wthtbh group by msrxm, cjsj, wtr, bh, bdmc, number, szd, cjje, yjje, other, cjsj, jfjzrq, rmfymc, zcwyhmc, zj, xdlhts, pmdfs, htbh, xdjfts, xdwkts, zjdx;")
    Map<String,Object> getConfirmation(String bdbh);

Java代码实现大小写转化

public class Int2Big {
    public static String int2big(int src) {
        final String[] num = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
        final String[] unit = {"圆", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟"};
        StringBuilder dst = new StringBuilder();
        int count = 0;
        while (src > 0) {
            dst.insert(0, (num[src % 10] + unit[count]));
            src = src / 10;
            count++;
        }
        return dst.toString().replaceAll("零[仟佰拾]", "零").replaceAll("零+万", "万")
                .replaceAll("零+亿", "亿").replaceAll("亿万", "亿零")
                .replaceAll("零+", "零").replaceAll("零圆", "圆");
    }

    public static void main(String[] args) {
        System.out.println(int2big(123004506)); //-->壹亿贰仟叁佰万肆仟伍佰零陆圆
        System.out.println(int2big(6523464)); //-->陆佰伍拾贰万叁仟肆佰陆拾肆圆
        System.out.println(int2big(1001000100));//-->壹拾亿零壹佰万零壹佰圆
        System.out.println(int2big(808)); //-->捌佰零捌圆
    }
}

这个调用主函数是会乱码的,具体原因还不知道,在springboot里调用这个方法是不会乱码的,这个是不包含小数点的,我觉得如果需要自己利用实现遍历转化应该也不是太难
Java代码实现数字转大写

posted @   ꧁ʚ星月天空ɞ꧂  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示