프로그래밍/C#

c# 숫자 읽어주는 프로그램

Jaebins 2023. 5. 2. 13:37
반응형

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ReadNumber
{
    public partial class Form1 : Form
    {
        string[] unit_korean = {"십", "백", "천", "만"};
        string[] unit_korean_etc = { "억", "조" };
        string[] num_korean = {"", "일", "이", "삼", "사", "오", "육", "칠", "팔", "구" };

        public Form1()
        {
            InitializeComponent();
        }

        private void CheckDigit()
        {
            // 입력된게 숫자가 아니라면 예외처리를 함
            if (input_Num.Text.Length > 0)
            {
                try
                {
                    int checkNum = Int32.Parse(input_Num.Text[input_Num.Text.Length - 1].ToString());
                }
                catch (Exception ex)
                {
                    input_Num.Text = input_Num.Text.Substring(0, input_Num.Text.Length - 1);
                    MessageBox.Show("숫자를 입력해주세요.");
                }
            }
        }

        private void AddComma()
        {
            string showingNum = input_Num.Text.Replace(",", "");
            if (showingNum.Length % 3 == 1 || showingNum.Length > 4) // 천단위 구분콤마 추가
            {
                int splitCnt = showingNum.Length / 3; // 콤마를 추가할 횟수
                if (showingNum.Length % 3 == 0)
                {
                    splitCnt -= 1;
                }
                for (int i = 0; i < splitCnt; i++)
                {
                    // 중간에 콤마가 주기적으로 추가되기 때문에 전체길이에 i를 빼줌
                    showingNum = showingNum.Insert((showingNum.Length - i) - 3 * (i + 1), ",");
                }
                input_Num.Text = showingNum;
            }

            input_Num.SelectionStart = input_Num.Text.Length;
        }

        private void ConvertKorean()
        {
            if (input_Num.Text.Contains(","))
            {
                string[] nums = input_Num.Text.Split(',');

                string numsToKorean = "";
                int startUnitNum = 0;

                switch (nums.Length - 1) // 단위 늘릴때 스위치문을 더 늘려야된다.
                {
                    case 1: // 1,000
                        startUnitNum = 2;
                        break;
                    case 2: // 1,000,000
                        startUnitNum = 1;
                        break;
                    case 3: // 1,000,000,000
                        startUnitNum = 0;
                        break;
                    case 4:
                        startUnitNum = 3;
                        break;
                    case 5:
                        startUnitNum = 2;
                        break;
                }

                if (nums[0].Length > 1)
                {
                    startUnitNum += nums[0].Length - 1;
                    if (startUnitNum > 3)
                    {
                        startUnitNum = (startUnitNum % 3) - 1;
                    }
                }

                string deleteCommaNum = input_Num.Text.Replace(",", "");
                int[] unitEtc_CountArr = { -100, -100 };
                int sub = deleteCommaNum.Length;
                bool manTrigger = false;

                string backUpUnitEtc = "";

                for (int i = 0; i < deleteCommaNum.Length; i++)
                {
                    numsToKorean += num_korean[Int32.Parse(deleteCommaNum[i].ToString())]; // 숫자 추가

                    if (i != deleteCommaNum.Length - 1) // 일의 자리수가 아닐때
                    {
                        bool unitEtcPart = false;
                        if (deleteCommaNum.Length >= 13) // 조의 자리수 도달하면
                        {
                            sub = 12;
                            unitEtc_CountArr[1] = (unitEtc_CountArr[1] == -100) ? 17 - deleteCommaNum.Length : unitEtc_CountArr[1];
                            if (unitEtc_CountArr[1] == 4) // 조 자리수 카운트가 끝났을때
                            {
                                backUpUnitEtc = unit_korean[startUnitNum];
                                unit_korean[startUnitNum] = unit_korean_etc[1];
                                unitEtcPart = true;
                            }

                            unitEtc_CountArr[1]++;
                        }
              
                        if (deleteCommaNum.Length >= 9 && deleteCommaNum.Length - 13 < i) // 억의 자리수 도달하면
                        {
                            unitEtc_CountArr[0] = (unitEtc_CountArr[0] == -100) ? 13 - sub : unitEtc_CountArr[0];
                            if (unitEtc_CountArr[0] == 4) // 억 자리수 카운트가 끝났을때
                            {
                                backUpUnitEtc = unit_korean[startUnitNum];
                                unit_korean[startUnitNum] = unit_korean_etc[0]; // 만 단위와 억 단위를 바꿔줌(충돌때문)
                                unitEtcPart = true;
                            }

                            unitEtc_CountArr[0]++;
                        }

                        if (!deleteCommaNum[i].ToString().Equals("0")) // 0 이면서, 가장 높은 자리 숫자부터 3번째
                        {
                            numsToKorean += unit_korean[startUnitNum]; // 단위
                            if (deleteCommaNum.Length >= 6 && deleteCommaNum[i + 1].ToString().Equals("0") && !manTrigger)
                            {
                                Console.WriteLine("만 붙임");
                                numsToKorean += "만";
                                manTrigger = true;
                            }
                        }

                        if (unitEtcPart)
                        {
                            unit_korean[startUnitNum] = backUpUnitEtc;
                        }
                    }
                    
                    startUnitNum -= 1;
                    if (startUnitNum < 0)
                    {
                        startUnitNum = 3;
                    }

                    label_Result.Text = numsToKorean;
                }
            }
        }

        private void input_Num_TextChanged(object sender, EventArgs e)
        {
            CheckDigit();
            AddComma();
            ConvertKorean();
        }
    }
}
반응형

'프로그래밍 > C#' 카테고리의 다른 글

c# 파일전송 채팅 프로그램  (3) 2023.05.02