oracle数字转换成人民币大写
网上找了好几篇博客,测试或多或少有问题,以下已验证可以使用。
create or replace function cux_convert_cny(p_num in number default null)
return nvarchar2 is
Result nvarchar2(100); --返回字符串
num_round nvarchar2(100) := to_char(abs(round(p_num, 2))); --转换数字为小数点后2位的字符(正数)
num_left nvarchar2(100); --小数点左边的数字
num_right nvarchar2(2); --小数点右边的数字
str1 nchar(10) := '零壹贰参肆伍陆柒捌玖'; --数字大写
str2 nchar(16) := '元拾佰仟万拾佰仟亿拾佰仟万拾佰仟'; --数字位数(从低至高)
num_pre number(1) := 1; --前一位上的数字
num_current number(1); --当前位上的数字
num_count number := 0; --当前数字位数
begin
if p_num is null then
return null;
end if; --转换数字为null时返回null
select to_char(nvl(substr(to_char(num_round),
1,
decode(instr(to_char(num_round), '.'),
0,
length(num_round),
instr(to_char(num_round), '.') - 1)),
0))
into num_left
from dual; --取得小数点左边的数字
select substr(to_char(num_round),
decode(instr(to_char(num_round), '.'),
0,
length(num_round) + 1,
instr(to_char(num_round), '.') + 1),
2)
into num_right
from dual; --取得小数点右边的数字
if length(num_left) > 16 then
return '**********';
end if; --数字整数部分超过16位时
--采用从低至高的算法,先处理小数点右边的数字
if length(num_right) = 2 then
if to_number(substr(num_right, 1, 1)) = 0 then
result := '零' ||
substr(str1, to_number(substr(num_right, 2, 1)) + 1, 1) || '分';
else
result := substr(str1, to_number(substr(num_right, 1, 1)) + 1, 1) || '角' ||
substr(str1, to_number(substr(num_right, 2, 1)) + 1, 1) || '分';
end if;
elsif length(num_right) = 1 then
result := substr(str1, to_number(substr(num_right, 1, 1)) + 1, 1) || '角整';
else
result := '整';
end if;
--再处理小数点左边的数字
for i in reverse 1 .. length(num_left) loop
--(从低至高)
num_count := num_count + 1; --当前数字位数
num_current := to_number(substr(num_left, i, 1)); --当前位上的数字
if num_current > 0 then
--当前位上数字不为0按正常处理
result := substr(str1, num_current + 1, 1) ||
substr(str2, num_count, 1) || result;
else
--当前位上数字为0时
if mod(num_count - 1, 4) = 0 then
--当前位是元、万或亿时
result := substr(str2, num_count, 1) || result;
num_pre := 0; --元、万,亿前不准加零
end if;
if num_pre > 0 or length(num_left) = 1 then
--上一位数字不为0或只有个位时
result := substr(str1, num_current + 1, 1) || result;
end if;
end if;
num_pre := num_current;
end loop;
if p_num < 0 then
--转换数字是负数时
result := '负' || result;
end if;
return Result;
exception
when others then
raise_application_error(-20001, '数字转换大写出现错误!' || sqlerrm);
end;
oracle数字转换成人民币大写相关推荐
- 数字转换成人民币大写格式(带界面)
今天看了算法的公开课,有一个把数字转换成人民币大写的算法. 后面就想着自己写一个界面的,好几天没有写一个完整的程序的. 当然有一些BUG,没有时间优化,后面在慢慢优化. 自己的名言:每天努力一点儿,总 ...
- 关于数字转换成人民币大写的问题
我们在参与大型项目时,难免会遇到数值转换人民币大写的情况.因为我今天接触了一个这样的转换,但原代码存在BUG,转换经常出现问题.于是我就去网上搜索了相关资源.由于没有找到相对权威的转换代码,网上给出的 ...
- JAVA浮点数转人民币读法_算法--java实现将数字转换成人民币大写(迅雷面试题)...
public classRmb {/*** 人民币的基本信息和操作 * *@authorsoyoungboy *@version1.0*/ private double number; //人民币的数 ...
- 浮点数字转换成人民币的大写字体
新开博客,贴上一段平常时写的代码,权当记录和分享. 下面是代码块(有比较详细的注释,转换过程中需要注意的是0的处理): //浮点数字转换成人民币的大写字体 import java.util.Scann ...
- 把数字金额转换成人民币大写[原创]
最近在用这个博客,感觉博客园不错,以前用的是新浪的,感觉这个更好,所以好多东西现在转到这边来了. 下面是一个数字转人民币大写的类,不啰嗦了,下面是代码: 1 /**/ /// <summ ...
- js将数字转换成中文大写
//完成将 toChineseNum, 可以将数字转换成中文大写的表示,处理到万级别,例如 toChineseNum(12345),返回 一万二千三百四十五.const toChinesNum = ( ...
- C语言-如何将用户输入的金额数字转换成中文大写?
实战: 如何将用户输入的金额数字转换成中文大写? #include <stdio.h>int main() {// 输入金额转换成大写int money; // 输入数字int money ...
- JavaScript:将输入的一串数字转换成中文大写,最高可写12位(千亿)
将输入的一串数字转换成中文大写,最高可写12位(千亿) 例:输入:10000,输出:壹万 输入:10010,输出:壹万零壹拾 源码: function toChineseBig(num) {// 将接 ...
- 将数字转换成中文大写的算法
//名称:ConvertSignCap //参数:number //返回:CapNumber //描述:将传入的单个数字转换成中文大写形式 //创建人:刘权 2004-11-16 ...
最新文章
- 【学习求职必备】百度AI和它的7大AI黑科技
- win7中cookie的保存位置
- C++ 关键字 (try-finally) 收藏
- 【数据库】PLSQL Developer出现ORA-12541TNS no listener错误解决方法
- C++|Qt工作笔记-对explicit的认识(Qt中一般情况下为什么会自动加上这个关键字)
- Java中如何在窗口加一行字,如何在java中实现读文件(一行一行地读)和写文件(一行一行地追加写)...
- Rust : 如何use本地化crate与 dependencies 和 path
- uC/os内存优化——TLSF算法
- ASLD 高级固体激光器设计及仿真软件
- 轻仓的贵金属白银今日走势分析
- Oracle 同比环比
- bzoj 3162: 独钓寒江雪 树形dphash
- MacOS系统通过命令行启动Chrome浏览器并添加启动参数
- [055] SSL 3.0曝出Poodle漏洞的解决方案-----开发者篇
- Xtrabackup 安装以及 mysql 使用 Xtrabackup 物理备份过程记录
- 详解TP-Link路由器设置(图解)
- Win7 下安装 Visual Studio 2008 失败的解决办法
- [xiaoyi和你飞]博弈基础 ——[AB]
- 光子计算机ppt,光量子计算机.ppt
- python 把数字转换成中文大写