Korea Super Formatter ๐Ÿ‡ฐ๐Ÿ‡ท

pub package License: MIT

Korean-specific formatters for Flutter. ํ•œ๊ตญ ์„œ๋น„์Šค์— ํŠนํ™”๋œ ํฌ๋งทํ„ฐ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.

โœจ Features

  • ๐Ÿ’ฐ ๊ธˆ์•ก ํฌ๋งทํ„ฐ - ์›ํ™”, ํ•œ๊ธ€ ๋‹จ์œ„ ํ‘œ๊ธฐ, ํŒŒ์‹ฑ
  • ๐Ÿ“ˆ ์ˆ˜์ต๋ฅ  ํฌ๋งทํ„ฐ - ํผ์„ผํŠธ, ๋ถ€ํ˜ธ ํฌํ•จ, ์ƒ‰์ƒ ํ—ฌํผ
  • ๐Ÿ“ฑ ์ „ํ™”๋ฒˆํ˜ธ ํฌ๋งทํ„ฐ - ์ž๋™ ํฌ๋งทํŒ…, ๋งˆ์Šคํ‚น, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  • ๐Ÿ• ์ƒ๋Œ€ ์‹œ๊ฐ„ ํฌ๋งทํ„ฐ - "5๋ถ„ ์ „", "์–ด์ œ", "3์ผ ์ „" ๋“ฑ
  • ๐Ÿ“… ๋‚ ์งœ ํฌ๋งทํ„ฐ - ํ•œ๊ตญ์‹ ๋‚ ์งœ ํ˜•์‹, ์š”์ผ ํฌํ•จ
  • ๐Ÿ”ข ์ˆซ์ž ํฌ๋งทํ„ฐ - ์ฒœ ๋‹จ์œ„ ๊ตฌ๋ถ„, ํ•œ๊ธ€ ๋‹จ์œ„ ํ‘œ๊ธฐ
  • ๐Ÿ”’ ๊ฐœ์ธ์ •๋ณด ๋งˆ์Šคํ‚น - ์ด๋ฆ„, ์ด๋ฉ”์ผ, ์ „ํ™”๋ฒˆํ˜ธ, ๊ณ„์ขŒ๋ฒˆํ˜ธ ๋“ฑ
  • ๐Ÿข ์‚ฌ์—…์ž๋ฒˆํ˜ธ ํฌ๋งทํ„ฐ - ํฌ๋งทํŒ…, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ

๐Ÿ“ฆ Installation

dependencies:
  korea_super_formatter: ^1.0.0
flutter pub get

๐Ÿš€ Usage

๐Ÿ’ฐ ๊ธˆ์•ก ํฌ๋งทํ„ฐ (KrwFormatter)

import 'package:korea_super_formatter/korea_super_formatter.dart';

// ๊ธฐ๋ณธ ํฌ๋งท
KrwFormatter.format(1350000);              // "1,350,000์›"
KrwFormatter.format(1350000, unit: false); // "1,350,000"

// ํ•œ๊ธ€ ๋‹จ์œ„ ํ‘œ๊ธฐ
KrwFormatter.toKorean(135003000);          // "1์–ต 3,500๋งŒ 3,000์›"
KrwFormatter.toKoreanCompact(135003000);   // "1.35์–ต"

// ๋ถ€ํ˜ธ ํฌํ•จ
KrwFormatter.formatSigned(50000);          // "+50,000์›"
KrwFormatter.formatSigned(-30000);         // "-30,000์›"

// ํŒŒ์‹ฑ
KrwFormatter.parse("1์–ต 3,500๋งŒ์›");        // 135000000

๐Ÿ“ˆ ์ˆ˜์ต๋ฅ  ํฌ๋งทํ„ฐ (PercentFormatter)

// ๊ธฐ๋ณธ ํฌ๋งท
PercentFormatter.format(12.345);           // "12.35%"
PercentFormatter.format(12.345, decimals: 1); // "12.3%"

// ๋ถ€ํ˜ธ ํฌํ•จ
PercentFormatter.formatSigned(12.34);      // "+12.34%"
PercentFormatter.formatSigned(-5.67);     // "-5.67%"

// ์ƒ‰์ƒ ํ—ฌํผ
PercentFormatter.getColor(12.34);         // Colors.red (์ƒ์Šน)
PercentFormatter.getColor(-5.67);         // Colors.blue (ํ•˜๋ฝ)

// ํŒŒ์‹ฑ
PercentFormatter.parse("+12.34%");        // 12.34

