2017-01-25 4 views
2

Я создаю форматтер, который форматирует цены. Идея состоит в том, что если пользователь вводит 'between 45 and 50', он должен возвращать 'between $45.00 and $50.00'. Или, если пользователь вводит «between 45.58 to 38.91», он должен вернуться «between $45.58 to $38.91»Регулярное выражение для определения чисел, но не десятичных

Это то, что я до сих пор -

function formatPricesInString($str){ 
    var x = $str.match(/\d+/g); 
    if(x != null){ 
     $.each(x, function(i, v){ 
      $str = $str.replace(v, formatPrice(v)); 
     }); 
    } 
    return $str; 
} 

Здесь formatPrice (v) является еще одной функцией, в которой, если вы пройдете 45, его вернет 45,00 $.

Теперь к моей функции - formatPricesInString ($ ул), if I pass 45 - 50, it returns $45.00 - $50.00, который прекрасно, но если я прохожу 45.00 - 50.00 it is returning $45.00.$00.00 - $50.00.$00.00.

В основном, он принимает все цифры - 45, 00, 50, 00 и форматирует их.

Как я могу обработать такой сценарий, что если 45.00 или 45.56 передано, он ничего не должен делать, но если я просто передаю нормальное целое число в строке, он должен вернуть отформатированную цену.

Любой другой оптимизированный способ также приветствуется.

метод

formatPrice (...) -

function formatPrice(price) { 
    var symbol = $("#currencySymbolData").attr('data-symbol'); 
    if (typeof symbol === "undefined" || symbol == '') { 
     symbol = '$'; 
    } 
    var symbol_loc = $("#currencySymbolData").attr('data-symbol-loc'); 
    if (typeof symbol_loc === "undefined" || symbol_loc == '') { 
     symbol_loc = 'before'; 
    } 
    price = precise_round(price, 2).toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,"); 
    if (symbol_loc == 'after') { 
     return price + symbol; 
    } else { 
     return symbol + price; 
    } 
} 

EDIT - Ответ

С помощью кода, предоставленной @RomanPerekhrest это работало -

function formatPricesInString($str){ 
    return $str.replace(/(\$?\d+(\.\d+)?)\b/g, function(m){ 
     m = (m[0] === '$')? m.slice(1) : m; 
     return formatPrice(m); 
    }); 
} 
+0

отредактировал мой вопрос. –

+0

Вы можете проверить начальные пробелы или начало строки: '(^ | \ s) \ d +' ..или вы можете сделать десятичную факультативную, '\ d + (\. \ D +)?' ... или там 2 разных вопроса? '45,00' и' 45.56' должны иметь '$' добавленные, нет? – chris85

+0

Да в конечном итоге да. Но пользователь также может вводить $ с числами. –

ответ

1

Рассмотрим следующий пример решение с использованием функции String.prototype.replace() с обратным вызовом :

var str = 'between 45 and 50 and between 45.58 to $38.91', 
 
    formatted = str.replace(/(\$?\d+(\.\d+)?)\b/g, function (m) { 
 
     var prefix = (m[0] === '$')? '' : '$'; 
 
     return prefix + ((m.indexOf('.') === -1)? Number(m).toFixed(2) : m); 
 
    }); 
 

 
console.log(formatted);

+0

Спасибо. Я просто сменил свое регулярное выражение на ваше, и он отлично работал. Мне нужно использовать функцию formatPrice, потому что она везде и везде. –

+0

@NalinAgrawal, рад помочь – RomanPerekhrest

+0

Что делать, если пользователь набирает «$ 45,89 до $ 32,00». Не будет возвращено $$ от 45,89 до $$ 32,00. Как я могу обработать этот сценарий, а также через регулярное выражение. –