Преобразовать число в денежную строку

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Stas123
Сообщения: 13
Зарегистрирован: 2017.03.25, 21:12

Преобразовать число в денежную строку

Сообщение Stas123 » 2017.03.25, 21:14

Здравствуйте!

Подскажите как Преобразовать число в денежную строку.

Например как из 1800 получить Одна тысяча восемьсот рублей 00 копеек?

Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Преобразовать число в денежную строку

Сообщение Onotole » 2017.03.25, 22:01

Код: Выделить всё

Yii::$app->getFormatter()->asSpellout($value)

Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Преобразовать число в денежную строку

Сообщение Onotole » 2017.03.25, 22:03

Или

Код: Выделить всё

\Yii::t('app', '{n, spellout}', ['n' => $value]);

Stas123
Сообщения: 13
Зарегистрирован: 2017.03.25, 21:12

Re: Преобразовать число в денежную строку

Сообщение Stas123 » 2017.03.26, 16:49

В api Yii нет таких методов

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Преобразовать число в денежную строку

Сообщение zelenin » 2017.03.26, 16:57

упс, о первом yii речь

Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Преобразовать число в денежную строку

Сообщение Onotole » 2017.03.26, 21:32

упс так упс

Аватара пользователя
za4me
Сообщения: 152
Зарегистрирован: 2016.06.26, 15:29
Контактная информация:

Re: Преобразовать число в денежную строку

Сообщение za4me » 2017.03.27, 10:22

Вам это необходимо преобразование перед каким-то выводом или перед сохранением?

Stas123
Сообщения: 13
Зарегистрирован: 2017.03.25, 21:12

Re: Преобразовать число в денежную строку

Сообщение Stas123 » 2017.03.27, 17:05

Без разницы

Stas123
Сообщения: 13
Зарегистрирован: 2017.03.25, 21:12

Re: Преобразовать число в денежную строку

Сообщение Stas123 » 2017.03.27, 19:12

нашел в интернете, если кому интересно.

Код: Выделить всё

<?php
class NumberToWords{
	
	public function num2str($num) {
		$nul='ноль';
		$ten=array(
			array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),
			array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять'),
		);
		$a20=array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать' ,'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать');
		$tens=array(2=>'двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят' ,'восемьдесят','девяносто');
		$hundred=array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот','восемьсот','девятьсот');
		$unit=array(
			array('копейка' ,'копейки' ,'копеек',	 1),
			array('рубль'   ,'рубля'   ,'рублей'    ,0),
			array('тысяча'  ,'тысячи'  ,'тысяч'     ,1),
			array('миллион' ,'миллиона','миллионов' ,0),
			array('миллиард','милиарда','миллиардов',0),
		);
		//
		list($rub,$kop) = explode('.',sprintf("%015.2f", floatval($num)));
		$out = array();
		if (intval($rub)>0) {
			foreach(str_split($rub,3) as $uk=>$v) { // by 3 symbols
				if (!intval($v)) continue;
				$uk = sizeof($unit)-$uk-1; // unit key
				$gender = $unit[$uk][3];
				list($i1,$i2,$i3) = array_map('intval',str_split($v,1));
				// mega-logic
				$out[] = $hundred[$i1]; # 1xx-9xx
				if ($i2>1) $out[]= $tens[$i2].' '.$ten[$gender][$i3]; # 20-99
				else $out[]= $i2>0 ? $a20[$i3] : $ten[$gender][$i3]; # 10-19 | 1-9
				// units without rub & kop
				if ($uk>1) $out[]= $this->morph($v,$unit[$uk][0],$unit[$uk][1],$unit[$uk][2]);
			} //foreach
		}
		else $out[] = $nul;
		$out[] = $this->morph(intval($rub), $unit[1][0],$unit[1][1],$unit[1][2]); // rub
		$out[] = $kop.' '.$this->morph($kop,$unit[0][0],$unit[0][1],$unit[0][2]); // kop
		return mb_strtoupper(trim(preg_replace('/ {2,}/', ' ', join(' ',$out))));
	}

	/**
	 * Склоняем словоформу
	 * @ author runcore
	 */
	public function morph($n, $f1, $f2, $f5) {
		$n = abs(intval($n)) % 100;
		if ($n>10 && $n<20) return $f5;
		$n = $n % 10;
		if ($n>1 && $n<5) return $f2;
		if ($n==1) return $f1;
		return $f5;
	}
}


Ответить