Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.09.2009, 20:51
giplex
 
Сообщений: n/a

Извлечение дробного числа из строки
Здравствуйте! Из строк, которые печатает кассовый терминал в чеке, например:
Код:
1.Шоколад Нестле классик 100 гр....139.50
2.Яйцо 1 категории Гайфа 1\10.........175.20
3.Сок Джуси 1,0 л Грейпфрут...........190.60
необходимо извлекать стоимость товара, т.е. 139.50, 175.20 и 190.60. Когда терминал был настроен на печать стоимости без копеек проблем не было и эта задача решалась следующим фрагментом:

function processSale()
{
    var index = data.lastIndexOf(".");
    var saleAmount = data.substring(index + 1, data.length);
    saleAmount = parseFloat(saleAmount);
    var index1 = data.indexOf(".");
    var lastChar = null;
    for(var i = data.length - 1; i >=0; i--)
    {
        var ch = data.charAt(i);
        if(ch != '.' && lastChar == '.')
        {
            break;
        }
        lastChar = ch;
    }
    var productName = data.substring(index1 + 1, i + 1);
    productName = trim(productName);

    var reg = /(\S)+X\d/;
    var matches = reg.exec(data);
    saleProductsCount = 1;
    if(matches != null)
    {
        var s = matches[0];
        var array = s.split('X');
        var saleProductsCount = array[0];
        saleProductsCount = parseFloat(saleProductsCount);
        if(isNaN(saleProductsCount))
        {
            saleProductsCount = 1;
        }
    }
    listenerObject.pushNewSale(productName);
    listenerObject.pushSaleAmount(saleAmount);
    listenerObject.pushSaleProductsCount(saleProductsCount);
}


но когда настроили терминал на печать копеек, то извлекаются цифры после последней точки, т.е. в нашем примере это 50, 20 и 60 и заносятся в базу данных как стоимость указанного в примере товара, что не соответствует действительности. Подскажите где в приведенном фрагменте и какие внести изменения, чтобы правильно разбиралась строка, пришедшая из кассового терминала. Заранее СПАСИБО!!!

Последний раз редактировалось Octane, 03.09.2009 в 21:00. Причина: используйте теги [js] и [html] для оформления кода
Ответить с цитированием
  #2 (permalink)  
Старый 04.09.2009, 09:58
Аватар для Regent
Интересующийся
Отправить личное сообщение для Regent Посмотреть профиль Найти все сообщения от Regent
 
Регистрация: 04.09.2009
Сообщений: 21

С помощью регулярных выражений получение цены из каждой строчки решается так:
var processSale = function( text ){
  return text.match( /(?:[0-9]+)\.(?:[0-9]{2})/g );
};
- вернёт массив цен( строчки )
Если надо в числа преобразовать, можно сделать так:
var processSale = function( text ){
  var match =  text.match( /(?:[0-9]+)\.(?:[0-9]{2})/g );
  if( match )
    for( var i = 0, len = match.length; i < len; i++ )
      match[ i ] = parseFloat( match[ i ] );
  return match;
};
Ответить с цитированием
  #3 (permalink)  
Старый 04.09.2009, 11:46
Кандидат Javascript-наук
Отправить личное сообщение для SunnyDay Посмотреть профиль Найти все сообщения от SunnyDay
 
Регистрация: 22.09.2008
Сообщений: 111

Можно в дробное число перевести с помощью 2-х parseInt
a=parseInt(text);
b=parseInt(text.substring(text.indexOf(".")+1));

floatvar= a+b/Math.pow(10,String(b).length)

Последний раз редактировалось SunnyDay, 04.09.2009 в 11:48.
Ответить с цитированием
  #4 (permalink)  
Старый 04.09.2009, 18:29
Аватар для Regent
Интересующийся
Отправить личное сообщение для Regent Посмотреть профиль Найти все сообщения от Regent
 
Регистрация: 04.09.2009
Сообщений: 21

А зачем такие сложные операции, когда существует parseFloat?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для события onCLick получить индекс строки и объект грида. progi2007 ExtJS 4 05.08.2009 11:31