Показать сообщение отдельно
  #8 (permalink)  
Старый 17.11.2013, 21:20
Новичок на форуме
Отправить личное сообщение для ovsyannikov Посмотреть профиль Найти все сообщения от ovsyannikov
 
Регистрация: 17.11.2013
Сообщений: 1

"Допилил" фунцию, которую сам же писал еще 4 года назад. Функция, которая в первом сообщении Сумма прописью

Спасибо BSI, исправил его замечания:
Цитата:
Ошибки можно выявить на суммах:12 рублей, 12 000.00, 2 000 000.00, 12 000 001,00 и т.д.
Заодно добавил prototype на всякий случай. Поучилось так:

function numberToString(_number, toUpper) {
	var toUpper = toUpper || false;
	var _arr_numbers = new Array();
	_arr_numbers[1] = new Array('', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять', 'десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать');
	_arr_numbers[2] = new Array('', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто');
	_arr_numbers[3] = new Array('', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот');
	function number_parser(_num, _desc) {
		var _string = '';
		var _num_hundred = '';
		if (_num.length == 3) {
			_num_hundred = _num.substr(0, 1);
			_num = _num.substr(1, 3);
			_string = _arr_numbers[3][_num_hundred] + ' ';
		}
		if (_num < 20) _string += _arr_numbers[1][parseFloat(_num)] + ' ';
		else {
			var _first_num = _num.substr(0, 1);
			var _second_num = _num.substr(1, 2);
			_string += _arr_numbers[2][_first_num] + ' ' + _arr_numbers[1][_second_num] + ' ';
		}	      
		switch (_desc){
			case 0:
				if (_num.length == 2 && parseFloat(_num.substr(0,1)) == 1) {
					_string += 'рублей';
					break;
				}
				var _last_num = parseFloat(_num.substr(-1));
				if (_last_num == 1) _string += 'рубль';
				else if (_last_num > 1 && _last_num < 5) _string += 'рубля';
				else _string += 'рублей';
				break;
			case 1:
				_num = _num.replace(/^[0]{1,}$/g, '0');
				if (_num.length == 2 && parseFloat(_num.substr(0,1)) == 1) {
					_string += 'тысяч ';
					break;
				}
				var _last_num = parseFloat(_num.substr(-1));
				if (_last_num == 1) _string += 'тысяча ';
				else if (_last_num > 1 && _last_num < 5) _string += 'тысячи ';
				else if (parseFloat(_num) > 0) _string += 'тысяч ';
				_string = _string.replace('один ', 'одна ');
				_string = _string.replace('два ', 'две ');
				break;
			case 2:
				_num = _num.replace(/^[0]{1,}$/g, '0');
				if (_num.length == 2 && parseFloat(_num.substr(0,1)) == 1) {
					_string += 'миллионов ';
					break;
				}
				var _last_num = parseFloat(_num.substr(-1));
				if (_last_num == 1) _string += 'миллион ';
				else if (_last_num > 1 && _last_num < 5) _string += 'миллиона ';
				else if (parseFloat(_num) > 0) _string += 'миллионов ';
				break;
			case 3:
				_num = _num.replace(/^[0]{1,}$/g, '0');
				if (_num.length == 2 && parseFloat(_num.substr(0,1)) == 1) {
					_string += 'миллиардов ';
					break;
				}
				var _last_num = parseFloat(_num.substr(-1));
				if (_last_num == 1) _string += 'миллиард ';
				else if (_last_num > 1 && _last_num < 5) _string += 'миллиарда ';
				else if (parseFloat(_num) > 0) _string += 'миллиардов ';
				break;
		}
		return _string;
	}
	function decimals_parser(_num) {
		var _first_num = _num.substr(0, 1);
		var _second_num = parseFloat(_num.substr(1, 2));
		var _string = ' ' + _first_num + _second_num;
		if (_second_num == 1) _string += ' копейка';
		else if (_second_num > 1 && _second_num < 5) _string += ' копейки';
		else _string += ' копеек';
		return _string;
	}
	if (!_number || _number == 0) return false;
	if (typeof _number !== 'number') {
		_number = _number + '';
		_number = _number.replace(',', '.');
		_number = parseFloat(_number);
		if (isNaN(_number)) return false;
	}
	_number = _number.toFixed(2);
	if(_number.indexOf('.') != -1) {
		var _number_arr = _number.split('.');
		var _number = _number_arr[0];
		var _number_decimals = _number_arr[1];
	}
	var _number_length = _number.length;
	var _string = '';
	var _num_parser = '';
	var _count = 0;
	for (var _p = (_number_length - 1); _p >= 0; _p--) {
		var _num_digit = _number.substr(_p, 1);
		_num_parser = _num_digit +  _num_parser;
		if ((_num_parser.length == 3 || _p == 0) && !isNaN(parseFloat(_num_parser))) {
			_string = number_parser(_num_parser, _count) + _string;
			_num_parser = '';
			_count++;
		}
	}
	if (_number_decimals) _string += decimals_parser(_number_decimals);
	if (toUpper === true || toUpper == 'upper') {
		_string = _string.substr(0,1).toUpperCase() + _string.substr(1);
	}
	return _string.replace(/[\s]{1,}/g, ' ');
};

Number.prototype.numberToString = function(toUpper) {
	return numberToString(this, toUpper);
};
String.prototype.numberToString = function(toUpper) {
	return numberToString(this, toUpper);
};


Ах, да, добавил то, о чем, собственно, просили Теперь можно указать со строчной или прописной буквы выводить строку. По-умолчанию выводится как и раньше, с прописной; если указать второй параметр (значения либо true, либо 'upper'), то строка начнется с прописной буквы.

Примеры:

var number = 12500;
number.numberToString(true);
// Двенадцать тысяч пятьсот рублей 00 копеек

var number = 12000.5;
number.numberToString();
// двенадцать тысяч рублей 50 копеек

var number = 2000000;
numberToString(number, true);
// Два миллиона рублей 00 копеек

var number = '11'; // Строка, не число (:
numberToString(number);
// одиннадцать рублей 00 копеек
Ответить с цитированием