2010-12-13 33 views
0

J'ai une chaîne (provenant d'ASP.NET) qui contient un ou plusieurs espaces réservés. Dans .NET J'utilise la méthode string.Format() pour remplacer les espaces réservés aux valeurs réelles:Comment remplacer les espaces réservés .NET par des valeurs réelles dans javascript?

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

Maintenant, je dois faire la même chose en javascript, mais je me bats avec l'expression régulière. La fonction suivante fonctionne très bien pour les espaces réservés simples comme « {0} », mais échoue pour les plus complexes comme « {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" 

Pour les espaces réservés complexes, j'ai essayé de modifier ma fonction à utiliser expressions régulières, mais jusqu'à présent, je n'ai pas réussi à trouver un RegExp qui fonctionne. Voilà ce que j'ai essayé:

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" 

Les conseils comment remplacer correctement ces espaces réservés .NET en javascript (en utilisant RegExp ou non)?

+0

Y a-t-il un moyen de retransmettre les chaînes déjà formatées? – hunter

+0

@hunter: non malheureusement pas. Sinon je ne me battrais pas avec javascript et regexp :-) – M4N

Répondre

1

Ok après un peu plus googler, je suppose que je trouve une solution qui semble fonctionner:

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

Il y a beaucoup implémentations de sprintf en JavaScript - mais si vous préférez cette syntaxe, alors vous veulent quelque chose comme ça (non testé):

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

Vous pouvez également utiliser un objet littéral plutôt que d'une fonction et faire votre drapeau dans le contrôle replacer traduire entre drapeaux comme 0.0 et une clé (comme decimal-number). Tout dépend de la robustesse d'une solution dont vous avez besoin.