숫자를 한글로 바꾸기
탐구생활/Delphi
간단할 것 같았는데 만단위 절삭, "일"을 표시하거나 말아야 하는 경우 등 생각해야 할 부분이 꽤 많다.
사실 델마당 강좌란에 이미 병규형님이 만들어두신 숫자 -> 한글 함수가 있지만, "일"을 생략해야 하는 경우의 처리가 없어서 이번 기회에 잘 버무려놓기로 한다.
문제는 귀차니즘... 잠시 고민하다 최종욱님 블로그에서 자바로 된 코드를 걷어다 델파이로 바꾸어보았다.
(*
임의의 숫자를 받아 한국어 숫자 표기 기법에 따라 변환한 문자열을 반환
최종욱님의 자바코드를 델파이로 변환.
http://link.egloos.com/4165494
파라미터
Number : 한국어로 바꿀 숫자
DecimalSp : 만단위 단위로 공백 삽입 여부.
Official : 이 값이 True 면 '일'을 생략하지 않는다.
*)
function IntToKorean(Number: Int64;
DecimalSp: Boolean = false;
Official: Boolean = false): String;
const
NumberStr : Array [0..7] of String = (
'이', '삼', '사', '오', '육', '칠', '팔', '구'
);
LevelStr : Array [0..2] of String = (
'십', '백', '천'
);
DecimalStr : Array [0..4] of String = (
'만', '억', '조', '경', '해'
);
var
Digits: String;
Len: Integer;
SubCount: Boolean;
Base: Integer; // 현재 다루고 있는 자릿수.
BaseMod4: Integer; // 만단위내 일십백천 단위.
Digit: Integer;
i: Integer;
begin
if Number = 0 then
Result := '영'
else
if (Number < 0) then
Result := '마이너스 ' + IntToKorean(-Number, Official)
else
begin
Digits := IntToStr(Number);
Len := Length(Digits);
SubCount := false;
for i:= 0 to Len-1 do
begin
Base := Len -i -1;
BaseMod4 := Base mod 4;
Digit := Ord(Digits[i+1]) - Ord('0');
if Digit <> 0 then
begin
SubCount := true;
if Digit = 1 then
begin
if Official or (BaseMod4 = 0) then
Result := Result + '일';
end else
Result := Result + NumberStr[Digit-2];
if BaseMod4 > 0 then
Result := Result + LevelStr[BaseMod4-1];
end;
if BaseMod4 = 0 then
begin
if SubCount and (Base > 0) then
begin
Result := Result + DecimalStr[Base div 4 - 1];
if DecimalSp then
Result := Result + ' ';
end;
end;
end;
end;
end;
숫자값 123523121821 을 변환할 경우
IntToKorean(123523121821);
결과 : 천이백삼십오억이천삼백십이만천팔백이십일
IntToKorean(123523121821, true);
결과 : 천이백삼십오억 이천삼백십이만 천팔백이십일
IntToKorean(123523121821, true, true);
결과 : 일천이백삼십오억 이천삼백일십이만 일천팔백이십일