網上很多數字小寫轉大寫的**,大多數寫得都有問題,找了個以前用過的,在2010下改了改,已測(測試**在下方)
function getcnnumber(num: double): string;
const
_chinesenumeric: string = '零一二三四五六七**';
var sintarabic: string;
posofdecimalpoint: integer;
i: integer;
idigit: integer;
isection: integer;
ssectionarabic: string;
ssection: string;
binzero: boolean;
bminus: boolean;
numstr: string;
(* 將字串反向, 例如: 傳入 '1234', 傳回 '4321' *)
function convertstr(const sbeconvert: string): string;
varx: integer;
begin
result := '';
for x := length(sbeconvert) downto 1 do
result := result + sbeconvert[x];
end;
begin
numstr := floattostr(num);
result := '';
binzero := true;
if numstr[1] = '-' then
begin
bminus := true;
numstr := copy(numstr, 2, length(numstr));
endelse
bminus := false;
posofdecimalpoint := pos('.', numstr); (* 取得小數點的位置 *)
(* 先處理整數的部分 *)
if posofdecimalpoint = 0 then
sintarabic := convertstr(numstr)
else
sintarabic := convertstr(copy(numstr, 1, posofdecimalpoint - 1));
(* 從個位數起以每四位數為一小節 *)
for isection := 0 to ((length(sintarabic) - 1) div 4) do
begin
ssectionarabic := copy(sintarabic, isection * 4 + 1, 4);
ssection := '';
(* 以下的 i 控制: 個十百千位四個位數 *)
for i := 1 to length(ssectionarabic) do
begin
idigit := ord(ssectionarabic[i]) - 48;
if idigit = 0 then
begin
(* 1. 避免 '零' 的重複出現 *)
(* 2. 個位數的 0 不必轉成 '零' *)
if (not binzero) and (i <> 1) then
ssection := '零' + ssection;
binzero := true;
endelse
begin
case i of
2: ssection := '十' + ssection;
3: ssection := '百' + ssection;
4: ssection := '千' + ssection;
end;
ssection := copy(_chinesenumeric, idigit + 1, 1) +
ssection;
binzero := false;
end;
end;
(* 加上該小節的位數 *)
if length(ssection) = 0 then
begin
if (length(result) > 0) and (copy(result, 1, 1) <> '零') then
result := '零' + result;
endelse
begin
case isection of
0: result := ssection;
1: result := ssection + '萬' + result;
2: result := ssection + '億' + result;
3: result := ssection + '兆' + result;
end;
end;
end;
(* 處理小數點右邊的部分 *)
if posofdecimalpoint > 0 then
begin
result := result + '點';
for i := posofdecimalpoint + 1 to length(numstr) do
begin
idigit := ord(numstr[i]) - 48;
result := result + copy(_chinesenumeric, idigit + 1, 1);
end;
end;
(* 其他例外狀況的處理 *)
if length(result) = 0 then
result := '零';
if copy(result, 1, 2) = '一十' then
result := copy(result, 2, length(result));
if copy(result, 1, 1) = '點' then
result := '零' + result;
(* 是否為負數 *)
if bminus then
result := '負' + result;
end;
測試**:
procedure tform1.addmsg( s: string );
begin
mmoinfo.lines.add( s );
end;
procedure btntestclick(sender: tobject);
begin
addmsg( getcnnumber( 5 ));
addmsg( getcnnumber( 15 ));
addmsg( getcnnumber( 25 ));
addmsg( getcnnumber( 115 ));
addmsg( getcnnumber( 1234 ));
addmsg( getcnnumber( 12345 ));
addmsg( getcnnumber( 123456 ));
addmsg( getcnnumber( 1234567 ));
addmsg( getcnnumber( 12345678 ));
addmsg( getcnnumber( 12345008 ));
addmsg( getcnnumber( 12300678 ));
addmsg( getcnnumber( 0.15 ));
addmsg( getcnnumber( 15.12 ));
addmsg( getcnnumber( 12345.2 ));
addmsg( getcnnumber( -12 ));
addmsg( getcnnumber( -12345.2 ));
end;
數字小寫轉大寫
加到類的定義部分 private static string cstr privatestatic string wstr 數字必須在12位整數以內的字串 呼叫方式如 label1.text convertint 數字字串 public string convertint string str rs...
數字小寫轉大寫
加到類的定義部分 private static string cstr private static string wstr 數字必須在12位整數以內的字串 呼叫方式如 label1.text convertint 數字字串 public string convertint string str r...
17 小寫數字轉大寫數字
個人水平有限,請見諒!實現乙個演算法,可以將小寫數字轉換成大寫數字。輸入乙個整數。範圍在0 450億之間。輸出對應的大寫數字,以 元整 結尾。大寫數字要符合漢語讀寫習慣。0 5233 1001 40607 8900000000零元整 伍元整貳佰叄拾叄元整 壹仟零壹元整 肆萬零陸佰零柒元整 捌拾玖億元...