Skip to the content.

Usage Guide

Complete guide to using Persian Utils library.

← Back to Documentation Home

Table of Contents


Jalali Date

The JalaliDate class provides a complete implementation of the Persian (Jalali/Shamsi) calendar system.

Includes conversion, formatting, parsing, holidays, ranges, and temporal operations.

Creating Dates

// Current date
JalaliDate today = JalaliDate.now();
JalaliDate todayInZone = JalaliDate.now(ZoneId.of("Asia/Tehran"));

// From year, month, day
JalaliDate date = JalaliDate.of(1404, 1, 1);

// From day of year
JalaliDate date = JalaliDate.ofYearDay(1404, 1); // First day of year

// Convenience methods
JalaliDate yesterday = JalaliDate.yesterday();
JalaliDate tomorrow = JalaliDate.tomorrow();

Parsing Dates

// Auto-detect format
JalaliDate date = JalaliDate.parse("1404/01/01");

// Specific format
JalaliDate date = JalaliDate.parse("1404-01-01", DateFormat.ISO);
JalaliDate date = JalaliDate.parseIso("1404-01-01");
JalaliDate date = JalaliDate.parsePersian("01/01/1404");

Conversion Between Calendars

// Gregorian to Jalali
LocalDate gregorian = LocalDate.of(2025, 9, 21);
JalaliDate jalali = JalaliDate.fromGregorian(gregorian);

// Or directly
JalaliDate jalali = JalaliDate.fromGregorian(2025, 9, 21);

// Jalali to Gregorian
LocalDate gregorian = jalali.toGregorian();

// To LocalDateTime
LocalDateTime dateTime = jalali.atStartOfDay();
LocalDateTime dateTime = jalali.atTime(14, 30);
LocalDateTime dateTime = jalali.atTime(14, 30, 0);

Date Arithmetic

JalaliDate date = JalaliDate.of(1404, 1, 1);

// Add/subtract days
JalaliDate tomorrow = date.plusDays(1);
JalaliDate yesterday = date.minusDays(1);

// Add/subtract weeks
JalaliDate nextWeek = date.plusWeeks(1);
JalaliDate lastWeek = date.minusWeeks(1);

// Add/subtract months
JalaliDate nextMonth = date.plusMonths(1);
JalaliDate lastMonth = date.minusMonths(1);

// Add/subtract years
JalaliDate nextYear = date.plusYears(1);
JalaliDate lastYear = date.minusYears(1);

// Using Period
JalaliDate future = date.plus(Period.of(1, 2, 15)); // 1 year, 2 months, 15 days

Date Comparison

JalaliDate date1 = JalaliDate.of(1404, 1, 1);
JalaliDate date2 = JalaliDate.of(1404, 6, 15);

// Comparison
boolean before = date1.isBefore(date2);
boolean after = date1.isAfter(date2);
boolean beforeOrEqual = date1.isBeforeOrEqual(date2);
boolean afterOrEqual = date1.isAfterOrEqual(date2);

// Calculate differences
long days = date1.daysUntil(date2);
long weeks = date1.weeksUntil(date2);
long months = date1.monthsUntil(date2);
long years = date1.yearsUntil(date2);

// Get complete period
Period period = date1.periodUntil(date2);

Date Formatting

JalaliDate date = JalaliDate.of(1404, 1, 1);

// ISO format
String iso = date.toIso(); // 1404-01-01

// Different formats
String full = date.format(DateFormat.FULL);     // شنبه ۱ فروردین ۱۴۰۴
String long_ = date.format(DateFormat.LONG);    // ۱ فروردین ۱۴۰۴
String medium = date.format(DateFormat.MEDIUM); // ۱ فرو ۱۴۰۴
String short_ = date.format(DateFormat.SHORT);  // 01/01/00
String persian = date.format(DateFormat.PERSIAN); // 01/01/1404

// With locale
String formatted = date.format(DateFormat.FULL, Locale.forLanguageTag("fa"));

Date Properties

JalaliDate date = JalaliDate.of(1404, 1, 15);

// Get components
int year = date.getYear();
int month = date.getMonth();
int day = date.getDay();

// Get names
String monthName = date.getMonthName();        // Farvardin
String monthNamePersian = date.getMonthName(true); // فروردین
String weekday = date.getWeekdayName();        // Yekshanbe
String weekdayPersian = date.getWeekdayName(true); // یکشنبه

