2011-11-17 13 views
18

Buon giorno,Come anteporre uno zero di fronte a qualsiasi numero inferiore a 10 in JavaScript utilizzando Regexp

Esiste un Regex che potrei usare per anteporre uno 0 prima di ogni numero che è inferiore a 10?

Non sto cercando una libreria di analisi di date, ternarie o se/altre soluzioni. (Si spera)

var currentDate = new Date(), 
    stringDate = currentDate.getFullYear() + "-" + currentDate.getMonth() + "-" + currentDate.getDate() + " " + currentDate.getHours() + ":" + currentDate.getMinutes() + ":" + currentDate.getSeconds(); 

    alert(stringDate); //2011-10-17 10:3:7 

Vorrei una RegExp che ho potuto applicare per stringDate per ottenere 2011-10-17 10:03:07

Grazie mille!

+2

non dimenticare di aggiungere 1 al mese –

+0

@Jonas H, +1 non l'ho nemmeno notato. Data strana oggetto. – Cybrix

risposta

62

Basta aggiungere lo 0 ogni volta, quindi utilizzare slice(-2) per ottenere gli ultimi due caratteri, in questo modo:

('0' + currentDate.getHours()).slice(-2) 
+0

Questa non è una soluzione regex ma funziona! Ed è molto più pulito di una soluzione ternaria. – Cybrix

+1

ottima soluzione! –

+0

@Cybrix Dovresti accettare la risposta. – FailedDev

3

Non è necessario regex per questo. È possibile effettuare una semplice funzione pad te stesso:

function pad(n) { 
    if (n < 10) 
     return "0" + n; 
    return n; 
} 

alert(pad(8)); 
alert(pad(11)); 

http://jsfiddle.net/DwnNG/

+0

più breve: 'return n <10? "0" + n: n; ' – davee44

1

ne dite:

x.replace(/^(\d)$/, "0$1"); 
+0

' '2011-10-17 10: 3: 7'.replace (/^(\ d) $ /, "0 $ 1") ==' 2011-10-17 10: 03: 07'' – Cybrix

+0

Non funziona con il mio test. – Cybrix

+0

@Cybrix: cambia 'x' di' currentDate.getHours() 'e così via – Toto

0

Questo dovrebbe fare il lavoro (ha un operatore ternario in esso, ma anche un regex^^)

stringDate.replace(/\d+/g, function(m) { 
    return parseInt(m, 10) < 10 ? "0" + m : m; 
}); 
0

io preferisco la via di Alex, ma se davvero vogliono il modo regex, si può provare:

"2011-10-10 10:2:27".replace(/:(?=[^0](?::|$))/g, ":0"); 
+0

Che funziona quasi. Lavorare con numeri inferiori a 10, ma in caso contrario: '2011-10-17 10: 049: 037' – Cybrix

+0

@Cybrix, che ne dici del nuovo? –

0

Sei pronto per il vostro one-liner do-it-all soluzione regex?

Passo nella tua intera stringa ... e questo corrisponderà single-digit e pad con un 0.

"2011-10-17 10:3:7" 
.replace(/(^|[^0-9])([0-9])(?=($|[^0-9]))/ig, function ($0, $1) { 
    return $0[0] + '0' + $0[1]; 
}); 

//returns "2011-10-17 10:03:07" 

Ciò sarebbe reso molto più facile se JavaScript supportata lookbehind-affermazioni.

4

La seguente funzione consente di dichiarare una lunghezza minima per un numero lungo o all'interno di una stringa e la riempirà di zeri per renderla la lunghezza appropriata.

var PrependZeros = function (str, len, seperator) { 
    if(typeof str === 'number' || Number(str)){ 
     str = str.toString(); 
     return (len - str.length > 0) ? new Array(len + 1 - str.length).join('0') + str: str; 
    } 
    else{ 
     for(var i = 0,spl = str.split(seperator || ' '); i < spl.length; spl[i] = (Number(spl[i])&& spl[i].length < len)?PrependZeros(spl[i],len):spl[i],str = (i == spl.length -1)?spl.join(seperator || ' '):str,i++); 
     return str; 
    } 
}; 

Per coloro che desiderano una versione meno criptico

var PrependZeros = function (str, len, seperator) { 
    if (typeof str === 'number' || Number(str)) { 
     str = str.toString(); 
     return (len - str.length > 0) ? new Array(len + 1 - str.length).join('0') + str : str; 
    } 
    else { 
     var spl = str.split(seperator || ' ') 
     for (var i = 0 ; i < spl.length; i++) { 
      if (Number(spl[i]) && spl[i].length < len) { 
       spl[i] = PrependZeros(spl[i], len) 
      } 
     } 
     return spl.join(seperator || ' '); 
    } 
}; 

Esempi:

PrependZeros("1:2:3",2,":"); // "01:02:03" 
PrependZeros(1,2); // "01" 
PrependZeros(123,2); // "123" 
PrependZeros("1 2 3",3); // "001 002 003" 
PrependZeros("5-10-2012",2,"-"); //"05-10-2012" 
+0

Devo minimizzarti per quel male, male, male per il ciclo. – samspot

+1

Ho aggiornato la mia risposta per avere una versione senza il malvagio loop ... Raramente scrivo codice così criptico. –

0

% 0 {lunghezza} =>% 05 => 1 = 00001, 2 = 00002 ,. .. 55 = 00055, ...

1

Io ora questo è vecchio, ma ho appena visto questa soluzione semplice e pulita utilizzata su w3c e ho dovuto condividere da qualche parte

var hours = currentDate.getHours(); 
(hours < 10 ? '0' : '') + hours; 
+0

Questo non funziona, usando Firefox ... – tremor

+0

@tremor è strano quale versione di firefox stai usando? L'operatore ternario è ampiamente supportato su tutti i browser. consultare qui i documenti ufficiali di mozilla https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator#compat-desktop. – John

+0

p.s. Ho appena eseguito senza problemi in Firefox. – John

Problemi correlati