2013-01-09 48 views
0

我試圖在JS實現自動格式化,例如,如果我有一個給定值(如12345678),我有一個給定的格式(例如XX.XX.XX OR XX-XX-XXXX/XX/XX OR XXX-XXXX)我可以自動格式化我的初始值到任何給定的格式。格式編號使用正則表達式在JavaScript

所需的格式會有所不同,因此它需要能夠採取任何給定格式並重新格式化原始值以匹配。

我不知道它是否可能或如何去做。任何幫助讚賞。

感謝,

克拉拉

+3

什麼讓你覺得正則表達式可能有用嗎?請詳細說明您提供的格式的結果。 –

+0

謝謝你們,最後我用了dystroy的解決方案,因爲這是我以前用來實現這個需求的。 Macek的版本很快就會派上用場,所以謝謝macek。 – ClaraU

回答

3

你像這樣的工作?

function format(mask, number) { 
    var s = ''+number, r = ''; 
    for (var im=0, is = 0; im<mask.length && is<s.length; im++) { 
    r += mask.charAt(im)=='X' ? s.charAt(is++) : mask.charAt(im); 
    } 
    return r; 
}  

console.log(format('XX.XX.XX', 12345678)); // logs "12.34.56" 
console.log(format('XXX-XXXX', 12345678)); // logs "123-4567" 
console.log(format('XX-XX-XX', 12345678)); // logs "12-34-56 " 
console.log(format('XX/XX/XX', 12345678)); // logs "12/34/56" 
console.log(format('XX/XX/XX/XX/XX', 12345678)); // logs "12/34/56/78" 

沒有正則表達式引擎在編寫此代碼時受到傷害。

Fiddle

+1

您可能想要提到對字符串的類似數組訪問('string [x]')在舊版瀏覽器上不起作用。 '.charAt()'是一種替代方案。 – Cerbrus

+0

@Cerbrus你是對的。編輯更好的兼容性。 –

+0

適用於許多瀏覽器,但iOS(iPhone,iPad等)無法正常工作。返回空。 –

3

這應該

var value = '12345678'; 

// 12345678 => 12.34.56.78 
console.log(value.replace(/(\d{2})(?=\d)/g, '$1.')); 

// 12345678 => 12/34/56/78 
console.log(value.replace(/(\d{2})(?=\d)/g, '$1/')); 

// 12345678 => 12-34-56-78 
console.log(value.replace(/(\d{2})(?=\d)/g, '$1-')); 

// 12345678 => 1234-5678 
console.log(value.replace(/(\d{4})(?=\d)/g, '$1-')); 

// a more complex format (create US phone number) 
// 1234567890 => +1 (123)-456-7890 
console.log('1234567890'.replace(/^(\d{3})(\d{3})(\d{4})$/g, '+1 ($1)-$2-$3')); 
0

您可以從一種格式建立一個正則表達式,自動,像這樣:

var format = 'XX-XX-XX'; 
var string = '111111'; 
var regex = ''; 

for(var i = 1; format.indexOf('X') >= 0; i++){ 
    format = format.replace('X', '$'+i); 
    regex += '(\\d)'; // to match a digit enclosed in() 
} 

或者作爲一個函數:

function format(string, format){ 
    var regex = ''; 

    for(var i = 1; format.indexOf('X') >= 0; ++i){ 
     format = format.replace('X', '$'+i); 
     regex += '(\\d)'; 
    } 
    regex += '[^]*'; // Match the rest of the string to crop characters overflowing the format. 
// Remove this^line if you want `format('12345678', 'XX/XX/XX')` to return `12/34/5678` instead of `12/34/56`; 
    return string.replace(new RegExp(regex), format); 
} 


console.log(format('111111', 'XX-XX-XX')); // 11-11-11 
console.log(format('111111', 'XX.XX.XX')); // 11.11.11 
console.log(format('1111111', 'XXX-XXXX')); // 111-1111 
console.log(format('111111', 'XX-XX-XX')); // 11-11-11 
console.log(format('111111', 'XX/XX/XX')); // 11/11/11 
console.log(format('123456789', 'XX/XX/XX')); // 12/34/56 (789 are cropped off.) 
+0

'格式('12345678','XX/XX/XX')'給出'12/34/5678'。這是打算嗎? –

+0

不是,但它是一個簡單的修復,編輯。 **編輯:**完成。 – Cerbrus