// Other properties
int dayOfYear = date.getDayOfYear();
int weekOfYear = date.getWeekOfYear();
int quarter = date.getQuarter();
DayOfWeek dayOfWeek = date.dayOfWeek();
int lengthOfMonth = date.lengthOfMonth();
int lengthOfYear = date.lengthOfYear();
boolean isLeap = date.isLeapYear();

Date Adjusters

JalaliDate date = JalaliDate.of(1404, 6, 15);

// Change components
JalaliDate newDate = date.withYear(1404);
JalaliDate newDate = date.withMonth(1);
JalaliDate newDate = date.withDayOfMonth(1);

// First and last days
JalaliDate firstDay = date.firstDayOfMonth();
JalaliDate lastDay = date.lastDayOfMonth();
JalaliDate firstDayOfYear = date.firstDayOfYear();
JalaliDate lastDayOfYear = date.lastDayOfYear();

// Next month/year
JalaliDate nextMonth = date.firstDayOfNextMonth();
JalaliDate nextYear = date.firstDayOfNextYear();

Holidays

JalaliDate date = JalaliDate.of(1404, 1, 1);

// Check if holiday
boolean isHoliday = date.isHoliday();

// Get holiday name
String holidayName = date.getHolidayName(); // "Nowruz"

// Get all holidays in a year
List<JalaliDate> holidays = JalaliDate.getHolidaysInYear(1400);

// Weekend checking
boolean isWeekend = date.isWeekend(); // Friday or Thursday
boolean isWeekday = date.isWeekday();

Working Days

JalaliDate date = JalaliDate.of(1404, 1, 13); // Sizdah Bedar (holiday)

// Next working day (skip weekends and holidays)
JalaliDate nextWork = date.nextWorkingDay();

// Previous working day
JalaliDate prevWork = date.previousWorkingDay();

Date Ranges

JalaliDate start = JalaliDate.of(1404, 1, 1);
JalaliDate end = JalaliDate.of(1404, 1, 31);

// Create range
JalaliDate.JalaliDateRange range = JalaliDate.between(start, end);

// Check if contains
boolean contains = range.contains(JalaliDate.of(1404, 1, 15));

// Get number of days
long days = range.getDays();

// Iterate
List<JalaliDate> dates = range.toList();
range.stream().forEach(date -> System.out.println(date));

Date Streams

JalaliDate start = JalaliDate.of(1404, 1, 1);
JalaliDate end = JalaliDate.of(1404, 12, 29);

// Stream of dates (daily)
start.datesUntil(end)
     .forEach(date -> System.out.println(date));

// Stream with custom step
start.datesUntil(end, Period.ofDays(7))  // Weekly
     .forEach(date -> System.out.println(date));

start.datesUntil(end, Period.ofMonths(1)) // Monthly
     .forEach(date -> System.out.println(date));

Builder Pattern

JalaliDate date = JalaliDate.builder()
    .year(1400)
    .month(1)
    .day(1)
    .build();

// From Gregorian
JalaliDate date = JalaliDate.builder()
    .fromGregorian(LocalDate.of(2025, 3, 21))
    .build();

Number Utilities

Digit Conversion

Convert between Persian (۰-۹), Arabic (٠-٩), and English (0-9) numerals. Converts numbers and digits between Persian/Farsi, Arabic, and English numeral systems.

// English to Persian
String persian = PersianNumberConverter.toPersianDigits("1234");
// Output: ۱۲۳۴

// Persian to English
String english = PersianNumberConverter.toEnglishDigits("۱۲۳۴");
// Output: 1234

// Arabic to Persian
String persian = PersianNumberConverter.toArabicDigits("1234");
// Output: ١٢٣٤

// Convert all to Persian (handles mixed)
String persian = PersianNumberConverter.convertAllToPersian("123 و ۴۵۶");
// Output: ۱۲۳ و ۴۵۶

// Single digit conversion
char persianDigit = PersianNumberConverter.toPersianDigit('5');
// Output: ۵

Number to Persian Digits

// Convert numbers to Persian
String persian = PersianNumberConverter.toPersianNumber(1234);
// Output: ۱۲۳۴

String persian = PersianNumberConverter.toPersianNumber(1234567L);
// Output: ۱۲۳۴۵۶۷

