数字转大写
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代码实现数字转大写
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?