تبدیل عدد به حروف در PHP

تبدیل عدد به حروف در PHP

در این نوشته می‌خواهیم راجب این موضوع صحبت کنیم که چطور می‌توان عدد را به حروف تبدیل کرد. در این نوشته می‌خواهیم قطعه کدی را با شما به اشتراک بگذاریم که قابلیت تبدیل به حروف برای اعداد بسیار بزرگ تا دسیلیون (یعنی 10 به توان 33) را دارد. کافی است قطعه کد پایین را کپی کرده و عدد مورد نظرتان را به عنوان پارامتر به تابع convertNumberToWords پاس بدهید تا تابع خروجی مطلوب را تولید کند. به قطعه کد زیر توجه کنید.

<?php
$words = [
    [ 
        "",
        "یک",
        "دو",
        "سه",
        "چهار",
        "پنج",
        "شش",
        "هفت",
        "هشت",
        "نه" 
    ],
	[
        "ده",
        "یازده",
        "دوازده", 
        "سیزده", 
        "چهارده", 
        "پانزده",
        "شانزده",
        "هفده",
        "هجده",
        "نوزده", 
        "بیست" 
    ],
	[ 
        "",
        "",
        "بیست",
        "سی",
        "چهل",
        "پنجاه",
        "شصت",
        "هفتاد",
        "هشتاد",
        "نود" 
    ],
    [
        "",
        "یکصد",
        "دویست",
        "سیصد",
        "چهارصد",
        "پانصد",
        "ششصد",
        "هفتصد",
        "هشتصد",
        "نهصد" 
    ],
	[
        '',
        " هزار ",
        " میلیون ",
        " میلیارد ",
        " بیلیون ",
        " بیلیارد ",
        " تریلیون ",
        " تریلیارد ",
        " کوآدریلیون ",
        " کادریلیارد ",
        " کوینتیلیون ",
        " کوانتینیارد ",
        " سکستیلیون ", 
        " سکستیلیارد ", 
        " سپتیلیون ", 
        " سپتیلیارد ", 
        " اکتیلیون ", 
        " اکتیلیارد ", 
        " نانیلیون ", 
        " نانیلیارد ", 
        " دسیلیون "
    ]
];
$splitter = " و ";
function convertNumberToWords($input) {
	global $words, $splitter;
	$zero = "صفر";
	if ($input == 0) {
		return $zero;
	}
	if (strlen($input) > 66) {
		return "خارج از محدوده";
	}
	//Split to sections
	$splittedNumber = prepareNumber($input);
	$result = [];
	$splitLength = count($splittedNumber);
	for ($i = 0; $i < $splitLength; $i++) {
		$sectionTitle = $words[4][$splitLength - ($i + 1)];
		$converted    = threeNumbersToLetter($splittedNumber[$i]);
		if ($converted !== "") {
			array_push($result, $converted . $sectionTitle);
		}
	}
	return join($splitter, $result);
}
function prepareNumber($num) {
	if (gettype($num) == "integer" || gettype($num) == "double") {
		$num = (string) $num;
	}
	$length = strlen($num) % 3;
	if ($length == 1) {
		$num = "00" . $num;
	} else if ($length == 2) {
		$num = "0" . $num;
	}
	return str_split($num, 3);
}
function threeNumbersToLetter($num) {
	global $words, $splitter;
	if ((int) preg_replace('/\D/', '', $num) == 0) {
		return "";
	}
	$parsedInt = (int) preg_replace('/\D/', '', $num);
	if ($parsedInt < 10) {
		return $words[0][$parsedInt];
	}
	if ($parsedInt <= 20) {
		return $words[1][$parsedInt - 10];
	}
	if ($parsedInt < 100) {
		$one = $parsedInt % 10;
		$ten = ($parsedInt - $one) / 10;
		if ($one > 0) {
			return $words[2][$ten] . $splitter . $words[0][$one];
		}
		return $words[2][$ten];
	}
	$one        = $parsedInt % 10;
	$hundreds   = ($parsedInt - $parsedInt % 100) / 100;
	$ten        = ($parsedInt - (($hundreds * 100) + $one)) / 10;
	$out        = [$words[3][$hundreds]];
	$secondPart = (( $ten * 10 ) + $one);
	if ($secondPart > 0) {
		if ($secondPart < 10) {
			array_push($out, $words[0][$secondPart]);
		} else if ($secondPart <= 20) {
			array_push($out, $words[1][$secondPart - 10]);
		} else {
			array_push($out, $words[2][$ten]);
			if ($one > 0) {
				array_push($out, $words[0][$one]);
			}
		}
	}
	return join($splitter, $out);
}

برای مثال خروجی قطعه کد بالا برای ورودی  “454554354570987097865433246543521134” عبارت “چهار تریلیون و پنجاه و چهار بیلیارد و پانصد و پنجاه و چهار بیلیون و سیصد و پنجاه و چهار میلیارد و پانصد و هفتاد میلیون و نود و نه هزار و سی و پنج” خواهد بود.

شاد باشید.

6 thoughts on “تبدیل عدد به حروف در PHP

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.