String persian = PersianNumberConverter.toPersianNumber(123.45);
// Output: ۱۲۳٫۴۵

Parsing Persian Numbers

// Parse to integers
int number = PersianNumberConverter.parseInteger("۱۲۳۴");
// Output: 1234

long number = PersianNumberConverter.parseLong("۱۲۳۴۵۶۷");
// Output: 1234567

double number = PersianNumberConverter.parseDouble("۱۲۳٫۴۵");
// Output: 123.45

Number to Words

Converts numbers to their word representation in Persian (Farsi) and English. Supports whole numbers, decimals, negative numbers, and currency formatting.

// Persian words
String words = NumberToWords.toPersian(123);
// Output: یکصد و بیست و سه

String words = NumberToWords.toPersian(1000);
// Output: یک هزار

String words = NumberToWords.toPersian(1234567);
// Output: یک میلیون و دویست و سی و چهار هزار و پانصد و شصت و هفت

// Decimal numbers
String words = NumberToWords.toPersian(123.45);
// Output: یکصد و بیست و سه ممیز چهار پنج

// Negative numbers
String words = NumberToWords.toPersian(-123);
// Output: منفی یکصد و بیست و سه

// BigDecimal support
BigDecimal number = new BigDecimal("123456789.12");
String words = NumberToWords.toPersian(number);

English Words

String words = NumberToWords.toEnglish(123);
// Output: one hundred twenty three

String words = NumberToWords.toEnglish(1000000);
// Output: one million

Currency Formatting

// Persian currency
String currency = NumberToWords.toPersianCurrency(50000, NumberToWords.TOMAN);
// Output: پنجاه هزار تومان

String currency = NumberToWords.toPersianCurrency(100000, NumberToWords.RIAL);
// Output: یکصد هزار ریال

// With decimals
String currency = NumberToWords.toPersianCurrency(50000.50, NumberToWords.TOMAN);
// Output: پنجاه هزار تومان و پنجاه ریال

// English currency
String currency = NumberToWords.toEnglishCurrency(100, NumberToWords.DOLLAR);
// Output: one hundred dollars

String currency = NumberToWords.toEnglishCurrency(99.99, NumberToWords.DOLLAR);
// Output: ninety nine dollars and ninety nine cents

Number Formatting

Utility class for formatting numbers with separators and removing separators from formatted numbers. Supports various separator styles including English comma, Persian comma, space, and custom separators.

// Add thousand separators
String formatted = NumberFormatter.addSeparator(1234567);
// Output: 1,234,567

// Persian separator
String formatted = NumberFormatter.addPersianSeparator(1234567);
// Output: ۱٬۲۳۴٬۵۶۷

// With different separator styles
String formatted = NumberFormatter.addSeparator(1234567, 
    NumberFormatter.SeparatorStyle.SPACE);
// Output: 1 234 567

Advanced Formatting

// Create custom configuration
NumberFormatter.FormatConfig config = new NumberFormatter.FormatConfig()
    .withStyle(NumberFormatter.SeparatorStyle.PERSIAN)
    .withPersianDigits(true)
    .withDecimalPlaces(2)
    .withPrefix("قیمت: ")
    .withSuffix(" ریال")
    .withPositiveSign(false);

String formatted = NumberFormatter.format(1234567.89, config);
// Output: قیمت: ۱٬۲۳۴٬۵۶۷٫۸۹ ریال

// Pre-configured formats
String formatted = NumberFormatter.format(1234, NumberFormatter.PERSIAN_FORMAT);
String formatted = NumberFormatter.format(1234.56, NumberFormatter.CURRENCY_FORMAT);

Currency Formatting

// Format as currency
String price = NumberFormatter.formatCurrency(1500.50, "USD");
// Output: $1,500.50

String price = NumberFormatter.formatCurrency(1500.50, "IRR");
// Output: ۱٬۵۰۱ ریال

String price = NumberFormatter.formatCurrency(1500000, "IRT");
// Output: ۱٬۵۰۰٬۰۰۰ تومان

Percentage Formatting

String percent = NumberFormatter.formatPercentage(75.5, 1);
// Output: 75.5%

String percent = NumberFormatter.formatPercentage(0.755, 2);
// Output: 0.76%

Remove Separators and Parse

// Remove separators
String clean = NumberFormatter.removeSeparator("1,234,567");
// Output: 1234567

