Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Извлечение дробного числа из строки (https://javascript.ru/forum/misc/4974-izvlechenie-drobnogo-chisla-iz-stroki.html)

giplex 03.09.2009 20:51

Извлечение дробного числа из строки
 
Здравствуйте! Из строк, которые печатает кассовый терминал в чеке, например:
Код:

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 и заносятся в базу данных как стоимость указанного в примере товара, что не соответствует действительности. Подскажите где в приведенном фрагменте и какие внести изменения, чтобы правильно разбиралась строка, пришедшая из кассового терминала. Заранее СПАСИБО!!!

Regent 04.09.2009 09:58

С помощью регулярных выражений получение цены из каждой строчки решается так:
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;
};

SunnyDay 04.09.2009 11:46

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

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

Regent 04.09.2009 18:29

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


Часовой пояс GMT +3, время: 06:31.