diff --git a/src/app/calendar-nav/calendar-nav.component.html b/src/app/calendar-nav/calendar-nav.component.html index bbb9d5e..b7580e4 100644 --- a/src/app/calendar-nav/calendar-nav.component.html +++ b/src/app/calendar-nav/calendar-nav.component.html @@ -9,7 +9,7 @@ [hidden]="!isLabelClickable" [attr.data-hidden]="!isLabelClickable" (click)="labelClicked()" - [innerText]="label"> + [innerText]="label | pNumber"> diff --git a/src/app/date-picker.module.ts b/src/app/date-picker.module.ts index 89f209c..d4abfeb 100644 --- a/src/app/date-picker.module.ts +++ b/src/app/date-picker.module.ts @@ -17,6 +17,9 @@ export {DayTimeCalendarComponent} from './day-time-calendar/day-time-calendar.co export {TimeSelectComponent} from './time-select/time-select.component'; export {MonthCalendarComponent} from './month-calendar/month-calendar.component'; +import { ENumberPipe } from './e-number.pipe'; +import { PNumberPipe } from './p-number.pipe'; + @NgModule({ providers: [ DomHelper, @@ -29,7 +32,9 @@ export {MonthCalendarComponent} from './month-calendar/month-calendar.component' MonthCalendarComponent, CalendarNavComponent, TimeSelectComponent, - DayTimeCalendarComponent + DayTimeCalendarComponent, + PNumberPipe, + ENumberPipe ], entryComponents: [ DatePickerComponent diff --git a/src/app/date-picker/date-picker.component.html b/src/app/date-picker/date-picker.component.html index 6e5bda2..544232b 100644 --- a/src/app/date-picker/date-picker.component.html +++ b/src/app/date-picker/date-picker.component.html @@ -5,7 +5,7 @@ + [innerText]="getDayBtnText(day) | pNumber"> diff --git a/src/app/e-number.pipe.ts b/src/app/e-number.pipe.ts new file mode 100644 index 0000000..33ef893 --- /dev/null +++ b/src/app/e-number.pipe.ts @@ -0,0 +1,17 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { Persian } from './persian'; + +@Pipe({ + name: 'eNumber' +}) +export class ENumberPipe implements PipeTransform { + + transform(str: any, args?: any): any { + if ((str != null) && str.toString().trim() !== '') { + return Persian.persianToEnglishNumber(str.toString()).toString(); + } else { + return ''; + } + } + +} diff --git a/src/app/p-number.pipe.ts b/src/app/p-number.pipe.ts new file mode 100644 index 0000000..26404ee --- /dev/null +++ b/src/app/p-number.pipe.ts @@ -0,0 +1,17 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { Persian } from './persian'; + +@Pipe({ + name: 'pNumber' +}) +export class PNumberPipe implements PipeTransform { + + transform(str: any, args?: any): any { + if ((str != null) && str.toString().trim() !== '') { + return Persian.englishToPersianNumber(str.toString()).toString(); + } else { + return ''; + } + } + +} diff --git a/src/app/persian.ts b/src/app/persian.ts new file mode 100644 index 0000000..95b9a0d --- /dev/null +++ b/src/app/persian.ts @@ -0,0 +1,88 @@ +export class Persian { + static englishToPersianNumber(number) { + if (!number) { + return; + } + const englishNumbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'], + persianNumbers = ['۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹', '۰']; + + for (let i = 0, numbersLen = englishNumbers.length; i < numbersLen; i++) { + number = number.replace(new RegExp(englishNumbers[i], 'g'), persianNumbers[i]); + } + return number; + } + + static persianToEnglishNumber(number) { + if (!number) { + return; + } + const englishNumbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'], + persianNumbers = ['۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹', '۰']; + + for (let i = 0, numbersLen = persianNumbers.length; i < numbersLen; i++) { + number = number.replace(new RegExp(persianNumbers[i], 'g'), englishNumbers[i]); + } + return number; + } + + // TODO:: performance issue + static numberToPersianDigitWords(number: string | number) { + if (typeof number !== 'string') { + number = number.toString(); + } + if (!isFinite(Number(number))) { + return ''; + } + const parts = ['', 'هزار', 'میلیون', 'میلیارد', 'تریلیون', 'کوادریلیون', 'کویینتیلیون', 'سکستیلیون']; + const numbers = { + hundreds: ['', 'صد', 'دویست', 'سیصد', 'چهارصد', 'پانصد', 'ششصد', 'هفتصد', 'هشتصد', 'نهصد'], + tens: ['', 'ده', 'بیست', 'سی', 'چهل', 'پنجاه', 'شصت', 'هفتاد', 'هشتاد', 'نود'], + units: ['', 'یک', 'دو', 'سه', 'چهار', 'پنج', 'شش', 'هفت', 'هشت', 'نه'], + tenToNineteen: ['ده', 'یازده', 'دوازده', 'سیزده', 'چهارده', 'پانزده', 'شانزده', 'هفده', 'هجده', 'نوزده'], + zero: 'صفر' + }; + const delimiter = ' و '; + // split number 3-3 + const numberList = number + .split('').reverse().join('').replace(/\d{3}(?=\d)/g, '$&,') + .split('').reverse().join('').split(',') + .map((x) => { + return Array(4 - x.length).join('0') + x; + }).reverse(); + let results; + results = [] + for (let index = 0; index < numberList.length; index++) { + const hundredsDigit = numberList[index][0]; + const tensDigit = numberList[index][1]; + const unitsDigit = numberList[index][2]; + const part = parts[index]; + let threeDigitResult; + threeDigitResult = []; + if (hundredsDigit !== '0') { + threeDigitResult.push(numbers.hundreds[hundredsDigit]); + } + if (tensDigit === '1') { + threeDigitResult.push(numbers.tenToNineteen[unitsDigit]); + } else { + if (tensDigit !== '0') { + threeDigitResult.push(numbers.tens[tensDigit]); + if (unitsDigit !== '0') { + threeDigitResult.push(numbers.units[unitsDigit]); + } + } else if (unitsDigit !== '0' && unitsDigit !== '1') { + threeDigitResult.push(numbers.units[unitsDigit]); + } + } + threeDigitResult = threeDigitResult.join(delimiter); + results.push(threeDigitResult + ' ' + part) + } + let result = results.filter((x) => { + return x.trim() !== ''; + }); + result = result.reverse().join(delimiter).trim(); + if (result !== '') { + return result; + } + return numbers.zero; + } +} diff --git a/src/app/time-select/time-select.component.html b/src/app/time-select/time-select.component.html index 0a9e606..213979f 100644 --- a/src/app/time-select/time-select.component.html +++ b/src/app/time-select/time-select.component.html @@ -6,7 +6,7 @@ (click)="increase('hour')"> + [innerText]="hours | pNumber"> + [innerText]="minutes | pNumber"> + [innerText]="seconds | pNumber">