String clean = NumberFormatter.removeSeparator("۱٬۲۳۴٬۵۶۷");
// Output: 1234567

// Parse formatted numbers
long number = NumberFormatter.parseLong("1,234,567");
// Output: 1234567

double number = NumberFormatter.parseDouble("۱٬۲۳۴٫۵۶");
// Output: 1234.56

BigDecimal number = NumberFormatter.parseBigDecimal("1,234,567.89");
// Output: 1234567.89

Ordinal Numbers

Converts numbers to their ordinal representation in Persian and English. Examples: 1st, 2nd, 3rd in English | اول، دوم، سوم in Persian

// Persian ordinals
String first = OrdinalNumbers.toPersianOrdinal(1);
// Output: اول

String second = OrdinalNumbers.toPersianOrdinal(2);
// Output: دوم

String twentyFirst = OrdinalNumbers.toPersianOrdinal(21);
// Output: بیست و یکم

// Format with digits
String formatted = OrdinalNumbers.formatPersianOrdinal(21);
// Output: ۲۱م

// English ordinals
String first = OrdinalNumbers.toEnglishOrdinal(1);
// Output: first

String twentyFirst = OrdinalNumbers.toEnglishOrdinal(21);
// Output: twenty-first

// Ordinal suffix
String suffix = OrdinalNumbers.getEnglishOrdinalSuffix(21);
// Output: st

String formatted = OrdinalNumbers.formatEnglishOrdinal(21);
// Output: 21st

Text Processing

Persian Text Detection

Comprehensive utilities for Persian/Farsi text processing, validation, and manipulation. Handles Persian character detection, Arabic to Persian conversion, text normalization, and more.

// Check if contains Persian
boolean hasPersian = PersianTextUtils.containsPersian("سلام");
// Output: true

boolean hasPersian = PersianTextUtils.containsPersian("Hello");
// Output: false

// Check if entirely Persian
boolean isPersian = PersianTextUtils.isPersian("سلام دنیا");
// Output: true

// Strict Persian check
boolean isPersian = PersianTextUtils.isPersianStrict("سلام", true, true);

Text Normalization

// Convert Arabic characters to Persian
String normalized = PersianTextUtils.arabicToPersian("كتاب");
// Output: کتاب

// Full normalization (Arabic to Persian + remove diacritics + cleanup)
String normalized = PersianTextUtils.normalize("كِتابٌ");
// Output: کتاب

// Remove diacritics only
String clean = PersianTextUtils.removeDiacritics("کِتاب");
// Output: کتاب

// Remove zero-width characters
String clean = PersianTextUtils.removeZeroWidthChars("سلام‌دنیا");

Character Type Detection

// Check character types
boolean isLetter = PersianTextUtils.isPersianLetter('س');
boolean isDigit = PersianTextUtils.isPersianDigit('۵');
boolean isPunctuation = PersianTextUtils.isPersianPunctuation('،');
boolean isPersianChar = PersianTextUtils.isPersianChar('س');

Text Statistics

String text = "این یک متن نمونه است با کمی English mixed in.";

PersianTextUtils.PersianTextStats stats = 
    new PersianTextUtils.PersianTextStats(text);

int totalChars = stats.getTotalChars();
int persianChars = stats.getPersianChars();
int englishChars = stats.getEnglishChars();
int persianWords = stats.getPersianWords();
double persianPercent = stats.getPersianPercentage();
PersianTextUtils.TextDirection direction = stats.getDirection();

System.out.println(stats.toString());
// Output: Total: X chars, Persian: Y (Z%), English: W, Persian words: V, Direction: RTL

Text Direction

// Detect text direction
PersianTextUtils.TextDirection dir = 
    PersianTextUtils.getTextDirection("سلام");
// Output: RTL

PersianTextUtils.TextDirection dir = 
    PersianTextUtils.getTextDirection("Hello");
// Output: LTR

// Check for mixed content
boolean isMixed = PersianTextUtils.isMixedPersianEnglish("سلام World");
// Output: true

Extract Persian Content

// Extract Persian words
List<String> words = PersianTextUtils.extractPersianWords("سلام World دنیا");
// Output: ["سلام", "دنیا"]

// Count Persian characters
int count = PersianTextUtils.countPersianChars("سلام World");
// Output: 4

// Get Persian percentage
double percent = PersianTextUtils.getPersianPercentage("سلام World");
// Output: ~50.0

