├── index.ts ├── src ├── typings.d.ts ├── index.ts ├── services │ ├── persian-letters.service.ts │ ├── national-code.service.ts │ ├── company-national-id.service.ts │ └── persian-number.service.ts ├── persian-utils.module.ts └── number-to-persian-word.ts ├── .editorconfig ├── doc ├── README.md ├── PersianUtilsModule.md ├── NationalCodeService.md ├── CompanyNationalIdService.md ├── PersianLettersService.md └── PersianNumberService.md ├── tsconfig.json ├── .gitignore ├── LICENSE.md ├── package.json ├── tslint.json └── README.md /index.ts: -------------------------------------------------------------------------------- 1 | export * from './src/index'; 2 | -------------------------------------------------------------------------------- /src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /* SystemJS module definition */ 2 | declare var module: NodeModule; 3 | interface NodeModule { 4 | id: string; 5 | } 6 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /doc/README.md: -------------------------------------------------------------------------------- 1 | # Documentation 2 | 3 | * [`PersianUtilsModule`](./PersianUtilsModule.md) 4 | * [`NationalCodeService`](./NationalCodeService.md) 5 | * [`CompanyNationalIdService`](./CompanyNationalIdService.md) 6 | * [`PersianNumberService`](./PersianNumberService.md) 7 | 8 | ## License 9 | 10 | [`MIT`](./LICENSE.md) -------------------------------------------------------------------------------- /doc/PersianUtilsModule.md: -------------------------------------------------------------------------------- 1 | ## PersianUtilsModule 2 | 3 | Import `PersianUtilsModule` into your app's modules: 4 | 5 | ``` typescript 6 | import {PersianUtilsModule} from 'angular2-persian-utils' 7 | 8 | @NgModule({ 9 | imports: [ 10 | PersianUtilsModule 11 | ] 12 | }) 13 | ``` 14 | 15 | ## License 16 | 17 | [`MIT`](./LICENSE.md) -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { PersianNumberService } from './services/persian-number.service'; 2 | export { NationalCodeService } from './services/national-code.service'; 3 | export { CompanyNationalIdService } from './services/company-national-id.service'; 4 | export { PersianUtilsModule } from './persian-utils.module'; 5 | export { PersianLettersService } from './services/persian-letters.service'; 6 | 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "outDir": "./dist", 5 | "baseUrl": "src", 6 | "sourceMap": true, 7 | "declaration": true, 8 | "moduleResolution": "node", 9 | "emitDecoratorMetadata": true, 10 | "experimentalDecorators": true, 11 | "target": "es5", 12 | "typeRoots": [ 13 | "node_modules/@types" 14 | ], 15 | "lib": [ 16 | "es2016", 17 | "dom" 18 | ] 19 | } 20 | } -------------------------------------------------------------------------------- /src/services/persian-letters.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class PersianLettersService { 5 | 6 | constructor() { } 7 | 8 | replaceArabicLettersWithPersianLetters(inputStr: string): string { 9 | if (inputStr == undefined) return ""; 10 | var copyStr = inputStr; 11 | 12 | inputStr = inputStr.replace(/ي/g, 'ی'); 13 | inputStr = inputStr.replace(/ك/g, 'ک'); 14 | 15 | return inputStr; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/persian-utils.module.ts: -------------------------------------------------------------------------------- 1 | import { PersianNumberService } from './services/persian-number.service'; 2 | import { NgModule } from '@angular/core'; 3 | 4 | import { NationalCodeService } from './services/national-code.service'; 5 | import { CompanyNationalIdService } from './services/company-national-id.service'; 6 | import { PersianLettersService } from './services/persian-letters.service'; 7 | 8 | @NgModule({ 9 | declarations: [], 10 | imports: [], 11 | providers: [NationalCodeService, 12 | CompanyNationalIdService, 13 | PersianNumberService, 14 | PersianLettersService], 15 | }) 16 | export class PersianUtilsModule { } 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | #Ignore thumbnails created by Windows 3 | Thumbs.db 4 | #Ignore files built by Visual Studio 5 | *.obj 6 | *.exe 7 | *.pdb 8 | *.user 9 | *.aps 10 | *.pch 11 | *.vspscc 12 | *_i.c 13 | *_p.c 14 | *.ncb 15 | *.suo 16 | *.tlb 17 | *.tlh 18 | *.bak 19 | *.cache 20 | *.ilk 21 | *.log 22 | [Bb]in 23 | [Dd]ebug*/ 24 | *.lib 25 | *.sbr 26 | obj/ 27 | [Rr]elease*/ 28 | _ReSharper*/ 29 | [Tt]est[Rr]esult* 30 | .vs/ 31 | #Nuget packages folder 32 | packages/ 33 | 34 | # compiled output 35 | /dist 36 | /tmp 37 | /out-tsc 38 | 39 | # dependencies 40 | /node_modules 41 | 42 | # develop 43 | /sample 44 | 45 | # IDEs and editors 46 | /.idea 47 | .project 48 | .classpath 49 | .c9/ 50 | *.launch 51 | .settings/ 52 | *.sublime-workspace 53 | 54 | -------------------------------------------------------------------------------- /doc/NationalCodeService.md: -------------------------------------------------------------------------------- 1 | ## NationalCodeService 2 | 3 | This service provides helper for 'Iranian people national code'. 4 | 5 | national code >> کد ملی 6 | 7 | ### Methods 8 | 9 | #### isValid(nationalCode: string): boolean 10 | 11 | This method take a 'nationalCode' and check it is correctly? 12 | 13 | ##### Example 14 | 15 | ```typescript 16 | import { Component } from '@angular/core'; 17 | 18 | import {NationalCodeService} from 'angular2-persian-utils' 19 | 20 | @Component({ 21 | selector: 'app-root', 22 | templateUrl: './app.component.html', 23 | styleUrls: ['./app.component.css'] 24 | }) 25 | export class AppComponent { 26 | 27 | constructor(private nationalCodeService: NationalCodeService) { 28 | var nationalCodeIsValid = nationalCodeService.isValid('1234567890')); 29 | } 30 | } 31 | ``` 32 | 33 | ## License 34 | 35 | [`MIT`](./LICENSE.md) -------------------------------------------------------------------------------- /doc/CompanyNationalIdService.md: -------------------------------------------------------------------------------- 1 | ## CompanyNationalIdService 2 | 3 | This service provides helper for 'company national code'. 4 | 5 | company national code >> شماره ثبت شرکت 6 | 7 | ### Methods 8 | 9 | #### isValid(companyNationalId: string): boolean 10 | 11 | This method take a 'companyNationalCode' and check it is correctly? 12 | 13 | ##### Example 14 | 15 | ```typescript 16 | import { Component } from '@angular/core'; 17 | 18 | import {CompanyNationalIdService} from 'angular2-persian-utils' 19 | 20 | @Component({ 21 | selector: 'app-root', 22 | templateUrl: './app.component.html', 23 | styleUrls: ['./app.component.css'] 24 | }) 25 | export class AppComponent { 26 | 27 | constructor(private companyNationalIdService: CompanyNationalIdService) { 28 | var companyNationalIdIsValid = companyNationalIdService.isValid('12345678901')); 29 | } 30 | } 31 | ``` 32 | 33 | ## License 34 | 35 | [`MIT`](./LICENSE.md) -------------------------------------------------------------------------------- /doc/PersianLettersService.md: -------------------------------------------------------------------------------- 1 | ## PersianLettersService 2 | 3 | This service provides helper for 'persian letters'. 4 | 5 | ### Methods 6 | 7 | #### replaceArabicLettersWithPersianLetters(inputStr: string): string 8 | 9 | This method take a 'string' and replace all arabic letters with persian(e.g 'ي' and 'ك' replace with 'ی' and 'ک').? 10 | 11 | ##### Example 12 | 13 | ```typescript 14 | import { Component } from '@angular/core'; 15 | 16 | import {PersianNumberService} from 'angular2-persian-utils' 17 | 18 | @Component({ 19 | selector: 'app-root', 20 | templateUrl: './app.component.html', 21 | styleUrls: ['./app.component.css'] 22 | }) 23 | export class AppComponent { 24 | 25 | constructor(private persianNumberService: PersianNumberService) { 26 | console.log(this.persianLettersService 27 | .replaceArabicLettersWithPersianLetters( 28 | 'انگولار يك فريمورك ساختاري براي وب اپليكيشن هاي پويا است.') 29 | );// انگولار یک فریمورک ساختاری برای وب اپلیکیشن های پویا است. 30 | } 31 | } 32 | ``` 33 | 34 | ## License 35 | 36 | [`MIT`](./LICENSE.md) -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Florian Knop 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular2-persian-utils", 3 | "version": "0.1.5", 4 | "description": "Persian utils for Angular2 applications.", 5 | "author": "Javad Rasouli ", 6 | "license": "MIT", 7 | "keywords": [ 8 | "ng2", 9 | "ng", 10 | "angular", 11 | "angular2", 12 | "angularjs", 13 | "pipes", 14 | "filters", 15 | "library", 16 | "persian", 17 | "farsi", 18 | "thvsd" 19 | ], 20 | "files": [ 21 | "src", 22 | "index.ts", 23 | "doc" 24 | ], 25 | "scripts": { 26 | }, 27 | "repository": { 28 | "type": "git", 29 | "url": "git+https://github.com/JavadRasouli/angular2-persian-utils.git" 30 | }, 31 | "bugs": { 32 | "url": "https://github.com/JavadRasouli/angular2-persian-utils/issues" 33 | }, 34 | "homepage": "https://github.com/JavadRasouli/angular2-persian-utils#readme", 35 | "private": false, 36 | "dependencies": { 37 | 38 | }, 39 | "devDependencies": { 40 | "@angular/common": "^4.0.0", 41 | "@angular/compiler": "^4.0.0", 42 | "@angular/core": "^4.0.0", 43 | "@angular/cli": "1.0.1", 44 | "@angular/compiler-cli": "^4.0.0", 45 | "@types/node": "~6.0.60", 46 | "protractor": "~5.1.0", 47 | "ts-node": "~2.0.0", 48 | "copyfiles": "^1.2.0", 49 | "tslint": "~4.5.0", 50 | "typescript": "~2.2.0" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/services/national-code.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class NationalCodeService { 5 | 6 | constructor() { } 7 | 8 | isValid(nationalCode: string): boolean { 9 | return this.vlaidate(nationalCode); 10 | } 11 | 12 | private vlaidate(nationalCode: string): boolean { 13 | if (nationalCode == undefined) 14 | return false; 15 | 16 | if (nationalCode.length !== 10) 17 | return false; 18 | 19 | switch (nationalCode) { 20 | case '0000000000': 21 | case '1111111111': 22 | case '2222222222': 23 | case '3333333333': 24 | case '4444444444': 25 | case '5555555555': 26 | case '6666666666': 27 | case '7777777777': 28 | case '8888888888': 29 | case '9999999999': 30 | return false; 31 | } 32 | 33 | var c = parseInt(nationalCode.charAt(9)); 34 | var n = parseInt(nationalCode.charAt(0)) * 10 + parseInt(nationalCode.charAt(1)) * 9 + parseInt(nationalCode.charAt(2)) * 8 + parseInt(nationalCode.charAt(3)) * 7 + parseInt(nationalCode.charAt(4)) * 6 + parseInt(nationalCode.charAt(5)) * 5 + parseInt(nationalCode.charAt(6)) * 4 + parseInt(nationalCode.charAt(7)) * 3 + parseInt(nationalCode.charAt(8)) * 2; 35 | var r = n - Math.round(n / 11) * 11; 36 | 37 | if ((r == 0 && r == c) || (r == 1 && c == 1) || (r > 1 && c == 11 - r)) 38 | return true; 39 | return false; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/services/company-national-id.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class CompanyNationalIdService { 5 | 6 | constructor() { } 7 | 8 | isValid(companyNationalId: string): boolean { 9 | return this.vlaidate(companyNationalId); 10 | } 11 | 12 | private vlaidate(companyNationalId: string): boolean { 13 | if (companyNationalId == undefined) 14 | return false; 15 | 16 | if (companyNationalId.length !== 11) 17 | return false; 18 | 19 | switch (companyNationalId) { 20 | case '00000000000': 21 | case '11111111111': 22 | case '22222222222': 23 | case '33333333333': 24 | case '44444444444': 25 | case '55555555555': 26 | case '66666666666': 27 | case '77777777777': 28 | case '88888888888': 29 | case '99999999999': 30 | return false; 31 | } 32 | 33 | var addition = parseInt(companyNationalId.charAt(9)) + 2; 34 | 35 | var num1 = (parseInt(companyNationalId.charAt(0)) + addition) * 29; 36 | var num2 = (parseInt(companyNationalId.charAt(1)) + addition) * 27; 37 | var num3 = (parseInt(companyNationalId.charAt(2)) + addition) * 23; 38 | var num4 = (parseInt(companyNationalId.charAt(3)) + addition) * 19; 39 | var num5 = (parseInt(companyNationalId.charAt(4)) + addition) * 17; 40 | var num6 = (parseInt(companyNationalId.charAt(5)) + addition) * 29; 41 | var num7 = (parseInt(companyNationalId.charAt(6)) + addition) * 27; 42 | var num8 = (parseInt(companyNationalId.charAt(7)) + addition) * 23; 43 | var num9 = (parseInt(companyNationalId.charAt(8)) + addition) * 19; 44 | var num10 = (parseInt(companyNationalId.charAt(9)) + addition) * 17; 45 | var controlNum = parseInt(companyNationalId.charAt(10)); 46 | 47 | var sum = num1 + num2 + num3 + num4 + num5 + num6 + num7 + num8 + num9 + num10; 48 | var remain = sum % 11; 49 | remain = (remain === 10) ? 0 : remain; 50 | return controlNum === remain; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/services/persian-number.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { NumberToPersianWord } from './../number-to-persian-word'; 3 | 4 | @Injectable() 5 | export class PersianNumberService { 6 | 7 | constructor() { } 8 | 9 | toPersianNumber(number: number | string): string { 10 | var num = number as string; 11 | return (this.arabicNumberTopersian(this.engNumberTopersian(num))); 12 | } 13 | 14 | isPersianNumber(number: number | string): boolean { 15 | var num = number as string; 16 | 17 | var regexp = new RegExp('^[\u06F0-\u06F9]+$'); 18 | return regexp.test(num); 19 | } 20 | 21 | toEngNumber(number: string): number { 22 | var num = number as string; 23 | var engNumber = this.persianNumberToEng(num); 24 | 25 | if (isNaN(engNumber)) 26 | throw `${number} is not valid persian Number`; 27 | return engNumber; 28 | } 29 | 30 | toPersianWord(number: number | string): string { 31 | return (new NumberToPersianWord).convertNumberToString(this.toEngNumber(number as string)); 32 | } 33 | 34 | private engNumberTopersian(number: string): string { 35 | if (number == undefined) return ''; 36 | var str = number.toString().trim(); 37 | if (str === "") return ""; 38 | str = str.replace(/0/g, '۰'); 39 | str = str.replace(/1/g, '۱'); 40 | str = str.replace(/2/g, '۲'); 41 | str = str.replace(/3/g, '۳'); 42 | str = str.replace(/4/g, '۴'); 43 | str = str.replace(/5/g, '۵'); 44 | str = str.replace(/6/g, '۶'); 45 | str = str.replace(/7/g, '۷'); 46 | str = str.replace(/8/g, '۸'); 47 | str = str.replace(/9/g, '۹'); 48 | return str; 49 | } 50 | 51 | private arabicNumberTopersian(number: string): string { 52 | if (number == undefined) return ''; 53 | var str = number.toString().trim(); 54 | if (str === "") return ""; 55 | str = str.replace(/٤/g, '۴'); 56 | str = str.replace(/٥/g, '۵'); 57 | str = str.replace(/٦/g, '۶'); 58 | return str; 59 | } 60 | 61 | private persianNumberToEng(number: string): number { 62 | if (number == undefined) return NaN; 63 | var str = number.toString().trim(); 64 | var str = number.toString().trim(); 65 | if (str === "") return NaN; 66 | str = str.replace(/۰/g, '0'); 67 | str = str.replace(/۱/g, '1'); 68 | str = str.replace(/۲/g, '2'); 69 | str = str.replace(/۳/g, '3'); 70 | str = str.replace(/۴/g, '4'); 71 | str = str.replace(/۵/g, '5'); 72 | str = str.replace(/۶/g, '6'); 73 | str = str.replace(/۷/g, '7'); 74 | str = str.replace(/۸/g, '8'); 75 | str = str.replace(/۹/g, '9'); 76 | return Number(str); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": [ 3 | "node_modules/codelyzer" 4 | ], 5 | "rules": { 6 | "callable-types": true, 7 | "class-name": true, 8 | "comment-format": [ 9 | true, 10 | "check-space" 11 | ], 12 | "curly": true, 13 | "eofline": true, 14 | "forin": true, 15 | "import-blacklist": [true, "rxjs"], 16 | "import-spacing": true, 17 | "indent": [ 18 | true, 19 | "spaces" 20 | ], 21 | "interface-over-type-literal": true, 22 | "label-position": true, 23 | "max-line-length": [ 24 | true, 25 | 140 26 | ], 27 | "member-access": false, 28 | "member-ordering": [ 29 | true, 30 | "static-before-instance", 31 | "variables-before-functions" 32 | ], 33 | "no-arg": true, 34 | "no-bitwise": true, 35 | "no-console": [ 36 | true, 37 | "debug", 38 | "info", 39 | "time", 40 | "timeEnd", 41 | "trace" 42 | ], 43 | "no-construct": true, 44 | "no-debugger": true, 45 | "no-duplicate-variable": true, 46 | "no-empty": false, 47 | "no-empty-interface": true, 48 | "no-eval": true, 49 | "no-inferrable-types": [true, "ignore-params"], 50 | "no-shadowed-variable": true, 51 | "no-string-literal": false, 52 | "no-string-throw": true, 53 | "no-switch-case-fall-through": true, 54 | "no-trailing-whitespace": true, 55 | "no-unused-expression": true, 56 | "no-use-before-declare": true, 57 | "no-var-keyword": true, 58 | "object-literal-sort-keys": false, 59 | "one-line": [ 60 | true, 61 | "check-open-brace", 62 | "check-catch", 63 | "check-else", 64 | "check-whitespace" 65 | ], 66 | "prefer-const": true, 67 | "quotemark": [ 68 | true, 69 | "single" 70 | ], 71 | "radix": true, 72 | "semicolon": [ 73 | "always" 74 | ], 75 | "triple-equals": [ 76 | true, 77 | "allow-null-check" 78 | ], 79 | "typedef-whitespace": [ 80 | true, 81 | { 82 | "call-signature": "nospace", 83 | "index-signature": "nospace", 84 | "parameter": "nospace", 85 | "property-declaration": "nospace", 86 | "variable-declaration": "nospace" 87 | } 88 | ], 89 | "typeof-compare": true, 90 | "unified-signatures": true, 91 | "variable-name": false, 92 | "whitespace": [ 93 | true, 94 | "check-branch", 95 | "check-decl", 96 | "check-operator", 97 | "check-separator", 98 | "check-type" 99 | ], 100 | 101 | "directive-selector": [true, "attribute", "app", "camelCase"], 102 | "component-selector": [true, "element", "app", "kebab-case"], 103 | "use-input-property-decorator": true, 104 | "use-output-property-decorator": true, 105 | "use-host-property-decorator": true, 106 | "no-input-rename": true, 107 | "no-output-rename": true, 108 | "use-life-cycle-interface": true, 109 | "use-pipe-transform-interface": true, 110 | "component-class-suffix": true, 111 | "directive-class-suffix": true, 112 | "no-access-missing-member": true, 113 | "templates-use-public": true, 114 | "invoke-injectable": true 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /doc/PersianNumberService.md: -------------------------------------------------------------------------------- 1 | ## PersianNumberService 2 | 3 | This service provides helper for 'persian numbers'. 4 | 5 | ### Methods 6 | 7 | #### toPersianNumber(number: number | string): string 8 | 9 | This method take a "number" and convert to persian digits. 10 | ##### Example 11 | 12 | ```typescript 13 | import { Component } from '@angular/core'; 14 | 15 | import {PersianNumberService} from 'angular2-persian-utils' 16 | 17 | @Component({ 18 | selector: 'app-root', 19 | templateUrl: './app.component.html', 20 | styleUrls: ['./app.component.css'] 21 | }) 22 | export class AppComponent { 23 | 24 | constructor(private persianNumberService: PersianNumberService) { 25 | console.log(this.persianNumberService.toPersianNumber(1234567890)); //۱۲۳۴۵۶۷۸۹۰ 26 | console.log(this.persianNumberService.toPersianNumber('1234567890')); //۱۲۳۴۵۶۷۸۹۰ 27 | console.log(this.persianNumberService.toPersianNumber('۱۲۳۴۵۶۷۸۹۰')); //۱۲۳۴۵۶۷۸۹۰ 28 | console.log(this.persianNumberService.toPersianNumber('1۱2۲3۳4۴5۵6۶7۷8۸9۹0۰')); //۱۱۲۲۳۳۴۴۵۵۶۶۷۷۸۸۹۹۰۰ 29 | 30 | // Arabic number 31 | console.log(this.persianNumberService.toPersianNumber('۱۲۳٤٥٦۷۸۹۰')); ////۱۲۳۴۵۶۷۸۹۰ 32 | } 33 | } 34 | ``` 35 | 36 | #### isPersianNumber(number: number | string): boolean 37 | 38 | This method take a "number" and check it is persianDigits? 39 | 40 | ##### Example 41 | 42 | ```typescript 43 | import { Component } from '@angular/core'; 44 | 45 | import {PersianNumberService} from 'angular2-persian-utils' 46 | 47 | @Component({ 48 | selector: 'app-root', 49 | templateUrl: './app.component.html', 50 | styleUrls: ['./app.component.css'] 51 | }) 52 | export class AppComponent { 53 | 54 | constructor(private persianNumberService: PersianNumberService) { 55 | console.log(this.persianNumberService.isPersianNumber(1234567890)); // false 56 | console.log(this.persianNumberService.isPersianNumber('1234567890')); // false 57 | console.log(this.persianNumberService.isPersianNumber('1۱2۲3۳4۴5۵6۶7۷8۸9۹0۰')); // flase 58 | // Arabic number 59 | console.log(this.persianNumberService.isPersianNumber('۱۲۳٤٥٦۷۸۹۰')); // flase 60 | console.log(this.persianNumberService.isPersianNumber('۱۲۳۴۵۶۷۸۹۰')); // true 61 | } 62 | } 63 | ``` 64 | 65 | #### toEngNumber(number: string): number 66 | 67 | This method take a "number" and convert to english number? 68 | 69 | ##### Example 70 | 71 | ```typescript 72 | import { Component } from '@angular/core'; 73 | 74 | import {PersianNumberService} from 'angular2-persian-utils' 75 | 76 | @Component({ 77 | selector: 'app-root', 78 | templateUrl: './app.component.html', 79 | styleUrls: ['./app.component.css'] 80 | }) 81 | export class AppComponent { 82 | 83 | constructor(private persianNumberService: PersianNumberService) { 84 | console.log(this.persianNumberService.toEngNumber('1234567890')); // 1234567890 85 | console.log(this.persianNumberService.toEngNumber('۱۲۳۴۵۶۷۸۹۰')); // 1234567890 86 | console.log(this.persianNumberService.toEngNumber('۱۲۳٤٥٦۷۸۹۰')); // throw ۱۲۳٤٥٦۷۸۹۰ is not valid persian Number 87 | } 88 | } 89 | ``` 90 | 91 | #### toPersianWord(number: number | string): string 92 | 93 | This method take a "number" and convert to persian word. 94 | 95 | ##### Example 96 | 97 | ```typescript 98 | import { Component } from '@angular/core'; 99 | 100 | import {PersianNumberService} from 'angular2-persian-utils' 101 | 102 | @Component({ 103 | selector: 'app-root', 104 | templateUrl: './app.component.html', 105 | styleUrls: ['./app.component.css'] 106 | }) 107 | export class AppComponent { 108 | 109 | constructor(private persianNumberService: PersianNumberService) { 110 | console.log(this.persianNumberService.toPersianWord('1234567890')); // یک میلیارد و دویست و سی و چهار میلیون و پانصد و شصت و هفت هزار و هشتصد و نود 111 | console.log(this.persianNumberService.toPersianWord('۱۲۳۴۵۶۷۸۹۰')); // یک میلیارد و دویست و سی و چهار میلیون و پانصد و شصت و هفت هزار و هشتصد و نود 112 | console.log(this.persianNumberService.toPersianWord(1234567890)); // یک میلیارد و دویست و سی و چهار میلیون و پانصد و شصت و هفت هزار و هشتصد و نود 113 | console.log(this.persianNumberService.toPersianWord('۱۲۳٤٥٦۷۸۹۰')); // error: ۱۲۳٤٥٦۷۸۹۰ is not valid persian Number 114 | } 115 | } 116 | ``` 117 | 118 | ## License 119 | 120 | [`MIT`](./LICENSE.md) -------------------------------------------------------------------------------- /src/number-to-persian-word.ts: -------------------------------------------------------------------------------- 1 | export class NumberToPersianWord { 2 | // Developed By Ahmad Ahmadi 3 | // Email : Hakan648@yahoo.com 4 | // Web : DeveloperTeam.tk 5 | 6 | private s_0_9 = new Array('صفر', 'یک', 'دو', 'سه', 'چهار', 'پنج', 'شش', 'هفت', 'هشت', 'نه'); 7 | private s_10_19 = new Array('ده', 'یازده', 'دوازده', 'سیزده', 'چهارده', 'پانزده', 'شانزده', 'هفده', 'هجده', 'نوزده'); 8 | private s_20_90 = new Array('بیست', 'سی', 'چهل', 'پنجاه', 'شصت', 'هفتاد', 'هشتاد', 'نود'); 9 | private s_100_900 = new Array('صد', 'دویست', 'سیصد', 'چهارصد', 'پانصد', 'ششصد', 'هفتصد', 'هشتصد', 'نهصد'); 10 | private s_Parts = new Array('هزار', 'میلیون', 'میلیارد', 'تريليون'); 11 | private splitter = " و "; 12 | private veryBig = "تعریف نشده"; 13 | private negative = "منفی"; 14 | 15 | private getPart(numberIn3) { 16 | if (numberIn3.length > 3) 17 | return ""; 18 | 19 | var number = numberIn3.toString(); 20 | 21 | switch (number.length) { 22 | case 1: 23 | number = "00" + number; 24 | break; 25 | case 2: 26 | number = "0" + number; 27 | break; 28 | } 29 | 30 | var outString = ""; 31 | 32 | var n1 = parseInt(number.substr(0, 1)); 33 | var n2 = parseInt(number.substr(1, 1)); 34 | var n3 = parseInt(number.substr(2, 1)); 35 | 36 | if (n1 != 0) { 37 | switch (n2) { 38 | case 0: 39 | if (n3 != 0) { 40 | outString = this.s_100_900[n1 - 1] + this.splitter + this.s_0_9[n3]; 41 | } 42 | else { 43 | outString = this.s_100_900[n1 - 1]; 44 | }; 45 | break; 46 | case 1: 47 | outString = this.s_100_900[n1 - 1] + this.splitter + this.s_10_19[n3]; 48 | break; 49 | default: 50 | if (n3 != 0) { 51 | outString = this.s_100_900[n1 - 1] + this.splitter + this.s_20_90[n2 - 2] + this.splitter + this.s_0_9[n3]; 52 | } 53 | else { 54 | outString = this.s_100_900[n1 - 1] + this.splitter + this.s_20_90[n2 - 2]; 55 | } 56 | } 57 | } 58 | else { 59 | switch (n2) { 60 | case 0: 61 | if (n3 != 0) { 62 | outString = this.s_0_9[n3]; 63 | } 64 | else { 65 | outString = ""; 66 | } 67 | break; 68 | case 1: 69 | outString = this.s_10_19[n3]; 70 | break; 71 | default: 72 | if (n3 != 0) { 73 | outString = this.s_20_90[n2 - 2] + this.splitter + this.s_0_9[n3]; 74 | } 75 | else { 76 | outString = this.s_20_90[n2 - 2]; 77 | } 78 | } 79 | }; 80 | 81 | return outString; 82 | } 83 | 84 | public convertNumberToString(inputNumber) { 85 | var tempNumber = Math.abs(inputNumber).toString(); 86 | 87 | if (tempNumber.length == 0) { 88 | return ""; 89 | } 90 | 91 | if (tempNumber === "0") 92 | return this.s_0_9[0]; 93 | 94 | var partCount = Math.ceil((parseInt(tempNumber).toString().length / 3)); 95 | 96 | if (this.s_Parts.length < partCount) 97 | return this.veryBig; 98 | 99 | var partFullString = new Array(); 100 | 101 | for (var i = 0; i < partCount; i++) { 102 | var numberLength3; 103 | 104 | var lengthToSelectFirtPart; 105 | if (i == 0) { 106 | lengthToSelectFirtPart = tempNumber.length - ((partCount - 1) * 3); 107 | numberLength3 = tempNumber.substr((i * 3), lengthToSelectFirtPart); 108 | } 109 | else { 110 | numberLength3 = tempNumber.substr(lengthToSelectFirtPart + ((i - 1) * 3), 3); 111 | } 112 | 113 | var partInWord = this.getPart(numberLength3); 114 | 115 | var partIndex = (partCount - 2 - i); 116 | var partPreFix = this.s_Parts[partIndex]; 117 | 118 | if (i == partCount - 1) { 119 | partPreFix = ""; 120 | } 121 | 122 | if (i == 0) { 123 | if (partInWord != "") { 124 | partFullString[i] = partInWord + " " + partPreFix; 125 | } 126 | else { 127 | partFullString[i] = ""; 128 | } 129 | } 130 | else { 131 | if (partFullString[i - 1] != "") { 132 | if (partInWord != "") { 133 | partFullString[i] = this.splitter + partInWord + " " + partPreFix; 134 | } 135 | else { 136 | partFullString[i] = ""; 137 | } 138 | } 139 | else { 140 | if (partInWord != "") { 141 | partFullString[i] = this.splitter + partInWord + " " + partPreFix; 142 | } 143 | else { 144 | partFullString[i] = ""; 145 | } 146 | } 147 | } 148 | } 149 | 150 | var outString = ""; 151 | 152 | for (var i = 0; i < partFullString.length; i++) { 153 | outString += partFullString[i]; 154 | } 155 | 156 | if (inputNumber.toString().substr(0, 1) == "-") { 157 | outString = this.negative + " " + outString; 158 | } 159 | 160 | return outString; 161 | } 162 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Angular2PersianUtils 2 | 3 | Persian utils for Angular2 apps. 4 | 5 | ## Install 6 | 7 | ### npm 8 | 9 | ``` 10 | npm install angular2-persian-utils --save 11 | ``` 12 | 13 | ## Usage 14 | 15 | Import `PersianUtilsModule` into your app's modules: 16 | 17 | ``` typescript 18 | import {PersianUtilsModule} from 'angular2-persian-utils' 19 | 20 | @NgModule({ 21 | imports: [ 22 | PersianUtilsModule 23 | ] 24 | }) 25 | ``` 26 | 27 | This makes all the `angular2-persian-utils` services available for use in your app. 28 | 29 | ## NationalCodeService 30 | 31 | This service provides helper for 'Iranian people national code'. 32 | 33 | national code >> کد ملی 34 | 35 | ### Methods 36 | 37 | #### isValid(nationalCode: string): boolean 38 | 39 | This method take a 'nationalCode' and check it is correctly? 40 | 41 | ##### Example 42 | 43 | ```typescript 44 | import { Component } from '@angular/core'; 45 | 46 | import {NationalCodeService} from 'angular2-persian-utils' 47 | 48 | @Component({ 49 | selector: 'app-root', 50 | templateUrl: './app.component.html', 51 | styleUrls: ['./app.component.css'] 52 | }) 53 | export class AppComponent { 54 | 55 | constructor(private nationalCodeService: NationalCodeService) { 56 | var nationalCodeIsValid = nationalCodeService.isValid('1234567890')); 57 | } 58 | } 59 | ``` 60 | 61 | ## CompanyNationalIdService 62 | 63 | This service provides helper for 'company national id'. 64 | 65 | company national id >> شماره ثبت شرکت 66 | 67 | ### Methods 68 | 69 | #### isValid(companyNationalId: string): boolean 70 | 71 | This method take a 'companyNationalId' and check it is correctly? 72 | 73 | ##### Example 74 | 75 | ```typescript 76 | import { Component } from '@angular/core'; 77 | 78 | import {CompanyNationalIdService} from 'angular2-persian-utils' 79 | 80 | @Component({ 81 | selector: 'app-root', 82 | templateUrl: './app.component.html', 83 | styleUrls: ['./app.component.css'] 84 | }) 85 | export class AppComponent { 86 | 87 | constructor(private companyNationalIdService: CompanyNationalIdService) { 88 | var companyNationalIdIsValid = companyNationalIdService.isValid('12345678901')); 89 | } 90 | } 91 | ``` 92 | 93 | ## PersianNumberService 94 | 95 | This service provides helper for 'persian numbers'. 96 | 97 | ### Methods 98 | 99 | #### toPersianNumber(number: number | string): string 100 | 101 | This method take a "number" and convert to persian digits. 102 | ##### Example 103 | 104 | ```typescript 105 | import { Component } from '@angular/core'; 106 | 107 | import {PersianNumberService} from 'angular2-persian-utils' 108 | 109 | @Component({ 110 | selector: 'app-root', 111 | templateUrl: './app.component.html', 112 | styleUrls: ['./app.component.css'] 113 | }) 114 | export class AppComponent { 115 | 116 | constructor(private persianNumberService: PersianNumberService) { 117 | console.log(this.persianNumberService.toPersianNumber(1234567890)); //۱۲۳۴۵۶۷۸۹۰ 118 | console.log(this.persianNumberService.toPersianNumber('1234567890')); //۱۲۳۴۵۶۷۸۹۰ 119 | console.log(this.persianNumberService.toPersianNumber('۱۲۳۴۵۶۷۸۹۰')); //۱۲۳۴۵۶۷۸۹۰ 120 | console.log(this.persianNumberService.toPersianNumber('1۱2۲3۳4۴5۵6۶7۷8۸9۹0۰')); //۱۱۲۲۳۳۴۴۵۵۶۶۷۷۸۸۹۹۰۰ 121 | 122 | // Arabic number 123 | console.log(this.persianNumberService.toPersianNumber('۱۲۳٤٥٦۷۸۹۰')); ////۱۲۳۴۵۶۷۸۹۰ 124 | } 125 | } 126 | ``` 127 | 128 | #### isPersianNumber(number: number | string): boolean 129 | 130 | This method take a "number" and check it is persianDigits? 131 | 132 | ##### Example 133 | 134 | ```typescript 135 | import { Component } from '@angular/core'; 136 | 137 | import {PersianNumberService} from 'angular2-persian-utils' 138 | 139 | @Component({ 140 | selector: 'app-root', 141 | templateUrl: './app.component.html', 142 | styleUrls: ['./app.component.css'] 143 | }) 144 | export class AppComponent { 145 | 146 | constructor(private persianNumberService: PersianNumberService) { 147 | console.log(this.persianNumberService.isPersianNumber(1234567890)); // false 148 | console.log(this.persianNumberService.isPersianNumber('1234567890')); // false 149 | console.log(this.persianNumberService.isPersianNumber('1۱2۲3۳4۴5۵6۶7۷8۸9۹0۰')); // flase 150 | // Arabic number 151 | console.log(this.persianNumberService.isPersianNumber('۱۲۳٤٥٦۷۸۹۰')); // flase 152 | console.log(this.persianNumberService.isPersianNumber('۱۲۳۴۵۶۷۸۹۰')); // true 153 | } 154 | } 155 | ``` 156 | 157 | #### toEngNumber(number: string): number 158 | 159 | This method take a "number" and convert to english number? 160 | 161 | ##### Example 162 | 163 | ```typescript 164 | import { Component } from '@angular/core'; 165 | 166 | import {PersianNumberService} from 'angular2-persian-utils' 167 | 168 | @Component({ 169 | selector: 'app-root', 170 | templateUrl: './app.component.html', 171 | styleUrls: ['./app.component.css'] 172 | }) 173 | export class AppComponent { 174 | 175 | constructor(private persianNumberService: PersianNumberService) { 176 | console.log(this.persianNumberService.toEngNumber('1234567890')); // 1234567890 177 | console.log(this.persianNumberService.toEngNumber('۱۲۳۴۵۶۷۸۹۰')); // 1234567890 178 | console.log(this.persianNumberService.toEngNumber('۱۲۳٤٥٦۷۸۹۰')); // throw ۱۲۳٤٥٦۷۸۹۰ is not valid persian Number 179 | } 180 | } 181 | ``` 182 | 183 | #### toPersianWord(number: number | string): string 184 | 185 | This method take a "number" and convert to persian word. 186 | 187 | ##### Example 188 | 189 | ```typescript 190 | import { Component } from '@angular/core'; 191 | 192 | import {PersianNumberService} from 'angular2-persian-utils' 193 | 194 | @Component({ 195 | selector: 'app-root', 196 | templateUrl: './app.component.html', 197 | styleUrls: ['./app.component.css'] 198 | }) 199 | export class AppComponent { 200 | 201 | constructor(private persianNumberService: PersianNumberService) { 202 | console.log(this.persianNumberService.toPersianWord('1234567890')); // یک میلیارد و دویست و سی و چهار میلیون و پانصد و شصت و هفت هزار و هشتصد و نود 203 | console.log(this.persianNumberService.toPersianWord('۱۲۳۴۵۶۷۸۹۰')); // یک میلیارد و دویست و سی و چهار میلیون و پانصد و شصت و هفت هزار و هشتصد و نود 204 | console.log(this.persianNumberService.toPersianWord(1234567890)); // یک میلیارد و دویست و سی و چهار میلیون و پانصد و شصت و هفت هزار و هشتصد و نود 205 | console.log(this.persianNumberService.toPersianWord('۱۲۳٤٥٦۷۸۹۰')); // error: ۱۲۳٤٥٦۷۸۹۰ is not valid persian Number 206 | } 207 | } 208 | ``` 209 | 210 | ## PersianLettersService 211 | 212 | This service provides helper for 'persian letters'. 213 | 214 | ### Methods 215 | 216 | #### replaceArabicLettersWithPersianLetters(inputStr: string): string 217 | 218 | This method take a 'string' and replace all arabic letters with persian(e.g 'ي' and 'ك' replace with 'ی' and 'ک'). 219 | 220 | ##### Example 221 | 222 | ```typescript 223 | import { Component } from '@angular/core'; 224 | 225 | import {PersianNumberService} from 'angular2-persian-utils' 226 | 227 | @Component({ 228 | selector: 'app-root', 229 | templateUrl: './app.component.html', 230 | styleUrls: ['./app.component.css'] 231 | }) 232 | export class AppComponent { 233 | 234 | constructor(private persianNumberService: PersianNumberService) { 235 | console.log(this.persianLettersService 236 | .replaceArabicLettersWithPersianLetters( 237 | 'انگولار يك فريمورك ساختاري براي وب اپليكيشن هاي پويا است.') 238 | );// انگولار یک فریمورک ساختاری برای وب اپلیکیشن های پویا است. 239 | } 240 | } 241 | ``` 242 | 243 | ## License 244 | 245 | [`MIT`](./LICENSE.md) 246 | --------------------------------------------------------------------------------