From c0a15d4f09aeb4c92e2c46aa64562559fd7f7a91 Mon Sep 17 00:00:00 2001 From: Evan Theurer Date: Fri, 29 Aug 2014 13:37:47 +0200 Subject: [PATCH 1/2] Add formatBase1000 filter. --- static/js/filters/filters.js | 6 ++- static/js/filters/formatbase1000.js | 66 +++++++++++++++++++++++++++++ static/partials/geolocation.html | 4 +- 3 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 static/js/filters/formatbase1000.js diff --git a/static/js/filters/filters.js b/static/js/filters/filters.js index b5f7a29e..24c1be30 100644 --- a/static/js/filters/filters.js +++ b/static/js/filters/filters.js @@ -25,14 +25,16 @@ define([ 'filters/buddyimagesrc', 'filters/displayconference', 'filters/displayuserid', - 'filters/displaynameforsession'], function(_, displayName, buddyImageSrc, displayConference, displayUserid, displayNameForSession) { + 'filters/displaynameforsession', + 'filters/formatbase1000'], function(_, displayName, buddyImageSrc, displayConference, displayUserid, displayNameForSession, formatBase1000) { var filters = { displayName: displayName, buddyImageSrc: buddyImageSrc, displayConference: displayConference, displayUserid: displayUserid, - displayNameForSession: displayNameForSession + displayNameForSession: displayNameForSession, + formatBase1000: formatBase1000 }; var initialize = function(angModule) { diff --git a/static/js/filters/formatbase1000.js b/static/js/filters/formatbase1000.js new file mode 100644 index 00000000..5623f4fd --- /dev/null +++ b/static/js/filters/formatbase1000.js @@ -0,0 +1,66 @@ +/* + * Spreed WebRTC. + * Copyright (C) 2013-2014 struktur AG + * + * This file is part of Spreed WebRTC. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +define([], function() { + + // formatBase1000 + /* Purpose: format number/unit appropriately. + Appends k+base-unit, base-unit, c+base-unit, m+base-unit to value depending input. + when Number >= 1 and !base-unit: no decimal is used + when Number < 1: 2 places decimal accuracy + Using: Number | formatBase1000[:'base-unit'] + */ + return [function() { + var defaultPrecisionBaseAndOver = 0; + var defaultPrecisionUnderBase = 2; + return function(num, unit) { + num = Number(num); + var getNumber = function(precision) { + var dot = num.toString().search(/\./); + if (dot === -1) { + precision += num.toString().length; + } else { + precision += dot; + } + return num.toPrecision(precision); + }; + if (!unit) { + return getNumber(defaultPrecisionBaseAndOver); + } + // killo + if (num >= 1000) { + num /= 1000; + return getNumber(defaultPrecisionBaseAndOver) + 'k' + unit; + // centi + } else if (num < 1 && num >= 0.01) { + num *= 100; + return getNumber(defaultPrecisionUnderBase) + 'c' + unit; + // milli + } else if (num < 0.01) { + num *= 1000; + return getNumber(defaultPrecisionUnderBase) + 'm' + unit; + // base + } else { + return getNumber(defaultPrecisionBaseAndOver) + unit; + } + }; + }]; + +}); diff --git a/static/partials/geolocation.html b/static/partials/geolocation.html index f712ff9d..ec1334a1 100644 --- a/static/partials/geolocation.html +++ b/static/partials/geolocation.html @@ -1,3 +1,3 @@ \ No newline at end of file +
{{info.latitude|number:6}}º {{info.longitude|number:6}}º ±{{info.accuracy|formatBase1000:'m'}}
+ From fe13eec419dff38c721e0e00d13478034de16f31 Mon Sep 17 00:00:00 2001 From: Evan Theurer Date: Wed, 3 Sep 2014 12:29:56 +0200 Subject: [PATCH 2/2] Fine tune numbers < 100 and >=1. --- static/js/filters/formatbase1000.js | 46 +++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/static/js/filters/formatbase1000.js b/static/js/filters/formatbase1000.js index 5623f4fd..181fbe16 100644 --- a/static/js/filters/formatbase1000.js +++ b/static/js/filters/formatbase1000.js @@ -22,16 +22,18 @@ define([], function() { // formatBase1000 /* Purpose: format number/unit appropriately. - Appends k+base-unit, base-unit, c+base-unit, m+base-unit to value depending input. - when Number >= 1 and !base-unit: no decimal is used - when Number < 1: 2 places decimal accuracy - Using: Number | formatBase1000[:'base-unit'] + Appends k+base-unit, base-unit, c+base-unit, m+base-unit to value depending on input. + Decimal accuracy is taken care of automatically but override is avaible. + Using: Number | formatBase1000[:'base-unit'][:'desired-precision'] */ return [function() { - var defaultPrecisionBaseAndOver = 0; - var defaultPrecisionUnderBase = 2; - return function(num, unit) { + var defaultPrecisionUnder1 = 2; + var defaultPrecisionFrom1AndUnder10 = 2; + var defaultPrecisionFrom10AndUnder100 = 1; + var defaultPrecisionFrom100AndOver = 0; + return function(num, unit, precision) { num = Number(num); + precision = Number(precision); var getNumber = function(precision) { var dot = num.toString().search(/\./); if (dot === -1) { @@ -39,26 +41,44 @@ define([], function() { } else { precision += dot; } + // toPrecision supports range 1 - 21 + if (precision > 21) { + precision = 21; + } return num.toPrecision(precision); }; + var getPrecision = function() { + if (!isNaN(precision)) { + return precision; + } + if (num >= 100) { + return defaultPrecisionFrom100AndOver; + } else if (num < 100 && num >= 10) { + return defaultPrecisionFrom10AndUnder100; + } else if (num < 10 && num >= 1){ + return defaultPrecisionFrom1AndUnder10; + } else { + return defaultPrecisionUnder1; + } + }; if (!unit) { - return getNumber(defaultPrecisionBaseAndOver); + return getNumber(getPrecision()); } - // killo + // kilo if (num >= 1000) { num /= 1000; - return getNumber(defaultPrecisionBaseAndOver) + 'k' + unit; + return getNumber(getPrecision()) + 'k' + unit; // centi } else if (num < 1 && num >= 0.01) { num *= 100; - return getNumber(defaultPrecisionUnderBase) + 'c' + unit; + return getNumber(getPrecision()) + 'c' + unit; // milli } else if (num < 0.01) { num *= 1000; - return getNumber(defaultPrecisionUnderBase) + 'm' + unit; + return getNumber(getPrecision()) + 'm' + unit; // base } else { - return getNumber(defaultPrecisionBaseAndOver) + unit; + return getNumber(getPrecision()) + unit; } }; }];