URL Slug Generation

// Create Persian-friendly URL slug
String slug = PersianTextUtils.toPersianSlug("سلام دنیا");
// Output: سلام-دنیا

String slug = PersianTextUtils.toPersianSlug("عنوان مقاله من!");
// Output: عنوان-مقاله-من

Directional Marks

// Add RTL mark
String rtl = PersianTextUtils.addRLM("متن فارسی");

// Add LRM mark
String ltr = PersianTextUtils.addLRM("English text");

// Add ZWNJ
String text = PersianTextUtils.addZWNJ("می خواهم", 2);

Fix Persian Typing

// Fix common Persian typing issues
String fixed = PersianTextUtils.fixPersianTyping("سلام،چطوري؟");
// Output: سلام، چطوری؟

// Handles:
// - Arabic to Persian conversion
// - Spacing around punctuation
// - Quotation marks

Validation

National ID (کد ملی)

Validator and utilities for Iranian National ID (کد ملی). Implements the official check digit algorithm for 10-digit national IDs.

// Simple validation
boolean isValid = IranianNationalId.isValid("0499370899");

// Get detailed information
IranianNationalId.NationalIdInfo info = 
    new IranianNationalId.NationalIdInfo("0499370899");

if (info.isValid()) {
    String provinceCode = info.getProvinceCode(); // 049
    String provinceName = info.getProvinceName(); // تهران
    String formatted = info.getFormatted();       // 049-937089-9
    String persianFormat = info.getFormattedPersian(); // ۰۴۹-۹۳۷۰۸۹-۹
}

// Format national ID
String formatted = IranianNationalId.format("0499370899");
// Output: 049-937089-9

// Normalize (clean up)
String normalized = IranianNationalId.normalize("049-937089-9");
// Output: 0499370899

// Batch validation
List<String> ids = Arrays.asList("0499370899", "1234567890");
Map<String, Boolean> results = IranianNationalId.validateBatch(ids);

// Generate test ID (for development only)
String testId = IranianNationalId.generateTestId("049", "937089");
// Output: 0499370899

IBAN/SHEBA

Validator and utilities for Iranian IBAN (SHEBA - شماره شبا). Implements the IBAN mod-97 check digit algorithm for Iranian bank accounts.

// Simple validation
boolean isValid = IranianIban.isValid("IR820540102680020817909002");

// Get detailed information
IranianIban.IbanInfo info = 
    new IranianIban.IbanInfo("IR820540102680020817909002");

if (info.isValid()) {
    String bankCode = info.getBankCode();
    IranianIban.BankInfo bank = info.getBankInfo();
    String bankName = bank.getPersianName();      // بانک پارسیان
    String bankNameEn = bank.getEnglishName();    // Bank Parsian
    String accountNumber = info.getAccountNumber();
    String formatted = info.getFormatted();
    // Output: IR82 0540 1026 8002 0817 9090 02
}

// Format IBAN
String formatted = IranianIban.format("IR820540102680020817909002");
String compact = IranianIban.formatCompact("IR82 0540 1026 8002 0817 9090 02");

// Normalize
String normalized = IranianIban.normalize("IR82 0540 1026 8002 0817 9090 02");

// Get bank info
IranianIban.BankInfo bank = IranianIban.getBankInfo("IR820540102680020817909002");

// Generate IBAN
String iban = IranianIban.generateIban("054", "0102680020817909002");

// Calculate check digits
String checkDigits = IranianIban.calculateCheckDigits("054", "0102680020817909002");

// Search banks
List<IranianIban.BankInfo> banks = IranianIban.searchBanks("پارسیان");

// Persian format
String persianIban = IranianIban.toPersian("IR820540102680020817909002");

Phone Numbers

Validator and utilities for Iranian phone numbers (mobile and landline). Supports operator identification, area codes, and various formatting options.

// Simple validation
boolean isValid = IranianPhoneValidator.isValid("09123456789");
boolean isMobile = IranianPhoneValidator.isValidMobile("09123456789");
boolean isLandline = IranianPhoneValidator.isValidLandline("02188776655");

// Get detailed information
IranianPhoneValidator.PhoneInfo info = 
    new IranianPhoneValidator.PhoneInfo("09123456789");

