삽질하는플머

숫자를 한글로 바꾸기

탐구생활/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);
  결과 : 일천이백삼십오억 이천삼백일십이만 일천팔백이십일