2016-03-21 3 views
0

У меня есть эта функция, результаты регулярных выражений СГМ:номера Sum право, независимо от формата

'use strict'; 
 

 
function sum(string) { 
 
    var match, result, pattern; 
 

 
    pattern = /[\d,\.]+/g 
 
    match = string.match(pattern); 
 
    
 
    if (!match.length) { 
 
     return 'Didn\'t find any trace.'; 
 
    } 
 

 
    result = match.reduce(function(prev, curr) { 
 
     curr = curr.replace(/\./g, '').replace(',', '.'); 
 
     return prev + (+curr); 
 
    }, 0); 
 

 
    if (!isNaN(result)) { 
 
     return result; 
 
    } else { 
 
     return 'The sum fails.'; 
 
    } 
 
} 
 

 
console.log(sum('156,02 10')); // expected: 166.02 = works 
 
console.log(sum('10.10 10.10')); // expected: 20.20 = doesn't work, result = 2020 
 
console.log(sum('01.10 2,30')); // expected: 3.40 = doesn't work, result = 112.3

И работает только тогда, когда у меня есть формат 152,02. Я бы хотел, чтобы он принимал все форматы. Является ли это возможным? Нет ли lib, чтобы помочь?

Спасибо.

+0

Почему '2,30' быть преобразованы в' 2.30'? – guest271314

+2

@ guest271314 Это проблема локали «вещь». В некоторых странах 2,30 фактически составляет 2,30. Цифры разделяются запятой – adelineu

ответ

0

Попробуйте использовать удаление .replace(/\./g, ''), в том числе + оператором до prev бросить в prev строку в Number

'use strict'; 
 

 
function sum(string) { 
 
    var match, result, pattern; 
 

 
    pattern = /(\d+\.\d+)|(\d+,\d+)|(\d+)/g; 
 
    match = string.match(pattern); 
 
    
 
    if (!match.length) { 
 
     return 'Didn\'t find any trace.'; 
 
    } 
 

 
    result = match.reduce(function(prev, curr) { 
 
     curr = curr.replace(',', '.'); 
 
     return +prev + (+curr); 
 
    }, 0); 
 

 
    if (!isNaN(result)) { 
 
     return result; 
 
    } else { 
 
     return 'The sum fails.'; 
 
    } 
 
} 
 

 
console.log(sum('156,02 10')); // expected: 166.02 = works 
 
console.log(sum('10.10 10.10')); // expected: 20.20 = doesn't work, result = 2020 
 
console.log(sum('01.10 2,30')); // expected: 3.40 = doesn't work, result = 112.3