if (info.isValid()) {
    boolean isMobile = info.isMobile();
    IranianPhoneValidator.OperatorInfo operator = info.getOperator();
    String operatorName = operator.getPersianName(); // همراه اول
    String formatted = info.getFormatted();          // 0912-345-6789
    String international = info.getInternational();  // +98 912 345 6789
}

// Format phone numbers
String dashed = IranianPhoneValidator.PhoneFormatter.formatDashed("09123456789");
// Output: 0912-345-6789

String spaced = IranianPhoneValidator.PhoneFormatter.formatSpaced("09123456789");
// Output: 0912 345 6789

String international = IranianPhoneValidator.PhoneFormatter.formatInternational("09123456789");
// Output: +98 912 345 6789

String persian = IranianPhoneValidator.PhoneFormatter.formatPersian("09123456789");
// Output: ۰۹۱۲ ۳۴۵ ۶۷۸۹

// Get operator
IranianPhoneValidator.OperatorInfo operator = 
    IranianPhoneValidator.getOperator("09123456789");

// Get city for landline
String city = IranianPhoneValidator.getCityName("02188776655");

// Emergency numbers
boolean isEmergency = IranianPhoneValidator.isEmergencyNumber("110");

// Normalize
String normalized = IranianPhoneValidator.normalizePhoneNumber("+989123456789");

Postal Codes

Validator and utilities for Iranian postal codes (کد پستی). Iranian postal codes are 10 digits where the first 5 digits represent the region/city and the last 5 digits represent the specific area/street/building.

// Simple validation
boolean isValid = IranianPostalCode.isValid("1234567890");

// Get detailed information
IranianPostalCode.PostalCodeInfo info = 
    new IranianPostalCode.PostalCodeInfo("1234567890");

if (info.isValid()) {
    String regionCode = info.getRegionCode();      // 12345
    String localCode = info.getLocalCode();        // 67890
    String provinceName = info.getPostalCodeRange().getProvincePersian();
    String cityName = info.getPostalCodeRange().getCityPersian();
    String formatted = info.getFormatted();        // 12345-67890
    String persianFormat = info.getFormattedPersian(); // ۱۲۳۴۵-۶۷۸۹۰
}

// Format postal code
String formatted = IranianPostalCode.format("1234567890");
// Output: 12345-67890

// Normalize
String normalized = IranianPostalCode.normalize("12345-67890");

// Get province/city
String province = IranianPostalCode.getProvinceName("1234567890");
String city = IranianPostalCode.getCityName("1234567890");

// Search
List<IranianPostalCode.PostalCodeRange> results = 
    IranianPostalCode.search("تهران");

// Get all provinces
List<String> provinces = IranianPostalCode.getAllProvinces();

// Get cities in province
List<String> cities = IranianPostalCode.getCitiesInProvince("تهران");

// Statistics
Map<String, Integer> distribution = 
    IranianPostalCode.getProvinceDistribution(postalCodes);

ATM Cards

Validator and utilities for ATM/Debit cards with Iranian bank card support. Implements the Luhn algorithm for card number validation and provides BIN identification.

// Simple validation
boolean isValid = AtmCardValidator.isValid("6037701689095443");

// Get detailed information
AtmCardValidator.CardInfo info = 
    new AtmCardValidator.CardInfo("6037701689095443");

if (info.isValid()) {
    String bin = info.getBin();                    // 603770
    AtmCardValidator.CardIssuerInfo issuer = info.getIssuer();
    String bankName = issuer.getPersianName();     // بانک کشاورزی
    String formatted = info.getFormatted();        // 6037-7016-8909-5443
    String masked = info.getMasked();              // 6037-****-****-5443
}

// Format card number
String formatted = AtmCardValidator.format("6037701689095443");
// Output: 6037-7016-8909-5443

String spaced = AtmCardValidator.formatWithSpaces("6037701689095443");
// Output: 6037 7016 8909 5443

// Mask card number
String masked = AtmCardValidator.mask("6037701689095443");
// Output: 6037-****-****-5443

// Get BIN
String bin = AtmCardValidator.getBin("6037701689095443");

// Get issuer
AtmCardValidator.CardIssuerInfo issuer = 
    AtmCardValidator.getCardIssuer("6037701689095443");

// Check if Iranian card
boolean isIranian = AtmCardValidator.isIranianCard("6037701689095443");

// Validate CVV2
boolean validCvv = AtmCardValidator.isValidCvv2("123");

