Plsql 如何根据PL/SQL中的英联邦语言惯例将金额拼写为单词

Plsql 如何根据PL/SQL中的英联邦语言惯例将金额拼写为单词,plsql,Plsql,我目前正在使用此代码将数字/金额转换为文字: 从表A中选择UPPER(TO_CHAR(TO_DATE(A.Amt,'J'),'JSP')) 如果我有Amt=512 答案是“512” 但这是美式英语 我怎样才能输入“五百”和“十二” 这是英式英语 编辑: 谢谢大家的意见 以下是我到目前为止得到的信息: SELECT TO_CHAR(TO_DATE(CEIL(MAX(A.Amt)),'J' ),'Jsp')AS AMERICAN_ENGLISH, CASE WHEN TO_CHAR(TO_DATE(

我目前正在使用此代码将数字/金额转换为文字:

从表A中选择UPPER(TO_CHAR(TO_DATE(A.Amt,'J'),'JSP'))

如果我有Amt=512

答案是“512”

但这是美式英语

我怎样才能输入“五百”和“十二”

这是英式英语

编辑:

谢谢大家的意见

以下是我到目前为止得到的信息:

SELECT TO_CHAR(TO_DATE(CEIL(MAX(A.Amt)),'J' ),'Jsp')AS AMERICAN_ENGLISH,
CASE
WHEN TO_CHAR(TO_DATE(CEIL(mAX(A.Amt)),'J' ),'Jsp') like '%Hundred%' AND TO_CHAR(TO_DATE(CEIL(mAX(A.Amt)),'J' ),'Jsp') NOT LIKE '%Thousand%'
THEN REGEXP_replace(TO_CHAR(TO_DATE(CEIL(MAX(A.Amt)),'J' ),'Jsp'),'\s',' and ',1,2)
WHEN TO_CHAR(TO_DATE(CEIL(mAX(A.Amt)),'J' ),'Jsp') like '%Thousand%' AND
TO_CHAR(TO_DATE(CEIL(mAX(A.Amt)),'J' ),'Jsp') NOT LIKE '%Hundred%' AND CEIL(MAX(A.Amt)) > 1000
THEN REGEXP_replace(TO_CHAR(TO_DATE(CEIL(mAX(A.Amt)),'J' ),'Jsp') ,'\s',' and ',1,2)
WHEN TO_CHAR(TO_DATE(CEIL(MAX(A.Amt)),'J' ),'Jsp') like '%Hundred%' AND  TO_CHAR(TO_DATE(CEIL(MAX(A.Amt)),'J' ),'Jsp')  LIKE '%Thousand%'
THEN REGEXP_replace(TO_CHAR(TO_DATE(CEIL(MAX(A.Amt)),'J' ),'Jsp'),'\s',' and ',1,4)
ELSE TO_CHAR(TO_DATE(CEIL(MAX(A.Amt)),'J' ),'Jsp')
END AS BRITISH_ENGLISH
FROM TABLE1  A
我设法编写的更好的解决方案。它能满足所有的需求

SELECT 
        REGEXP_replace(TO_CHAR(TO_DATE(CEIL(A.Amt), 'J'), 'Jsp'),
                         ' ',
                         ' and ',(instr(TO_CHAR(TO_DATE(CEIL(A.Amt), 'J'), 'Jsp'),' ',-1)))
  FROM TABLE A

我认为此功能将为您提供:

create or replace function nummber_to_english
   ( p_number integer
   ) return   varchar2
is
   result long;
   millions integer;
   hundred_thousands integer;
   thousands integer;
   hundreds integer;
   units integer;
begin
   millions := floor(p_number/1000000);
   hundred_thousands := floor(mod(p_number,1000000)/100000);
   thousands := floor(mod(p_number,100000)/1000);
   hundreds := floor(mod(p_number,1000)/100);
   units := mod(p_number,100);

   result := trim(regexp_replace (case when millions > 0 then to_char(to_date(millions*1000000,'J'),'JSP') end
          || ' ' || case when hundred_thousands > 0 then to_char(to_date(hundred_thousands*100,'J'),'JSP') end
          || ' ' || case when (millions > 0 or hundred_thousands > 0) and thousands > 0 then ' AND' end 
          || ' ' || case when thousands > 0 then to_char(to_date(thousands,'J'),'JSP') end
          || ' ' || case when hundred_thousands > 0 or thousands > 0 then ' THOUSAND' end
          || ' ' || case when hundreds > 0 then to_char(to_date(hundreds*100,'J'),'JSP') end
          || ' ' || case when (millions > 0 or hundred_thousands > 0 or thousands > 0 or hundreds > 0) and units > 0 then ' AND' end 
          || ' ' || case when units > 0 then to_char(to_date(units,'J'),'JSP') end, '( ){2,}',' '));
   return result;
end;       
例如:

     33 THIRTY-THREE
    512 FIVE HUNDRED AND TWELVE
   1000 ONE THOUSAND
   1022 ONE THOUSAND AND TWENTY-TWO
 100000 ONE HUNDRED THOUSAND
 100001 ONE HUNDRED THOUSAND AND ONE
 500101 FIVE HUNDRED THOUSAND ONE HUNDRED AND ONE
 501101 FIVE HUNDRED AND ONE THOUSAND ONE HUNDRED AND ONE
1000000 ONE MILLION
1000001 ONE MILLION AND ONE
1000081 ONE MILLION AND EIGHTY-ONE
1000101 ONE MILLION ONE HUNDRED AND ONE
1200081 ONE MILLION TWO HUNDRED THOUSAND AND EIGHTY-ONE
1234567 ONE MILLION TWO HUNDRED AND THIRTY-FOUR THOUSAND FIVE HUNDRED AND SIXTY-SEVEN
1500101 ONE MILLION FIVE HUNDRED THOUSAND ONE HUNDRED AND ONE
1523101 ONE MILLION FIVE HUNDRED AND TWENTY-THREE THOUSAND ONE HUNDRED AND ONE

注意:与标准Oracle方法一样,此方法仅适用于1到5373484之间的整数。

我认为此函数将为您提供:

create or replace function nummber_to_english
   ( p_number integer
   ) return   varchar2
is
   result long;
   millions integer;
   hundred_thousands integer;
   thousands integer;
   hundreds integer;
   units integer;
begin
   millions := floor(p_number/1000000);
   hundred_thousands := floor(mod(p_number,1000000)/100000);
   thousands := floor(mod(p_number,100000)/1000);
   hundreds := floor(mod(p_number,1000)/100);
   units := mod(p_number,100);

   result := trim(regexp_replace (case when millions > 0 then to_char(to_date(millions*1000000,'J'),'JSP') end
          || ' ' || case when hundred_thousands > 0 then to_char(to_date(hundred_thousands*100,'J'),'JSP') end
          || ' ' || case when (millions > 0 or hundred_thousands > 0) and thousands > 0 then ' AND' end 
          || ' ' || case when thousands > 0 then to_char(to_date(thousands,'J'),'JSP') end
          || ' ' || case when hundred_thousands > 0 or thousands > 0 then ' THOUSAND' end
          || ' ' || case when hundreds > 0 then to_char(to_date(hundreds*100,'J'),'JSP') end
          || ' ' || case when (millions > 0 or hundred_thousands > 0 or thousands > 0 or hundreds > 0) and units > 0 then ' AND' end 
          || ' ' || case when units > 0 then to_char(to_date(units,'J'),'JSP') end, '( ){2,}',' '));
   return result;
end;       
例如:

     33 THIRTY-THREE
    512 FIVE HUNDRED AND TWELVE
   1000 ONE THOUSAND
   1022 ONE THOUSAND AND TWENTY-TWO
 100000 ONE HUNDRED THOUSAND
 100001 ONE HUNDRED THOUSAND AND ONE
 500101 FIVE HUNDRED THOUSAND ONE HUNDRED AND ONE
 501101 FIVE HUNDRED AND ONE THOUSAND ONE HUNDRED AND ONE
1000000 ONE MILLION
1000001 ONE MILLION AND ONE
1000081 ONE MILLION AND EIGHTY-ONE
1000101 ONE MILLION ONE HUNDRED AND ONE
1200081 ONE MILLION TWO HUNDRED THOUSAND AND EIGHTY-ONE
1234567 ONE MILLION TWO HUNDRED AND THIRTY-FOUR THOUSAND FIVE HUNDRED AND SIXTY-SEVEN
1500101 ONE MILLION FIVE HUNDRED THOUSAND ONE HUNDRED AND ONE
1523101 ONE MILLION FIVE HUNDRED AND TWENTY-THREE THOUSAND ONE HUNDRED AND ONE

注意:与标准Oracle方法一样,该方法仅适用于1到5373484之间的整数。

获取该字符串并将最后一个空格替换为“and”怎么样?INSTR函数也可以从末尾进行处理(-index的值),我不确定它是否是美式英语-例如501101变成了“五十万一千一百零一”。我想这只是因为很难确定什么时候需要它们,所以没有把AND放进去。@nabuchodonossor谢谢你的意见。事实上,我必须找到一种方法来替换最后一个空间。虽然我试过INSTR,但它给出的-1超出了范围。所以我硬编码在我的案例中的每一个可能的场景中包括最后一个空间的替换。这绝对不是万无一失的,但它会做一些技巧,比如获取字符串并用“and”替换最后一个空格?INSTR函数也可以从末尾进行处理(-index的值),我不确定它是否是美式英语-例如501101变成了“五十万一千一百零一”。我想这只是因为很难确定什么时候需要它们,所以没有把AND放进去。@nabuchodonossor谢谢你的意见。事实上,我必须找到一种方法来替换最后一个空间。虽然我试过INSTR,但它给出的-1超出了范围。所以我硬编码在我的案例中的每一个可能的场景中包括最后一个空间的替换。这绝对不是万无一失的,但它会做一些诡计。。。硬编码适合我的需要,因为对于我的目的,我不超过数千。谢谢。。。硬编码适合我的需要,因为就我的目的而言,我不会超过数千。