壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5083|回复: 9

关于小写金额转换成大写金额

[复制链接]
发表于 2007/2/28 13:30:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

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

x
我现在想把销售订单和采购订单处,打印的时候,合计的小写金额转换成大写金额,请问,如何操作?
发表于 2007/2/28 13:38:10 | 显示全部楼层
没有现成的,可以自己写个oracle function, 不难。
发表于 2007/2/28 13:51:51 | 显示全部楼层

手头正好有一个英文的, 你可以参考一下

create or replace function spell_number( p_number in number )
  return varchar2
  
  as
      type myArray is table of varchar2(255);
      l_str    myArray := myArray( '',
                             ' THOUSAND ', ' MILLION ',
                             ' BILLION ', ' TRILLION ',
                             ' QUADRILLION ', ' QUINTILLION ',
                             ' SEXTILLION ', ' SEQTILLION ',
                             ' OCTILLION ', ' NONILLION ',
                             ' DECILLION ', ' UNDECILLION ',
                             ' DUODECILLION ' );
      l_num varchar2(50) default trunc( p_number );
      l_return varchar2(4000);
  begin
      for i in 1 .. l_str.count
      loop
          exit when l_num is null;
  
          if ( substr(l_num, length(l_num)-2, 3) <> 0 )
          then
              l_return := to_char(
                              to_date(
                               substr(l_num, length(l_num)-2, 3),
                                 'J' ),
                          'JSP' ) || l_str(i) || l_return;
          end if;
          l_num := substr( l_num, 1, length(l_num)-3 );
      end loop;
  
      -- beginning of section added to include decimal places:
      if to_char( p_number ) like '%.%'
      then
          l_num := substr( to_char(p_number,
          '9999999999999999999999999.99')
          , instr( to_char(p_number,
          '9999999999999999999999999.99'), '.' )+1 ,2);
          if l_num > 0
          then
              if l_num <> '00'
              then
                  l_return := l_return || ' AND CENT ';
                  l_return := l_return || to_char(to_date(l_num,'J' ),'JSP' );
              end if;
          end if;
      end if;
      -- end of section added to include decimal places
  
      return l_return || ' ONLY ';
  end spell_number;


运行结果:
select spell_number(19203344.76) from dual
返回
NINETEEN MILLION TWO HUNDRED THREE THOUSAND THREE HUNDRED FORTY-FOUR AND CENT SEVENTY-SIX ONLY

然后,在表里新加一个字段,用virtual column, 内容是spell_number(column name), 就可以在打印里,使用了。
 楼主| 发表于 2007/2/28 15:10:32 | 显示全部楼层

回复 #3 pshen 的帖子

函数已经完成
就是该如何跟COMPIERE结合,请指教?
 楼主| 发表于 2007/2/28 15:58:44 | 显示全部楼层

回复 #3 pshen 的帖子

