Skip to main content

Digit Conversion

The digit conversion utilities enable seamless conversion between Persian (۰-۹), Arabic (٠-٩), and English (0-9) numeral systems.

Available Functions

English to Persian

digitsEnToFa()

Persian to English

digitsFaToEn()

Arabic to Persian

digitsArToFa()

Basic Usage

import {
  digitsEnToFa,
  digitsFaToEn,
  digitsArToFa,
  digitsArToEn,
  digitsFaToAr,
  digitsEnToAr
} from '@persian-tools/persian-tools';

English ↔ Persian Conversion

English to Persian

digitsEnToFa("1234567890");
// Output: '۱۲۳۴۵۶۷۸۹۰'

digitsEnToFa("Price: $1,250.99");
// Output: 'Price: $۱,۲۵۰.۹۹'

digitsEnToFa("Call us at 123-456-7890");
// Output: 'Call us at ۱۲۳-۴۵۶-۷۸۹۰'

Persian to English

digitsFaToEn("۱۲۳۴۵۶۷۸۹۰");
// Output: '1234567890'

digitsFaToEn("قیمت: ۱,۲۵۰,۰۰۰ تومان");
// Output: 'قیمت: 1,250,000 تومان'

digitsFaToEn("تماس: ۰۹۱۲-۳۴۵-۶۷۸۹");
// Output: 'تماس: 0912-345-6789'

Arabic ↔ Persian Conversion

Arabic to Persian

digitsArToFa("٠١٢٣٤٥٦٧٨٩");
// Output: '۰۱۲۳۴۵۶۷۸۹'

digitsArToFa("السعر: ٥٠٠ دينار");
// Output: 'السعر: ۵۰۰ دينار'

Persian to Arabic

digitsFaToAr("۰۱۲۳۴۵۶۷۸۹");
// Output: '٠١٢٣٤٥٦٧٨٩'

Arabic ↔ English Conversion

Arabic to English

digitsArToEn("٠١٢٣٤٥٦٧٨٩");
// Output: '0123456789'

English to Arabic

digitsEnToAr("0123456789");
// Output: '٠١٢٣٤٥٦٧٨٩'

Digit Mapping Reference

  • Persian Digits
  • Arabic Digits
EnglishPersian
0۰
1۱
2۲
3۳
4۴
5۵
6۶
7۷
8۸
9۹

Complex Examples

Mixed Content Processing

const mixedText = "تاریخ: 2024/03/15 - قیمت: $1,250";

// Convert all digits to Persian
const persianized = digitsEnToFa(mixedText);
console.log(persianized);
// Output: 'تاریخ: ۲۰۲۴/۰۳/۱۵ - قیمت: $۱,۲۵۰'

Phone Number Formatting

function formatPhoneNumber(phone: string, locale: "fa" | "en" = "fa") {
	// Normalize to English first
	const normalized = digitsFaToEn(digitsArToEn(phone));

	// Format based on locale preference
	return locale === "fa" ? digitsEnToFa(normalized) : normalized;
}

formatPhoneNumber("۰۹۱۲۳۴۵۶۷۸۹"); // '۰۹۱۲۳۴۵۶۷۸۹'
formatPhoneNumber("۰۹۱۲۳۴۵۶۷۸۹", "en"); // '09123456789'

Date Localization

function localizeDate(dateString: string, locale: "fa" | "en") {
	const converter = locale === "fa" ? digitsEnToFa : digitsFaToEn;
	return converter(dateString);
}

localizeDate("2024-03-15", "fa"); // '۲۰۲۴-۰۳-۱۵'
localizeDate("۱۴۰۳-۱۲-۲۵", "en"); // '1403-12-25'

Advanced Use Cases

Form Input Normalization

class NumberInputHandler {
	private normalizeInput(value: string): string {
		// Convert all digit types to English for processing
		return digitsFaToEn(digitsArToEn(value));
	}

	private formatOutput(value: string, locale: "fa" | "en" | "ar"): string {
		switch (locale) {
			case "fa":
				return digitsEnToFa(value);
			case "ar":
				return digitsEnToAr(value);
			default:
				return value;
		}
	}

	processInput(input: string, outputLocale: "fa" | "en" | "ar" = "fa") {
		const normalized = this.normalizeInput(input);
		return this.formatOutput(normalized, outputLocale);
	}
}

const handler = new NumberInputHandler();
handler.processInput("۱۲۳٤٥", "en"); // '12345'

Database Storage Strategy

interface LocalizedNumber {
	raw: string;
	normalized: string;
	persian: string;
	arabic: string;
}

function createLocalizedNumber(input: string): LocalizedNumber {
	// Always store normalized (English) version
	const normalized = digitsFaToEn(digitsArToEn(input));

	return {
		raw: input,
		normalized,
		persian: digitsEnToFa(normalized),
		arabic: digitsEnToAr(normalized),
	};
}

Performance & Optimization

  • String length: Linear O(n) complexity
  • Typical speed: ~0.1ms for 100 characters
  • Memory usage: Minimal overhead
  • No regex: Uses character mapping for speed
  • Individual import: ~1KB minified
  • All digit utilities: ~3KB minified
  • Tree-shakable: Import only what you need

Edge Cases

Empty and Invalid Input

digitsEnToFa(""); // ''
digitsEnToFa(null); // '' (graceful handling)
digitsEnToFa(undefined); // ''

Mixed Scripts

// Handles mixed content gracefully
digitsEnToFa("English 123 عربی ٤٥٦ فارسی ۷۸۹");
// Output: 'English ۱۲۳ عربی ٤٥٦ فارسی ۷۸۹'

Preserve Formatting

// Preserves all non-digit characters
digitsEnToFa("(123) 456-7890");
// Output: '(۱۲۳) ۴۵۶-۷۸۹۰'

digitsEnToFa("Amount: $1,234.56");
// Output: 'Amount: $۱,۲۳۴.۵۶'

TypeScript Support

import { digitsEnToFa } from "persian-tools";

// All functions have string input/output type safety
const result: string = digitsEnToFa("123");

// Type-safe function composition
const pipeline = (text: string): string => digitsEnToFa(digitsFaToEn(digitsArToEn(text)));

Common Patterns

Bidirectional Conversion

function createDigitConverter(targetLocale: "fa" | "en" | "ar") {
	const converters = {
		fa: digitsEnToFa,
		en: (text: string) => digitsFaToEn(digitsArToEn(text)),
		ar: digitsEnToAr,
	};

	return converters[targetLocale];
}

const toFarsi = createDigitConverter("fa");
toFarsi("123"); // '۱۲۳'

Multi-step Normalization

function normalizeAllDigits(text: string): string {
	// Convert everything to English first, then to target
	return digitsEnToFa(digitsFaToEn(digitsArToEn(text)));
}