古老嘅问题--实现人民币大写转换嘅新方案 (50分)

  • 主题发起人 主题发起人 web_lance
  • 开始时间 开始时间
W

web_lance

Unregistered / Unconfirmed
GUEST, unregistred user!
关于“去掉人民币形式中多余的零(50分) ”一贴--俾分。
  检索过离线数据库,揾到大约有8、9个度呢方面嘅方案。基本嘅转换功能都可以实现,但系对于“零”嘅取舍,实现起来大都比较繁琐,個别仲有少许缺憾。
  话虽然系古老嘅问题,但系到今时今日好似都仲未见有一个公认嘅比较完美方案(可能系仲未贴出嚟啦),不过庆幸嘅系每隔一段时间提出呢個问题都会有新嘅发现。[:)]
 
一个只有10行代码的大写金额转换程序
function NumToChar(n:Real): wideString;
//可以到万亿,并可随便扩大
const
cNum:WideString='零壹贰叁肆伍陆柒捌玖-万仟佰拾亿仟佰拾万仟佰拾元角分';
cCha:array[0..1, 0..11]of string =
(( '零仟','零佰','零拾','零零零','零零','零亿','零万','零元','亿万','零角','零分','零整'),
( '零','零','零','零','零','亿','万','元','亿','零','整','整'));
var
i :Integer;
sNum :WideString;
begin
result :='';
sNum := FormatFloat('0',n*100);
for i := 1 to Length(sNum)do
result := result + cNum[ord(sNum)-47] + cNum[26-Length(sNum)+i];
for i:= 0 to 11do
//去掉多余的零
result := StringReplace(result, cCha[0,i], cCha[1,i], [rfReplaceAll]);
end;
 
To xuhao1:
  你個构思几好啵,只不过
  从
  101110.01 → 壹拾万壹仟壹佰壹拾元零壹分
  至
  9000000009990.09 → 玖万亿玖仟玖佰玖拾元零玖分
  佢哋仟位前面個“零”都系冇咗嘅,你可以再改下吗?
  我试过改個数组('零万'转'万零',另外加多个'零零'转'零'),唔知你系点改嘅呢?
 
To zhanggx:
  你有冇嚟过,睇咗xuhao1果個函数你有冇乜嘢意见吖?
 
你不是吧,还在研究这个呀. 有空再研究呀.
 
procedure DXJE(const Val: PChar;
var R: OpenString);
const
HZUni: array[0..10] of String[2] =
('分','角',' ','圆','拾','佰','仟','万','拾','佰','仟');
HZDig: array['0'..'9'] of String[2] =
('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');
var
I, Idx, Cnt: Integer;
C: Char;
Zero: Boolean;
begin
Zero := False;
R := '';
Cnt := StrLen(Val) - 1;
for I := 0 to Cntdo
begin
C := Val;
if not (C in ['0'..'9']) then
Continue;
if C <> '0' then
begin
if Zero then
R := R + '零';
R := R + HZDig[C];
end;
Idx := Cnt - I;
if (C <> '0') or (Idx in [3, 7]) then
R := R + HZUni[Idx];
Zero := C = '0';
if (Idx = 0) and Zero then
R := R + '整';
end;
end;

//参数Val的格式必须是包含两位小数的格式, 例如20043.60
//1亿以下
 
TO 楼主, 你没有必要研究这些啦, 你没事呀,你还是研究些新的技术性强一点的啦. 我不想讨论这些了. 关闭讨论.建议.
 
上面的已经有解决方案了
 
多谢大家嘅关注![:)]
 
后退
顶部