數字小寫轉大寫

2021-07-03 05:09:13 字數 3908 閱讀 6573

網上很多數字小寫轉大寫的**,大多數寫得都有問題,找了個以前用過的,在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零元整 伍元整貳佰叄拾叄元整 壹仟零壹元整 肆萬零陸佰零柒元整 捌拾玖億元...