2011-12-14 78 views
27

如何可以修改此代碼的所有位低於10小於10添加0〜數

$('#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; 
} 

前添加0所以outpout將從

4°7'34「W改變,168°1'23「N

04°07'34」W,168°01'23「N

由於FO [R你的時間

+0

Dup:[如何使用JavaScript創建Zerofilled值?](http://stackoverflow.com/q/1267283/90527),[JavaScript,正則表達式,將字符串中包含的所有數字加上前導零](http ://stackoverflow.com/q/9812610/90527)等等。 – outis 2012-03-29 03:08:56

回答

91

你總是可以做

('0' + deg).slice(-2) 

slice()

你也可以使用負數從數組的末尾

因此

選擇
('0' + 11).slice(-2) // '11' 
('0' + 4).slice(-2) // '04' 

爲了便於操作,你當然可以將其解壓縮到一個功能,甚至用它擴展Number

Number.prototype.pad = function(n) { 
    return new Array(n).join('0').slice((n || 2) * -1) + this; 
} 

,這將使你寫:

c += deg.pad() + '° '; // "04° " 

上述功能pad接受一個指定所需字符串長度的參數。如果不使用這樣的說法,則默認爲2.你可以這樣寫:

deg.pad(4) // "0045" 

注意的明顯缺點的n值不能超過11更高,爲0的字符串是目前長僅10個字符。這當然可以得到技術解決方案,但我不想在這樣一個簡單的功能中引入複雜性。 (你應該選擇,看到alex's answer爲此的一個很好的方法)。

還請注意,您將無法寫入2.pad()。它只適用於變量。但是,如果它不是一個變量,你會一直知道這個數字由多少個數字組成。

+3

雖然你可以寫'2..pad():) – alex 2011-12-15 23:11:44

+0

這會切斷前面的數字。例如:deg.pad(2);將999變爲99. – NoBrainer 2015-02-11 17:35:48

+0

以及('0'+ 123).slice(-2) – 2017-05-29 13:32:24

0
$('#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; 
} 
1

你可以寫一個通用的函數來做到這一點...

var numberFormat = function(number, width) { 
    return new Array(+width + 1 - (number + '').length).join('0') + number; 
} 

這樣,處理任意寬度都不是問題。

26

讓您可以重複使用的功能:

function minTwoDigits(n) { 
    return (n < 10 ? '0' : '') + n; 
} 

在座標的每一部分,然後使用它:

c += minTwoDigits(deg) + "° "; 

等。

+1

+1。嚴重的是,如果你只是處理兩位數字,這是做到這一點的方法;簡短,簡單,有效,易於閱讀。如果你需要考慮零填充更長的數字,然後使用其他解決方案之一,但如果你只是做兩位數的數字,那麼這就是你所需要的。 – Spudley 2012-05-20 19:15:12

1

我很無聊,玩弄JSPerf試圖擊敗當前選擇的答案,無論使用什麼,並使用slice(-2)。這是一個聰明的方法,但隨着字符串變長,性能會變得更糟。

對於數字0到10(一個和兩個字符串),我能夠擊敗大約百分之十,而使用charAt處理較長的字符串時,最快的方法要好得多,因此它不必遍歷整個字符串。

此後續操作不像簡單的slice(-2)那樣簡單,而是在大多數3位數字(3個字符的字符串)中使用時爲86%-89% faster

var prepended = (1 === string.length && string.charAt(0) !== "0") ? '0' + string : string; 
1

希望,這幫助:

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; 
} 
0

一個正則表達式替換應該這樣做:

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); 

顯示預期的輸出。

2
if(myNumber.toString().length < 2) 
    myNumber= "0"+myNumber; 

或:

return (myNumber.toString().length < 2) ? "0"+myNumber : myNumber; 
1

你總是可以做

('0' + deg).slice(-2) 

如果你經常用它,你可以擴展對象數量

Number.prototype.pad = function(n) { 
    if (n==undefined) 
     n = 2; 

    return (new Array(n).join('0') + this).slice(-n); 
} 

deg.pad(4) // "0045" 

在那裏你可以設置任何墊大小或保留默認值2.