Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбить число по три символа 
V
    Опции темы
Serious2008
Дата 29.2.2012, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



У меня есть число, вывод его нужно разбить через пробел или через запятую.
Нашёл был функцию.

Код


function number_format(_number, _cfg){
  function obj_merge(obj_first, obj_second){
    var obj_return = {};
    for (key in obj_first){
      if (typeof obj_second[key] !== 'undefined') obj_return[key] = obj_second[key];
      else obj_return[key] = obj_first[key];
      }
    return obj_return;
  }
  function thousands_sep(_num, _sep){
    if (_num.length <= 3) return _num;
    var _count = _num.length;
    var _num_parser = '';
    var _count_digits = 0;
    for (var _p = (_count - 1); _p >= 0; _p--){
      var _num_digit = _num.substr(_p, 1);
      if (_count_digits % 3 == 0 && _count_digits != 0 && !isNaN(parseFloat(_num_digit))) _num_parser = _sep + _num_parser;
      _num_parser = _num_digit + _num_parser;
      _count_digits++;
      }

    return _num_parser;
  }

  if (typeof _number !== 'number'){
    _number = parseFloat(_number);
    if (isNaN(_number)) return false;
  }
  var _cfg_default = {before: '', after: '', decimals: 2, dec_point: '.', thousands_sep: ','};
  if (_cfg && typeof _cfg === 'object'){
    _cfg = obj_merge(_cfg_default, _cfg);
  }
  else _cfg = _cfg_default;
  _number = _number.toFixed(_cfg.decimals);
  if(_number.indexOf('.') != -1){
    var _number_arr = _number.split('.');
    var _number = thousands_sep(_number_arr[0], _cfg.thousands_sep) + _cfg.dec_point + _number_arr[1];
  }
  else var _number = thousands_sep(_number, _cfg.thousands_sep);
  return _cfg.before + _number;
}


Она вызывалась вот так
Код

price = number_format(prices, {thousands_sep: " "});


но ие-8 возмущается на это вот так.
Код

Сведения об ошибке на веб-странице

Агент пользователя: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR
3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E; WebMoney Advisor)
штамп времени: Wed, 29 Feb 2012 15:22:39 UTC


Сообщение: Объект не поддерживает это свойство или метод
Строка: 150
Символ: 3
Код: 0
URI-код: http://test95.ru/internet-magazin/details/3/5/novinki/yubka


Это сообщение отредактировал(а) Serious2008 - 29.2.2012, 19:22
PM MAIL   Вверх
$дмитрий
Дата 29.2.2012, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 5
Всего: 45



А эта?
Код

function number_format (number, decimals, dec_point, thousands_sep){
    if (isNaN(number) || number=='') number = 0;
 
    var decimals        = decimals != undefined ? decimals : 2,
        dec_point       = dec_point != undefined ? dec_point : '.',
        thousands_sep   = thousands_sep != undefined ? thousands_sep : ' ',
        negative        = number&lt;0;
 
    if (negative) number *= -1;
 
    var left    = parseInt(number, 10),
        right   = Math.round(parseFloat(number.toString().replace(/^d+./, '0.')) * Math.pow(10, decimals));
 
    left  = left.toString().split('').reverse().join('')
            .match(/d{3}|d{1,2}/g)
            .join(thousands_sep)
            .split('').reverse().join('');
 
    right = (right / Math.pow(10,decimals)).toString().replace(/^d+./, '').toString();
 
    if (right.length &lt; decimals) for (var iRight=right.length; iRight &lt; decimals; iRight++) right += '0';
 
    return (negative?'-':'')+left+dec_point+right;
}

PM MAIL   Вверх
Serious2008
Дата 29.2.2012, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



$дмитрий, 

Uncaught SyntaxError: Unexpected token ;

Uncaught ReferenceError: number_format is not defined

вот такие две ошибки
Вторая на вызов функции, первая на эту строку

Код

if (right.length &lt; decimals) for (var iRight=right.length; iRight &lt; decimals; iRight++) right += '0';


И это я банально в хроме тестировал
PM MAIL   Вверх
ksnk
Дата 29.2.2012, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



Код

if (right.length < decimals) for (var iRight=right.length; iRight < decimals; iRight++) right += '0';

должно быть так.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
$дмитрий
Дата 29.2.2012, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 5
Всего: 45



Парсер касячит
Код

function number_format (number, decimals, dec_point, thousands_sep){
    if (isNaN(number) || number=='') number = 0;
 
    var decimals        = decimals != undefined ? decimals : 2,
        dec_point       = dec_point != undefined ? dec_point : '.',
        thousands_sep   = thousands_sep != undefined ? thousands_sep : ' ',
        negative        = number<0;
 
    if (negative) number *= -1;
 
    var left    = parseInt(number, 10),
        right   = Math.round(parseFloat(number.toString().replace(/^d+./, '0.')) * Math.pow(10, decimals));
 
    left  = left.toString().split('').reverse().join('')
            .match(/d{3}|d{1,2}/g)
            .join(thousands_sep)
            .split('').reverse().join('');
 
    right = (right / Math.pow(10,decimals)).toString().replace(/^d+./, '').toString();
 
    if (right.length < decimals) for (var iRight=right.length; iRight < decimals; iRight++) right += '0';
 
    return (negative?'-':'')+left+dec_point+right;
}

PM MAIL   Вверх
Serious2008
Дата 29.2.2012, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



$дмитрий, 
На эту строку
Код

.join(thousands_sep)

Вот так жалуется
Uncaught TypeError: Cannot call method 'join' of null

PM MAIL   Вверх
Evghenusi
Дата 1.3.2012, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: 3
Всего: 15



[удалено]

Это сообщение отредактировал(а) Evghenusi - 1.3.2012, 16:55
PM WWW   Вверх
Serious2008
Дата 1.3.2012, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Evghenusi, 
Вообще-то фукция сработала всё правильно, почему удалил?

Тему можно закрывать функция прошлая сработала как надо, если вдруг что, пускай автор выложит сам её.

Это сообщение отредактировал(а) Serious2008 - 1.3.2012, 17:00
PM MAIL   Вверх
Evghenusi
Дата 1.3.2012, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: 3
Всего: 15



Serious2008, спасибо, рад что подошла.

но мне кажется этот вариант будет лучше
Код

function num(n,d,b,c,l)
{
    n=''+n,n=n.charAt(0)=='-'?(b=1,n.slice(1)):n,c=n.indexOf('.'),c=~c?c:n.length;
    for(i=1,j=0|(c/3);i<=j;i++)l=c-3*i,n=n.slice(0,l)+d+n.slice(l);
    n=n.charAt(0)==d?n.slice(1):n;
    return b?'-'+n:n
}
//для очень длинных чисел число надо брать в кавычки))  или price + ''
var price1 = num('-9999999999999999999999999999999999999999.39',' ');
var price2 = num(-123456.39,',');

p.s. в код лучше не вглядываться  smile 

______
надеюсь наконец-то всё учёл

Это сообщение отредактировал(а) Evghenusi - 9.4.2012, 18:02
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.