๐Ÿ“ฑ ์ „ํ™”๋ฒˆํ˜ธ ํฌ๋งทํ„ฐ (PhoneFormatter)

// ํฌ๋งทํŒ…
PhoneFormatter.format("01012345678");      // "010-1234-5678"
PhoneFormatter.format("0212345678");      // "02-1234-5678"

// ๋งˆ์Šคํ‚น
PhoneFormatter.mask("01012345678");        // "010-****-5678"
PhoneFormatter.mask("01012345678", start: 3, end: 7); // "010-****-5678"

// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
PhoneFormatter.isValid("01012345678");     // true
PhoneFormatter.isMobile("01012345678");    // true

๐Ÿ• ์ƒ๋Œ€ ์‹œ๊ฐ„ ํฌ๋งทํ„ฐ (RelativeTime)

// ๊ธฐ๋ณธ ํฌ๋งท
RelativeTime.format(dateTime);             // "5๋ถ„ ์ „"
RelativeTime.format(dateTime);             // "์–ด์ œ"
RelativeTime.format(dateTime);             // "3์ผ ์ „"

// ์Šค๋งˆํŠธ ํฌ๋งท
RelativeTime.formatSmart(dateTime);
// - 1๋ถ„ ๋ฏธ๋งŒ: "์ง€๊ธˆ"
// - 1~59๋ถ„: "N๋ถ„ ์ „"
// - 1~23์‹œ๊ฐ„: "N์‹œ๊ฐ„ ์ „"
// - 1~3์ผ: "N์ผ ์ „"
// - ๊ทธ ์ดํ›„: "3์›” 15์ผ"

// ๋ฏธ๋ž˜ ์‹œ๊ฐ„
RelativeTime.formatFuture(futureDate);     // "5๋ถ„ ํ›„", "๋‚ด์ผ"

๐Ÿ“… ๋‚ ์งœ ํฌ๋งทํ„ฐ (DateFormatter)

// ๊ธฐ๋ณธ ํฌ๋งท
DateFormatter.format(date);                // "2024.03.15"
DateFormatter.formatFull(date);            // "2024๋…„ 3์›” 15์ผ"
DateFormatter.formatWithDay(date);         // "2024.03.15 (๊ธˆ)"

// ์‹œ๊ฐ„ ํฌํ•จ
DateFormatter.formatDateTime(dateTime);    // "2024.03.15 14:30"
DateFormatter.formatTime12(dateTime);      // "์˜คํ›„ 2:30"

// ๊ธฐ๊ฐ„
DateFormatter.formatRange(start, end);     // "2024.03.15 ~ 2024.03.20"

๐Ÿ”’ ๊ฐœ์ธ์ •๋ณด ๋งˆ์Šคํ‚น (PrivacyMasker)

// ๋ฒ”์šฉ ๋งˆ์Šคํ‚น
PrivacyMasker.mask("ํ™๊ธธ๋™", start: 1, end: 2);     // "ํ™*๋™"
PrivacyMasker.mask("01012345678", start: 3, end: 7); // "010****5678"

// ํƒ€์ž…๋ณ„ ํŽธ์˜ ๋ฉ”์„œ๋“œ
PrivacyMasker.name("ํ™๊ธธ๋™");              // "ํ™*๋™" (๊ธฐ๋ณธ)
PrivacyMasker.name("ํ™๊ธธ๋™", start: 0, end: 2); // "**๋™" (์ปค์Šคํ…€)

PrivacyMasker.email("test@gmail.com");     // "te**@gmail.com"
PrivacyMasker.phone("01012345678");        // "010-****-5678"
PrivacyMasker.rrn("901215-1234567");       // "901215-1******"
PrivacyMasker.account("12345678901234");   // "1234******1234"
PrivacyMasker.card("1234567890123456");    // "1234-****-****-3456"

๐Ÿข ์‚ฌ์—…์ž๋ฒˆํ˜ธ ํฌ๋งทํ„ฐ (BusinessFormatter)

// ํฌ๋งทํŒ…
BusinessFormatter.formatBrn("1234567890");  // "123-45-67890"

// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (๊ตญ์„ธ์ฒญ ๊ณต์‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜)
BusinessFormatter.isValidBrn("1234567890"); // true/false

// ๋ฒ•์ธ๋“ฑ๋ก๋ฒˆํ˜ธ
BusinessFormatter.formatCrn("1234567890123"); // "123456-7890123"
BusinessFormatter.isValidCrn("1234567890123"); // true/false

