2010-12-13 6 views
0

하나 이상의 자리 표시자를 포함하는 문자열 (ASP.NET에서 제공)이 있습니다.어떻게 .NET 문자열 자리 표시자를 javascript의 실제 값으로 대체 할 수 있습니까?

var str = "aaa {0} bbb {1} ccc {2:0.0}"; 
var result = string.Format(str, new [] {1, 2, 33.123}); 

가 지금은 자바 스크립트에서 동일한 작업을 수행해야하지만, 나는 정규 표현식과 사투를 벌인거야 : .NET에서 나는 실제 값으로 자리를 대체하기 위해 인 String.format() 메소드를 사용하고 있습니다. 다음 함수는 "{0}"와 같은 간단한 자리에 잘 작동하지만 더 복잡한 같은 사람 "{3 : 0.0}"실패 복잡한 자리에 대한

function FormatString(txt, args) { 
    for (i = 0; i < args.length; i++) { 
    txt = txt.replace('{' + i + '}', args[i]); 
    } 
    return txt; 
} 

//e.g: 
FormatString("aa {0} bb {1} cc", [1, 2]); 
// returns "aa 1 bb 2 cc" 

, 나는 이용할 수 있도록 기능을 수정하려고 정규식,하지만 지금까지 나는 일하는 RegExp를 생각해 내지 못했습니다. 이것은 내가 시도한 것입니다 :

function FormatString2(txt, args) { 
    for (i = 0; i < args.length; i++) { 
    txt = txt.replace(new RegExp('{' + i + '.*}'), args[i]); 
    } 
    return txt; 
} 

// does not work correctly, i.e: 
FormatString2("aa {0:0.0} bb {1} cc", [1, 2]); 
// returns "aa 1 cc" instead of "aa 1 bb 2 cc" 

어떤 힌트를 적절하게 바꾸려면 어떻게합니까? (RegExp 사용). 나는 작동하는 것 같다 해결책을 찾은 것 같아요 좀 더 인터넷 검색 후

+0

이미 포맷 된 문자열을 다시 전달할 수있는 방법이 있습니까? – hunter

+0

@ 헌터 : 불행히도 안돼. 그렇지 않으면 나는 자바 스크립트와 정규식으로 싸우지 않을 것이다 :-) – M4N

답변

1

확인 :

function FormatString2(txt, args) { 
    for (i = 0; i < args.length; i++) { 
    txt = txt.replace(new RegExp('{' + i + '[^}]*}'), args[i]); 
    } 
    return txt; 
} 
0

sprintf많은 구현 자바 스크립트에 -하지만 당신이 구문을 선호하는 경우, 당신은거야

// Define unchanging values outside of any function call: 
var formatter = /{(\d+)([^}]*)}/g; 
// If the colon is the flagging character, then you'll want: 
// /{(\d+):?([^}]*)}/g 
var modes = function(mode) { 
    switch (mode) { 
    case "0.0": 
     return function(str) { /* do something with the string here */ }; 
    // Additional cases go here. 
    default: 
     return function(str) { return str; }; 
    } 
}; 
function replacer(key, mode) { 
    return modes(mode)(args[key]) 
} 

function FormatString(txt, args) { 
    var l = args.length, i = 1; 
    while (i < l) { 
    txt = txt.replace(formatter, replacer); 
    } 
    return txt; 
} 

당신은 또한 기능보다는 객체 리터럴을 사용하고 replacer에 체크 깃발을 할 수같은 플래그 사이에 번역 : (안된) 이런 식으로 뭔가를 원하는과 키 (예 : decimal-number). 그것은 모두 당신이 필요로하는 강력한 솔루션에 달려 있습니다.

관련 문제