Plus Party Controller
HTML
<div ng-app ng-controller='PlusPartyController'>
<textarea rows='10' cols='40' ng-model='rawText'></textarea>
<ul>
<li ng-repeat='number in numberList'>{{number.number | number:2}}</li>
</ul>
<h1>{{total | number:2}}</h1>
</div>
CSS
ul li {
list-style-type: none;
text-align: right;
}
ul{
margin: 0;
padding: 0;
}
h1 {
text-align: right;
}
JavaScript
console.log(document.querySelector('textarea').value)
function PlusPartyController($scope){
$scope.rawText = '1000 1,000 1,000.00 9,000,000 4,567,897 54,678,98';
$scope.$watch('rawText', function(){
$scope.numberList = parseNumbers($scope.rawText);
$scope.total = numberTotal($scope.numberList);
})
}
function uncommaLongNumbers(inputString) {
var commaRe = /-?\d{1,3},(\d{3},)*\d{3}\b/;
//var match = commaRe.exec(inputString);
var match;
while (match = commaRe.exec(inputString)) {
var beforeString = inputString.slice(0, match.index);
var noCommas = match[0].replace(/,/g, '');
var afterString = inputString.slice(match.index + match[0].length);
inputString = beforeString + noCommas + afterString;
commaRe.lastIndex = 0;
}
return inputString;
}
function parseNumbers(rawText){
// If 'dog' => ''
// If '9' => 9
// If '19' => 19
// If '4.5' => 4.5
// If '$5.60' => 5.60
// If 1,000 => 1000
// If 12/3/14 => ignore
// If 5/12/472/456
// If -3 ==> -3
var dateRe = /\b\d{1,2}\/\d{1,2}\/(\d{2}|\d{4})\b/g;
rawText = rawText.replace(dateRe, '');
rawText = uncommaLongNumbers(rawText);
var numbersRe = /-?[0-9.]+/g;
var numbers = [];
var match;
while ((match = numbersRe.exec(rawText)) !== null) {
try {
var number = parseFloat(match, 10);
console.log("parsed", match, number);
numbers.push({number: number})
} catch(error) {
console.log("didn't parse", match);
}
}
return numbers;
}
function numberTotal(numberList){
var currentTotal = 0;
for (var i=0; i<numberList.length; i++){
currentTotal = currentTotal + numberList[i].number;
}
return currentTotal;
}