// Validate expiry
boolean validExpiry = AtmCardValidator.isValidExpiry("12/25");

// Check if expired
boolean expired = AtmCardValidator.isExpired(12, 2020);

// Generate test card (for development only)
String testCard = AtmCardValidator.generateTestCard("603770", "168909544");

// Search issuers
List<AtmCardValidator.CardIssuerInfo> issuers = 
    AtmCardValidator.searchIssuers("کشاورزی");

// Persian format
String persian = AtmCardValidator.toPersianFormat("6037701689095443");

File Size Formatting

Formats file sizes in Persian with appropriate units. Supports both binary (1024) and decimal (1000) modes with Persian translations.

Examples: 1024 → “۱ کیلوبایت”, 1048576 → “۱ مگابایت”

// Simple formatting
String size = PersianFileSizeFormatter.format(1536);
// Output: ۱٫۵ کیلوبایت

String size = PersianFileSizeFormatter.format(1048576);
// Output: ۱ مگابایت

// Human-readable (automatic precision)
String size = PersianFileSizeFormatter.formatHumanReadable(1536000);
// Output: ۱٫۵ مگابایت

// With different modes
String binary = PersianFileSizeFormatter.format(1024, 
    PersianFileSizeFormatter.SizeMode.BINARY);
// Output: ۱ کیلوبایت

String decimal = PersianFileSizeFormatter.format(1000,
    PersianFileSizeFormatter.SizeMode.DECIMAL);
// Output: ۱ کیلوبایت

// With words
String words = PersianFileSizeFormatter.formatWithWords(1024);
// Output: یک کیلوبایت

// Custom formatting
String formatted = PersianFileSizeFormatter.format(
    1536,
    PersianFileSizeFormatter.SizeMode.BINARY,
    PersianFileSizeFormatter.NumberStyle.NUMERIC,
    PersianFileSizeFormatter.UnitStyle.FULL,
    2  // decimal places
);

// Parse
long bytes = PersianFileSizeFormatter.parse("۱٫۵ کیلوبایت");

// Common conversions
String kb = PersianFileSizeFormatter.Common.formatKilobytes(1024);
String mb = PersianFileSizeFormatter.Common.formatMegabytes(1);
String gb = PersianFileSizeFormatter.Common.formatGigabytes(1);

Relative Time

Format time differences in Persian relative expressions.

Examples: “۵ دقیقه پیش”, “۲ روز پیش”, “چند لحظه پیش”

```java // Format from JalaliDate JalaliDate yesterday = JalaliDate.yesterday(); String relative = PersianRelativeTimeFormatter.formatRelativeTime(yesterday); // Output: یک روز پیش

// Format from LocalDateTime LocalDateTime now = LocalDateTime.now(); LocalDateTime past = now.minusHours(2); String relative = PersianRelativeTimeFormatter.formatRelativeTime(now, past); // Output: دو ساعت پیش

// Format from seconds String relative = PersianRelativeTimeFormatter.formatSecondsAgo(3600); // Output: یک ساعت پیش

// Future time String relative = PersianRelativeTimeFormatter.formatSecondsInFuture(7200); // Output: دو ساعت دیگر

// Different styles String numeric = PersianRelativeTimeFormatter.formatSecondsAgo(300, PersianRelativeTimeFormatter.FormatStyle.NUMERIC); // Output: ۵ دقیقه پیش

String words = PersianRelativeTimeFormatter.formatSecondsAgo(300, PersianRelativeTimeFormatter.FormatStyle.WORDS); // Output: پنج دقیقه پیش

String fuzzy = PersianRelativeTimeFormatter.formatSecondsAgo(300, PersianRelativeTimeFormatter.FormatStyle.FUZZY); // Output: چند دقیقه پیش

String short_ = PersianRelativeTimeFormatter.formatSecondsAgo(300, PersianRelativeTimeFormatter.FormatStyle.SHORT); // Output: ۵د پیش

// Common expressions String now = PersianRelativeTimeFormatter.Common.justNow(); String fewSeconds = PersianRelativeTimeFormatter.Common.fewSecondsAgo(); String oneMinute = PersianRelativeTimeFormatter.Common.oneMinuteAgo(); String yesterday = PersianRelativeTimeFormatter.Common.yesterday(); String tomorrow = PersianRelativeTimeFormatter.Common.tomorrow(); ```


← Back to Documentation Home API Reference →