已经解决
谢谢
发表于 2007/2/28 20:27:58 | 显示全部楼层
原帖由 pshen 于 2007-2-28 13:51 发表
create or replace function spell_number( p_number in number )
  return varchar2
  
  as
      type myArray is table of varchar2(255);
      l_str    myArray := myArray( '',
                 ...


这个....好熟悉啊,呵呵
发表于 2007/3/1 10:39:32 | 显示全部楼层
不好意思,忘了申明一下版权了。

以上代码原作者是Jojo.
发表于 2007/3/1 12:51:42 | 显示全部楼层
嘻嘻,不是我写的,是从asktom.com上抄下来的
发表于 2007/3/20 09:42:26 | 显示全部楼层

我也来加一个中文的

/**
* @author wu 将一个数字转化为金额
*/
public class ConvertNumber {
/** 定义数组存放数字对应的大写 */

private final static String[] STR_NUMBER = { "零", "壹", "贰", "叁", "肆", "伍",
   "陆", "柒", "捌", "玖" };

/** 定义数组存放位数的大写 */
private final static String[] STR_MODIFY = { "", "拾", "佰", "仟", "万", "拾",
   "佰", "仟", "亿", "拾", "佰", "仟" };

/**
  * 转化整数部分
  *
  * @param tempString
  * @return 返回整数部分
  */
private static String getInteger(String tempString) {
  /** 用来保存整数部分数字串 */
  String strInteger = null;//
  /** 记录"."所在位置 */
  int intDotPos = tempString.indexOf(".");
  int intSignPos = tempString.indexOf("-");
  if (intDotPos == -1)
   intDotPos = tempString.length();
  /** 取出整数部分 */
  strInteger = tempString.substring(intSignPos + 1, intDotPos);
  strInteger = new StringBuffer(strInteger).reverse().toString();

  StringBuffer sbResult = new StringBuffer();
  for (int i = 0; i < strInteger.length(); i++) {
   sbResult.append(STR_MODIFY);
   sbResult.append(STR_NUMBER[strInteger.charAt(i) - 48]);
  }

  sbResult = sbResult.reverse();

  replace(sbResult, "零拾", "零");
  replace(sbResult, "零佰", "零");
  replace(sbResult, "零仟", "零");
  replace(sbResult, "零万", "万");
  replace(sbResult, "零亿", "亿");

  replace(sbResult, "零零", "零");
  replace(sbResult, "零零零", "零");
  /** 这两句不能颠倒顺序 */
  replace(sbResult, "零零零零万", "");
  replace(sbResult, "零零零零", "");
  /** 这样读起来更习惯. */
  replace(sbResult, "壹拾亿", "拾亿");
  replace(sbResult, "壹拾万", "拾万");
  /** 删除个位上的零 */
  if (sbResult.charAt(sbResult.length() - 1) == '零'
    && sbResult.length() != 1)
   sbResult.deleteCharAt(sbResult.length() - 1);

  if (strInteger.length() == 2) {
   replace(sbResult, "壹拾", "拾");
  }
  /** 将结果反转回来. */
  return sbResult.toString();
}

/**
  * 转化小数部分 例:输入22.34返回叁肆
  *
  * @param tempString
  * @return
  */
private static String getFraction(String tempString) {
  String strFraction = null;
  int intDotPos = tempString.indexOf(".");
  /** 没有点说明没有小数,直接返回 */
  if (intDotPos == -1)
   return "";
  strFraction = tempString.substring(intDotPos + 1);
  StringBuffer sbResult = new StringBuffer(strFraction.length());
  /*
  for (int i = 0; i < strFraction.length(); i++) {
   sbResult.append(STR_NUMBER[strFraction.charAt(i) - 48]);
  }
  */
  
  for (int i = 0; i < strFraction.length(); i++) {
   sbResult.append(STR_NUMBER[strFraction.charAt(i) - 48]);
   if ( i == 0 ) sbResult.append("角");
   if ( i == 1 ) sbResult.append("分");
   if ( i == 2 ) sbResult.append("厘");
  }
  
  
  return sbResult.toString();
}

/**
  * 判断传入的字符串中是否有.如果有则返回点
  *
  * @param tempString
  * @return
  */
private static String getDot(String tempString) {
  return tempString.indexOf(".") == -1 ? "圆整" : "圆";
}

/**
  * 判断传入的字符串中是否有-如果有则返回负
  *
  * @param tempString
  * @return
  */
private static String getSign(String tempString) {
  return tempString.indexOf("-") != -1 ? "负" : "";
}

/**
  * 将一个数字转化为金额
  *
  * @param tempNumber
  *            传入一个double的变量
  * @return 返一个转换好的字符串
  */
public static String numberToChinese(double tempNumber) {
  java.text.DecimalFormat df = new java.text.DecimalFormat("#.#########");
  String pTemp = String.valueOf(df.format(tempNumber));
  StringBuffer sbResult = new StringBuffer(getSign(pTemp)
    + getInteger(pTemp) + getDot(pTemp) + getFraction(pTemp));
  return sbResult.toString();
}

/**
  * 替代字符
  *
  * @param pValue
  * @param pSource
  * @param pDest
  */
private static void replace(StringBuffer pValue, String pSource,
   String pDest) {
  if (pValue == null || pSource == null || pDest == null)
   return;
  /** 记录pSource在pValue中的位置 */
  int intPos = 0;
  do {
   intPos = pValue.toString().indexOf(pSource);
   /** 没有找到pSource */
   if (intPos == -1)
    break;
   pValue.delete(intPos, intPos + pSource.length());
   pValue.insert(intPos, pDest);
  } while (true);
}

/**
  * @param args
  */
public static void main(String[] args) {
  // TODO Auto-generated method stub
  System.out.println( numberToChinese(Double.parseDouble(args[0])));

}

}

评分

参与人数 1壹佰币 +1 收起 理由
pshen + 1 谢谢分享(^_^)

查看全部评分

发表于 2007/7/19 10:37:06 | 显示全部楼层
如果是报表和打印的话,还有一种办法,可以下载Jasper源码,扩充支持类型。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 05:59 , Processed in 0.017272 second(s), 15 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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