2013-02-20 20 views
5

Su un progetto al momento sto lavorando su JavaScript, sto usando i formati decimali quindi è più facile calcolare con piuttosto che utilizzare un formato ora/minuto nelle stringhe (calendario progetto correlato). Tuttavia, per visualizzare l'ora sullo schermo dell'utente, il codice temporale deve essere visualizzato come hh: mm.Funzione prototipo Javascript: valore decimale del tempo su stringa temporale

ho pensato che sarebbe bello utilizzare una funzione String prototipo di questo in quanto mi avrebbe permesso di utilizzare il codice:

var time = 8.75; 
document.write("Meeting at "+time.toTime()); // writes: Meeting at 8:45 

Finora, ho quasi che lavorare, utilizzando:

String.prototype.toTime = function(){ 
    var hrs = this.toString().slice(0,this.indexOf(".")); 
    var min = Math.round(this.toString().slice(this.indexOf("."))/100*60); 
    min = min<10 ? "0"+min : min.toString(); 
    return hrs+":"+min; 
} 

Il problema, tuttavia, è che questo funzionerà solo se la variabile time è una stringa. Altrimenti darà un errore indefinito.

Sarebbe possibile applicare il prototipo a un oggetto diverso in JavaScript, in modo da non dover utilizzare time.toString().toTime()?

Grazie!

+0

Sarebbe 'Number.prototype.toTime' aiutare? E puoi abbreviare a '(" "+ time) .toTime()' nel tuo codice corrente. – Passerby

+0

puoi usare 'Object.prototype' come tutti gli oggetti ereditano da esso. – TheBronx

+0

Personalmente trovo che sia un approccio più pulito per passare il valore ad una funzione invece di estendere il prototipo. –

risposta

5

In primo luogo, è possibile aggiungere al prototipo Number. Molte persone metteranno in guardia contro la modifica dei prototipi, che in molti casi è giustificata. Se c'è la possibilità che gli script di terze parti siano in esecuzione accanto ai tuoi, è un pericolo modificare i prototipi.

In secondo luogo, ho semplificato il codice un po ', utilizzando il modulo, e piano per il calcolo delle ore e dei minuti ...

Number.prototype.toTime = function(){ 
    var hrs = Math.floor(this) 
    var min = Math.round(this%1*60) 
    min = min<10 ? "0"+min : min.toString(); 
    return hrs+":"+min; 
} 

var time = 8.25; 
console.log("Meeting at "+time.toTime()); 
+0

Non devi 'toString(). Split (". ")' Se stai già manipolando il numero ... 'parseInt',' Math.floor', ecc. può fare il trucco – Passerby

+0

@Passerby hai perfettamente ragione ... Ho modificato la risposta di conseguenza –

+0

Grazie, ha perfettamente senso. Tuttavia, ho trovato un piccolo bug in là: '9.50' verrà emesso come" 9:03 ", anziché" 9:30 ". Qualche idea? – Oscar

-1

È possibile utilizzare Object.prototype.toTime.

+0

Perché negativate? Ti aiuterà, se usi 'prototype' di' Object' –

+0

1. perché l'aggiunta a 'Object.prototype' è pericolosa a meno che tu non sappia _exactly_ cosa stai facendo 2. Perché poi si applica a ogni' Object', anche quelli in cui questo metodo non ha senso. – Alnitak

+0

Sì, lo so, ma negativare qualcosa significa "una pazza risposta sbagliata". La soluzione qui vale per il tuo caso, ma non è il migliore per il pericolo implicito. Quindi non penso che meriti di essere negativato: D –

Problemi correlati