๐Ÿ“‹ API Reference

KrwFormatter

  • format(int amount, {bool unit = true}) - ๊ธฐ๋ณธ ๊ธˆ์•ก ํฌ๋งทํŒ…
  • toKorean(int amount) - ํ•œ๊ธ€ ๋‹จ์œ„ ํ‘œ๊ธฐ
  • toKoreanCompact(int amount) - ๊ฐ„๋žตํ˜• ํ•œ๊ธ€ ๋‹จ์œ„
  • formatSigned(int amount, {bool unit = true}) - ๋ถ€ํ˜ธ ํฌํ•จ
  • parse(String amountStr) - ํ•œ๊ธ€ ๊ธˆ์•ก ํŒŒ์‹ฑ

PercentFormatter

  • format(double rate, {int decimals = 2}) - ๊ธฐ๋ณธ ํฌ๋งทํŒ…
  • formatSigned(double rate, {int decimals = 2}) - ๋ถ€ํ˜ธ ํฌํ•จ
  • getColor(double rate, {...}) - ์ƒ‰์ƒ ๋ฐ˜ํ™˜
  • parse(String rateStr) - ํผ์„ผํŠธ ํŒŒ์‹ฑ

PhoneFormatter

  • format(String phone) - ์ „ํ™”๋ฒˆํ˜ธ ํฌ๋งทํŒ…
  • mask(String phone, {int? start, int? end}) - ๋งˆ์Šคํ‚น
  • isValid(String phone) - ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  • isMobile(String phone) - ํœด๋Œ€ํฐ ํ™•์ธ
  • isLandline(String phone) - ์ผ๋ฐ˜์ „ํ™” ํ™•์ธ

RelativeTime

  • format(DateTime dateTime) - ๊ธฐ๋ณธ ์ƒ๋Œ€ ์‹œ๊ฐ„
  • formatSmart(DateTime dateTime) - ์Šค๋งˆํŠธ ํฌ๋งท
  • formatShort(DateTime dateTime) - ์งง์€ ํ˜•์‹
  • formatFuture(DateTime dateTime) - ๋ฏธ๋ž˜ ์‹œ๊ฐ„

DateFormatter

  • format(DateTime date) - ๊ธฐ๋ณธ ๋‚ ์งœ ํฌ๋งท
  • formatFull(DateTime date) - ์ „์ฒด ๋‚ ์งœ
  • formatWithDay(DateTime date) - ์š”์ผ ํฌํ•จ
  • formatDateTime(DateTime dateTime) - ๋‚ ์งœ+์‹œ๊ฐ„
  • formatTime12(DateTime dateTime) - 12์‹œ๊ฐ„์ œ

PrivacyMasker

  • mask(String value, {int? start, int? end, String maskChar = '*'}) - ๋ฒ”์šฉ ๋งˆ์Šคํ‚น
  • name(String name, {...}) - ์ด๋ฆ„ ๋งˆ์Šคํ‚น
  • email(String email, {...}) - ์ด๋ฉ”์ผ ๋งˆ์Šคํ‚น
  • phone(String phone, {...}) - ์ „ํ™”๋ฒˆํ˜ธ ๋งˆ์Šคํ‚น
  • rrn(String rrn, {...}) - ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ ๋งˆ์Šคํ‚น
  • account(String account, {...}) - ๊ณ„์ขŒ๋ฒˆํ˜ธ ๋งˆ์Šคํ‚น
  • card(String card, {...}) - ์นด๋“œ๋ฒˆํ˜ธ ๋งˆ์Šคํ‚น

BusinessFormatter

  • formatBrn(String brn) - ์‚ฌ์—…์ž๋“ฑ๋ก๋ฒˆํ˜ธ ํฌ๋งทํŒ…
  • isValidBrn(String brn) - ์‚ฌ์—…์ž๋“ฑ๋ก๋ฒˆํ˜ธ ๊ฒ€์ฆ
  • formatCrn(String crn) - ๋ฒ•์ธ๋“ฑ๋ก๋ฒˆํ˜ธ ํฌ๋งทํŒ…
  • isValidCrn(String crn) - ๋ฒ•์ธ๋“ฑ๋ก๋ฒˆํ˜ธ ๊ฒ€์ฆ

๐Ÿค Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

๐Ÿ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

๐Ÿ™ Acknowledgments

  • Formatters are optimized for Korean financial and business environments
  • Business registration number validation follows NTS (National Tax Service) standards

Libraries

korea_super_formatter
Korean-specific formatters package.