2016-07-21 8 views
-5

Zum Beispiel, wenn der Text ist: "das hüpfende 7000 Bunny hüpft 4 Sie". Ich will: "Die hüpfende 70,00 Bunny Hopfen 4.00 Sie" zurückgegeben.Wie wende ich alle Zahlen in einer Zeichenfolge in Währungsform oder dezimaler Formatierung an, ohne vorher ihre spezifische Position in der Zeichenfolge zu kennen?

Ich bin mir bewusst, dass ich den Text für Zahlen extrahieren, die Position jeder Zahl im Text markieren, die Zahlen formatieren und die markierten Stellen im Text ersetzen könnte, aber das scheint mühsam.

Gibt es einen einfacheren Weg in Javascript, dies zu tun?

+1

Wahrscheinlich nicht. Sie müssten Regex verwenden, um nach allen Zahlen zu suchen und sie durch die Dezimalformatierung zu ersetzen. Es gibt keine magische Möglichkeit, dies zu tun. –

+1

Zumindest geben uns Regeln der Formatierung: warum 4 wurde 4.00 und warum 7000 wird nicht 70000.00? –

+0

Weil 4 4,00 monetär und 7000 nicht 70000,00 ist. 4 hat den gleichen Wert wie 4,00, aber 7000 hat nicht den gleichen Wert wie 70000,00. Ich dachte, das wäre offensichtlich. Entschuldigen Sie. – TheHumblePedestrian

Antwort

0

Wenn die Werte über hundert geteilt durch 100 sollte dann ist dies die Antwort.

var str = "the bouncy 7000 bunny hops 4 you"; 
 
console.clear(); 
 
var result = str 
 
    .replace(/\d+/g, num => { 
 
    num = parseInt(num); 
 
    return (num > 100 ? num/100 : num) + ".00"; 
 
    }); 
 
console.log(result);

+0

Das ist, was ich gesucht habe, danke. – TheHumblePedestrian

+0

@TheHumblePedestrian Sie sollten besser alles erklären, was Sie wollen. Ihre downVotes sind hauptsächlich deswegen. –

1

Sie können String.prototype.match() und String.prototype.replace() in Verbindung mit regulären Ausdrücken verwenden, um die entsprechenden Nummern durch die gewünschten zu ersetzen.

Anhand Ihres spezifischen Beispiels können Sie das gewünschte Ergebnis auf folgende Weise erhalten.

function getFormatted(arr) { 
 
     return arr.map(function(str) { 
 
     // if str ends in '00' 
 
     if (str.substring(str.length - 2) === '00') { 
 
      return str.substring(0, str.length - 2) + '.' + '00'; 
 
     // if str does NOT end in '00' 
 
     } else if (str.substring(str.length - 2) !== '00') { 
 
      return str + '.00'; 
 
     } 
 
     }) 
 
    } 
 

 
    function replacer(str, matches, formatted) { 
 
     return matches.reduce(function(acc, cur, i) { 
 
     return acc.replace(cur, formatted[i]); 
 
     }, str) 
 
    } 
 
    
 
    var str = 'the bouncy 7000 bunny hops 4 you'; 
 
    
 
    var matches = str.match(/\d+/g); 
 
    console.log(matches); 
 
    // => ["7000", "4"] 
 
    
 
    var formatted = getFormatted(matches); 
 
    console.log(formatted); 
 
    // => ["70.00", "4.00"] 
 
    
 
    var replaced = replacer(str, matches, formatted); 
 
    console.log(replaced); 
 
    // => ["the bouncy 70.00 bunny hops 4.00 you"]

Sie können die Regeln in getFormatted einstellen müssen, um Ihre spezifischen Anwendungsfälle anzupassen.

aktualisieren

Wenn Sie sich für einen einfacheren Weg zu gehen darüber suchen, können Sie ein Array von Arrays, bestehend aus regulären Ausdrücken und Transformationsfunktionen übergeben. Dies nimmt alle Übereinstimmungen des regulären Ausdrucks (erstes Argument) und wendet eine Transformationsfunktion auf sie an (zweites Argument).

var replacer = function(str, arr) { 
    return arr.reduce(function(acc, cur) { 
    return acc.match(cur[0]).reduce(function(acc, cur) { 
     return acc.replace(cur, cur[1](cur)); 
    }, str) 
    }, str) 
} 

var replaced = replacer('the bouncy 7000 bunny hops 4 you', [ 
    [/\d+/g, function(match) { return match + '.00'; }], 
    [/bunny/, function(match) { return 'dog'; })] 
]); 

console.log(replaced); 
// = > "the bouncy 7000.00 dog hops 4.00 you" 

Oder, wenn Sie mit ES6 Syntax ...

var replacer = (str, arr) => arr.reduce((acc, [reg, fn]) => { 
    return acc.match(reg).reduce((acc, match) => { 
     return acc.replace(match, fn(match)); 
    }, str); 
    }, str); 
} 

var replaced = replacer('the bouncy 7000 bunny hops 4 you', [ 
    [/\d+/g, (match) => match + '.00'], 
    [/bunny/, (match) => 'dog'] 
]); 

console.log(replaced); 
// = > "the bouncy 7000.00 dog hops 4.00 you"