반응형
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# 상속(Inheritance), virtual, override 키워드 정리 (1) | 2024.11.13 |
---|---|
C# 인터페이스(Interface) 정리 (0) | 2024.11.12 |
C# 제네릭(generic) 간단 사용법 (0) | 2024.11.07 |
c# 프로퍼티(property) 간단 사용법 (3) | 2024.11.06 |
c# 파일전송 채팅 프로그램 (3) | 2023.05.02 |