`
mikixiyou
  • 浏览: 1099272 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353245
社区版块
存档分类
最新评论

使用plsql实现阿拉伯数字转中文大写

阅读更多

使用pl sql的数组功能、循环机制将小于10的16次方的任意阿拉伯数字转换为中文大写数字。该函数从原来的200多行,优化成现在70行左右。

始终相信,最少的代码实现某个功能才是最优雅的开发方式,代码越少出bug的概率就越低。

从开发、调试、到优化这个函数,我用掉了约5个小时的时间,最后只有短短的70行。顺便膜拜一下,那个解放军美女尖兵:90昼夜主持编写40万行代码

 

 

(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1608834 )

 

附上函数代码:

create or replace function chinese_number_program(p_input float)
  return varchar2 as
  /*
  created by miki西游 on 2012-7-27
  It is used to change Arabic numbers to Chinese big numbers.
  */
  type typ_money is table of varchar2(20);
  c_numbers typ_money := typ_money('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
	c_unit typ_money := typ_money('分', '角', '圆', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟', '兆', '拾', '佰', '仟');
  v_array_money    typ_money := typ_money();
  chinese_number   varchar2(30);
  result           varchar2(1000);
  v_number         integer;
  v_number_element integer;
  i                int;
begin
  if (p_input >= power(10, 16)) then
    result := '超出计算范围';
    return result;
  end if;
  v_number := round(p_input * 100);

  i := 1;
  v_array_money.extend(1);
  v_array_money(v_array_money.count) := '整';

  while v_number > 0 loop
    v_number_element := mod(v_number, 10);
    if (v_number_element = 0) then
      if i in (3, 7, 11, 15) then
        chinese_number := c_unit(i);
      else
        chinese_number := c_numbers(v_number_element + 1);
      end if;
    else
      chinese_number := c_numbers(v_number_element + 1) || c_unit(i);
    end if;
  
    case
      when chinese_number = '零' then
        if (v_array_money(v_array_money.count) not in
           ('整', '零', '圆', '万', '亿', '兆')) then
          v_array_money.extend(1);
          v_array_money(v_array_money.count) := chinese_number;
        end if;
      when chinese_number like '%亿' then
        if (v_array_money(v_array_money.count) in ('万')) then
          v_array_money(v_array_money.count) := chinese_number;
        else
          v_array_money.extend(1);
          v_array_money(v_array_money.count) := chinese_number;
        end if;
      when chinese_number like '%兆' then
        if (v_array_money(v_array_money.count) in ('万', '亿')) then
          v_array_money(v_array_money.count) := chinese_number;
        else
          v_array_money.extend(1);
          v_array_money(v_array_money.count) := chinese_number;
        end if;
      else
        v_array_money.extend(1);
        v_array_money(v_array_money.count) := chinese_number;
    end case;
    v_number := floor(v_number / 10);
    i        := i + 1;
  end loop;
  for i in v_array_money.first .. v_array_money.last loop
    result := v_array_money(i) || result;
  end loop;

  return result;
end;

 

测试结果如下:

SQL> select chinese_number_program(9999999999999999.99) from dual;\
 
CHINESE_NUMBER_PROGRAM(9999999
--------------------------------------------------------------------------------
玖仟玖佰玖拾玖兆玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾玖圆玖角玖分整
 
SQL> select chinese_number_program(9999999999999999.99) as cc from dual;
 
CC
--------------------------------------------------------------------------------
玖仟玖佰玖拾玖兆玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾玖圆玖角玖分整
 
SQL> select chinese_number_program(990000001229.00) as cc from dual;
 
CC
--------------------------------------------------------------------------------
玖仟玖佰亿壹仟贰佰贰拾玖圆整
 
SQL> select chinese_number_program(9900029.01) as cc from dual;
 
CC
--------------------------------------------------------------------------------
玖佰玖拾万零贰拾玖圆零壹分整
 
SQL> select chinese_number_program(10029.3) as cc from dual;
 
CC
--------------------------------------------------------------------------------
壹万零贰拾玖圆叁角整
 
SQL> 
 

 

 

btw,如果您觉得有同感,请鼓励一下。呵呵

 

 

objective-c

 

#import <Foundation/Foundation.h>
#import <stdio.h>

void print( NSArray *array ) {
    int i;
    for (i=0;i<[array count];i++)
    {
        NSLog(@"%@",[array objectAtIndex:i]);
    }

}

void print2( NSArray *array ) {
    NSEnumerator *enumerator = [array objectEnumerator];
    id obj;
    while ( obj = [enumerator nextObject] ) {
        printf( "%s\n", [[obj description] cString] );
    }
}

void print3( NSArray *array ) {
    id obj;
    NSLog(@"new array is ");
    for (obj in array)
    {
        NSLog(@"%@",obj);
    }
}

NSString * printByLine( NSArray *array ) {
    id obj;
    NSMutableString * oneLine;
    oneLine=[NSMutableString stringWithCapacity:100];
    NSString * oneString;

    for (obj in array)
    {
        oneString=[obj copy];

        //[oneLine appendString:oneString];
        [oneLine insertString:oneString atIndex:0];

       // NSLog(@"xx= %@,%d,%d",oneLine,oneLine,oneString);
    }

    return oneLine;


}



int main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    //NSArray *arr_numbers = [[NSArray alloc] initWithObjects:@"Áã", @"Ò¼", @"·¡", @"Èþ", @"ËÁ", @"Îé", @"½", @"Æâ", @"°Æ", @"¾Á", nil];
    NSArray *arr_numbers = [[NSArray alloc] initWithObjects:@"Zero", @"One", @"Two", @"Three", @"Four", @"Five", @"Six", @"Seven", @"Eight", @"Nine", nil];

    //NSArray *arr_unit = [[NSArray alloc] initWithObjects:@"·Ö", @"½Ç", @"Ô²", @"Ê°", @"°Û", @"Ǫ", @"Íò", @"Ê°", @"°Û", @"Ǫ", @"ÒÚ", @"Ê°", @"°Û", @"Ǫ", @"Õ×", @"Ê°", @"°Û", @"Ǫ",nil];
    NSArray *arr_unit = [[NSArray alloc] initWithObjects:@"F", @"J", @"Yuan", @"S", @"B", @"Q", @"W", @"S", @"B", @"Q", @"Yi", @"S", @"B", @"Q", @"Z", @"S", @"B", @"Q",nil];

    NSMutableArray * mutable_money = [[NSMutableArray alloc] init];

    NSSet * set_special_number=[[NSSet alloc] initWithObjects:@"Zheng",@"Zero",@"Yuan",@"W",@"Yi",@"Z"];

    //print(arr_numbers);
   // print2(arr_numbers);
   // print3(arr_unit);

    float p_input_number;
    int input_number;
    int input_number_element;
    int i=0;

    NSString * chinese_number;
    NSString * result;
    p_input_number=1008.20;

    if (p_input_number>9999999)
    {
        result =@"out of maximize range";
        NSLog(@"%@",result);
        return 0;
    }


    input_number=p_input_number*100;

    [mutable_money addObject:@"Zheng"];

    //[[chinese_number alloc] init];

    while (input_number>0)
    {
        input_number_element=input_number%10;

        if(input_number_element==0)
        {
            if (i == 2 || i==6 || i==10 || i==14)
            {
                chinese_number=[arr_unit objectAtIndex:i];
            }
            else
            {
                chinese_number=[arr_numbers objectAtIndex:input_number_element];
            }

        }
        else
        {
            chinese_number=[[arr_numbers objectAtIndex:input_number_element] stringByAppendingString:[arr_unit objectAtIndex:i]];
        }

      //  NSLog(@"%@,%@,%@",chinese_number,[arr_numbers objectAtIndex:input_number_element],[arr_unit objectAtIndex:i]);
       // NSLog(@"%d,%d,%d",chinese_number,[arr_numbers objectAtIndex:input_number_element],[arr_unit objectAtIndex:i]);


        if ([chinese_number isEqualToString:@"Zero"])
        {
            if (!([set_special_number containsObject:[mutable_money lastObject]]))
            {
            [mutable_money addObject:chinese_number];

            //NSLog(@"zero is %@,%@,%@",chinese_number,[arr_numbers objectAtIndex:input_number_element],[arr_unit objectAtIndex:i]);

            }
        }
        else if ([chinese_number hasSuffix:@"Yi"])
        {
            if ([[mutable_money lastObject] isEqualToString:@"W"])
            {
                [mutable_money removeLastObject];
                [mutable_money addObject:chinese_number];
            }
            else
            {
                [mutable_money addObject:chinese_number];
            }

            //NSLog(@"Yi is %@,%@,%@",chinese_number,[arr_numbers objectAtIndex:input_number_element],[arr_unit objectAtIndex:i]);
        }

        else
        {
            [mutable_money addObject:chinese_number];
            //NSLog(@"Others is %@,%@,%@",chinese_number,[arr_numbers objectAtIndex:input_number_element],[arr_unit objectAtIndex:i]);
        }

        input_number=input_number/10;
        i++;

    }





   NSLog(@"%@",printByLine(mutable_money));



    // free memory

    [arr_numbers release];
    [arr_unit release];
    [mutable_money release];

    [pool release];

    return 0;
}
 
8
13
分享到:
评论
8 楼 szkktom 2012-08-02  
又见雷锋了 ,呵呵!加油,好好研究下。
7 楼 freezingsky 2012-07-27  
数据库来实现这个有点不靠谱,不过,能实现说明掌握了,不错!建议把这种转换放到UI前端!
6 楼 mikixiyou 2012-07-27  
jamcode 写道
用PL SQL去实现这个真蛋疼

哪,这里,http://jamcode.iteye.com/blog/1157096

你这个没有pl sql的实现方法吧。
哈哈

在一些报表上还是能用上的。
5 楼 jamcode 2012-07-27  
用PL SQL去实现这个真蛋疼

哪,这里,http://jamcode.iteye.com/blog/1157096
4 楼 mikixiyou 2012-07-27  
我还是觉得,
代码简洁是排在第一位的。
可读性取决于注释,而可维护性是和技术能力关联密切。
3 楼 teamilk 2012-07-27  
其实我觉得,很多时候易读性可维护性要比代码量来的相对重要点,还是要平衡吧
2 楼 mikixiyou 2012-07-27  
Miracle_Qsc 写道
不错,留下啦 以后可能用的上~~感谢

呵呵,分享嘛!
优化过程,我是不是也应该也写下来。这个只是产品。
1 楼 Miracle_Qsc 2012-07-27  
不错,留下啦 以后可能用的上~~感谢

相关推荐

    SQL中将日期转换为中文大写

    在SQL数据库操作中,有时我们需要将日期字段以中文大写的形式展示,这在报表制作、数据分析或者用户界面显示时尤其有用。本篇文章将详细介绍三种在SQL中实现这一功能的方法,包括两种函数方法和一种存储过程方法。 ...

    数字金额转换为中文汉字金额(plsql function)

    数字金额转换为中文汉字金额:例如select num_to_zhs(123456789.54321) from dual; 我们调用该function可以将金额"123456789.54321"转换为“壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元伍角肆分叁贰壹”。

    oracle自定义函数实现金额转换为大写

    oracle数据库,使用自定义函数,实现了金额的大写转换。sql语句中,直接调用此函数即可得到金额大写。

    plsql中文使用说明

    plsql中文使用说明plsql中文使用说明plsql中文使用说明plsql中文使用说明plsql中文使用说明plsql中文使用说明

    不安装oracle使用plsql

    标题中的“不安装oracle使用plsql”意味着要在没有Oracle数据库客户端的情况下使用PL/SQL Developer这一工具。这通常通过Oracle的Instant Client实现,该组件提供了一种轻量级的解决方案,允许用户连接到Oracle...

    PLSQLDEV工具使用实现导数

    PLSQLDEV工具使用实现导数,介绍如何通过PLSQLDEV工具使用实现导数,及导出数据

    PLSQL英文版转换为中文版

    本文将详细介绍如何将PLSQL Developer的英文界面转换为中文界面,以便于学习和操作。 首先,你需要确保已经安装了PLSQL Developer的英文版本。如果你还没有安装,可以从官方或者其他可信的来源下载并进行安装。安装...

    PLSQL导出CSV后中文乱码解决办法

    这是确保正确显示中文字符的关键步骤,因为PLSQL导出的CSV文件通常使用UTF-8编码。 5. **加载数据**:确认编码设置无误后,点击“加载”按钮,Excel将使用UTF-8编码解析CSV文件,此时中文字符应该能正常显示。 ...

    使用PLSQL创建Oracle数据库User用户并设置权限, 创建表

    使用PLSQL创建Oracle数据库User用户并设置权限 主要演示了如何使用 PLSQL 创建一个 User 用户, 并使之具有创建表、修改表、访问表的权限。解决了 使用自定义用户创建表时出现的 没有表空间的访问权限的问题。

    使用PLSQL 创建Oracle数据库用户并设置权限

    "使用PLSQL创建Oracle数据库用户并设置权限" 在 Oracle 数据库中,创建用户并设置权限是数据库管理员的基本任务之一。在本文中,我们将使用 PLSQL 创建 Oracle 数据库用户并设置权限,包括创建用户、设置权限和创建...

    PLSQL Developer14用户指南

    为了使用PLSQL Developer 14,用户需要首先登录Oracle数据库。登录过程包括输入用户名、密码和数据库连接信息等步骤。用户可以选择使用基本认证或SSL认证两种方式登录数据库。 编写程序 PLSQL Developer 14提供了...

    使用PLSQL创建Oracle数据库User用户并设置权限

    使用PLSQL创建Oracle数据库User用户并设置权限 主要演示了如何使用 PLSQL 创建一个 User 用户, 并使之具有创建表、修改表、访问表的权限。解决了 使用自定义用户创建表时出现的 没有表空间的访问权限的问题。

    PLSQL 中文乱码.docx

    PLSQL 中文乱码解决方案 PLSQL 是 Oracle_relational_database_management_system 的一种 procedural_language,用于实现复杂的业务逻辑和数据处理。但是,在执行 SQL 语句时,PLSQL 经常会出现中文乱码的问题,...

    PLSQL中文语言包

    总之,"PLSQL中文语言包"为使用中文的开发者提供了一个更友好的开发环境,使得在Oracle数据库管理上使用PLSQL更加顺畅和高效。通过深入学习和实践,开发者可以充分利用PLSQL的强大功能,解决各种复杂的数据库问题。

    plsql快捷插件及中文插件

    plsql快捷插件,下载放入 plsql安装路径的PlugIns文件下就能用,还有中文插件,傻瓜式安装就可以使用,希望能帮助到小伙伴

    PLSQL语言转换注册表

    PLSQL(Procedural Language/Structured Query Language)是Oracle数据库的一种扩展,它将SQL与过程编程语言相结合,用于开发在Oracle环境中运行的应用程序。在PLSQL中,我们编写存储过程、函数、触发器等数据库对象...

    网页端oracle查询工具 简易版的PLSQL实现

    【标题】"网页端oracle查询工具 简易版的PLSQL实现"是基于Web的数据库查询工具,它简化了PL/SQL Developer的功能,让用户在网页环境下也能方便地进行Oracle数据库的操作和查询。这个工具主要面向开发人员和数据库...

Global site tag (gtag.js) - Google Analytics