Comment puis-je modifier ce code pour ajouter un 0 avant tout chiffre inférieur à 10
$('#detect').html( toGeo(apX, screenX) + latT +', '+ toGeo(apY, screenY) + lonT );
function toGeo(d, max) {
var c = '';
var r = d/max * 180;
var deg = Math.floor(r);
c += deg + "° ";
r = (r - deg) * 60;
var min = Math.floor(r);
c += min + "′ ";
r = (r - min) * 60;
var sec = Math.floor(r);
c += sec + "″";
return c;
}
Donc, la sortie changerait de
4 ° 7′34 ″ ouest, 168 ° 1′23 ″ nord
à
04 ° 07′34 ″ ouest, 168 ° 01′23 "nord
Merci pour votre temps
Tu peux toujours faire
('0' + deg).slice(-2)
Voir slice()
:
Vous pouvez également utiliser des nombres négatifs pour sélectionner à la fin d'un tableau
Par conséquent
('0' + 11).slice(-2) // '11'
('0' + 4).slice(-2) // '04'
Pour faciliter l’accès, vous pouvez bien sûr l’extraire à une fonction, ou même y étendre Number
:
Number.prototype.pad = function(n) {
return new Array(n).join('0').slice((n || 2) * -1) + this;
}
Ce qui vous permettra d'écrire:
c += deg.pad() + '° '; // "04° "
La fonction ci-dessus pad
accepte un argument spécifiant la longueur de la chaîne souhaitée. Si aucun argument de ce type n'est utilisé, la valeur par défaut est 2. Vous pouvez écrire:
deg.pad(4) // "0045"
Notez l'inconvénient évident que la valeur de n
ne peut pas être supérieure à 11, car la chaîne de 0 ne contient actuellement que 10 caractères. Cela pourrait bien sûr donner une solution technique, mais je ne voulais pas introduire de complexité dans une fonction aussi simple. (Si vous décidez de le faire, voir la réponse d’alex pour une excellente approche à cet égard).
Notez également que vous ne pourriez pas écrire 2.pad()
. Cela ne fonctionne qu'avec des variables. Mais si ce n’est pas une variable, vous saurez toujours à l’avance combien de chiffres le nombre se compose.
Créez une fonction que vous pouvez réutiliser:
function minTwoDigits(n) {
return (n < 10 ? '0' : '') + n;
}
Puis utilisez-le dans chaque partie des coordonnées:
c += minTwoDigits(deg) + "° ";
etc.
Tu peux toujours faire
('0' + deg).slice(-2)
Si vous l'utilisez très souvent, vous pouvez étendre l'objet Number
Number.prototype.pad = function(n) {
if (n==undefined)
n = 2;
return (new Array(n).join('0') + this).slice(-n);
}
deg.pad(4) // "0045"
où vous pouvez définir n’importe quelle taille de pad ou laisser la valeur par défaut 2.
if(myNumber.toString().length < 2)
myNumber= "0"+myNumber;
ou:
return (myNumber.toString().length < 2) ? "0"+myNumber : myNumber;
Vous pouvez écrire une fonction générique pour le faire ...
var numberFormat = function(number, width) {
return new Array(+width + 1 - (number + '').length).join('0') + number;
}
jsFiddle .
De cette façon, la largeur arbitraire ne pose pas de problème.
J'espère que cette aide:
Number.prototype.zeroFill= function (n) {
var isNegative = this < 0;
var number = isNegative ? -1 * this : this;
for (var i = number.toString().length; i < n; i++) {
number = '0' + number;
}
return (isNegative ? '-' : '') + number;
}
Je m'ennuyais et je jouais avec JSPerf en essayant de battre la réponse actuellement sélectionnée en ajoutant un zéro, peu importe quoi, et en utilisant slice(-2)
. C'est une approche intelligente, mais les performances empirent à mesure que la chaîne s'allonge.
Pour les nombres de zéro à dix (une et deux chaînes de caractères), j'ai pu battre d'environ dix pour cent. L'approche la plus rapide était bien meilleure pour traiter les chaînes plus longues en utilisant charAt
, de sorte qu'elle n'ait pas à parcourir toute la chaîne.
Cette suite n’est pas aussi simple que slice(-2)
mais est 86% -89% plus rapide lorsqu'elle est utilisée principalement sur des nombres à 3 chiffres (chaînes de 3 caractères).
var prepended = ( 1 === string.length && string.charAt( 0 ) !== "0" ) ? '0' + string : string;
$('#detect').html( toGeo(apX, screenX) + latT +', '+ toGeo(apY, screenY) + lonT );
function toGeo(d, max) {
var c = '';
var r = d/max * 180;
var deg = Math.floor(r);
if(deg < 10) deg = '0' + deg;
c += deg + "° ";
r = (r - deg) * 60;
var min = Math.floor(r);
if(min < 10) min = '0' + min;
c += min + "′ ";
r = (r - min) * 60;
var sec = Math.floor(r);
if(sec < 10) sec = '0' + sec;
c += sec + "″";
return c;
}
Voici la fonction générique permettant d’ajouter un nombre quelconque de zéros non significatifs pour créer une chaîne numérique de toute taille.
function add_zero(your_number, length) {
var num = '' + your_number;
while (num.length < length) {
num = '0' + num;
}
return num;
}
Une seule expression régulière à remplacer devrait le faire:
var stringWithSmallIntegers = "4° 7′ 34″W, 168° 1′ 23″N";
var paddedString = stringWithSmallIntegers.replace(
/\d+/g,
function pad(digits) {
return digits.length === 1 ? '0' + digits : digits;
});
alert(paddedString);
montre la sortie attendue.