2010-07-23 6 views
10

Znam to naprawdę głupie pytanie.JavaScript: Jak uzyskać wartość w łańcuchu reprezentowanym przez% s, a następnie zastąpić ją wartością

Mam dobre kilka lat doświadczenia z javascript, ale ta jedna rzecz zdaje się pomijać mój umysł, moja głowa zgasła i nie pamiętam jak to się nazywa i jak bym to robił.

Zasadniczo co szukam jest, gdy masz zmienną string takie jak:

var error_message = "An account already exists with the email: %s" 

I następnie przekazać ciąg jakoś w to i to zastępuje% s.

Prawdopodobnie brzmi to naprawdę idiotycznie, ale naprawdę doceniam pomoc/przypomnienie!

Dzięki chłopaki.

Odpowiedz

9

po prostu użyć metody replace:

error_message = error_message.replace('%s', email); 

ten zastąpi tylko pierwsze wystąpieniu, jeśli chcesz zastąpić wiele wystąpień, używasz wyrażenie regularne, aby można było określić globalny (g) Bandera:

error_message = error_message.replace(/%s/g, email); 
2
+0

Dzięki, na pewno będę zakładkę to w przyszłości. To tam się pomyliłem, między PHP a Javascriptem, myśląc, że istnieje wbudowana funkcja. Dla bieżącego projektu wystarczy użyć funkcji zamiany. – jbx

+0

zaleca się zamknąć, ponieważ łącze jest zerwane, usuwając dowolną wartość z tej odpowiedzi –

+0

Link wydaje się być w tej chwili w górze. Wydaje się być rozsądną implementacją sprintf. Nie jestem pewien, czy możliwe jest zawarcie "istotnych części" bez uwzględnienia całości. – AShelly

0

poniżej

var error_message = "An account already exists with the email: %s" 

var myNewString = error_message.replace(" %s", newdata); 

Przykład

<script type="text/javascript"> 
var visitorName = "Chuck"; 
var myOldString = "Hello username! I hope you enjoy your stay username."; 
var myNewString = myOldString.replace("username", visitorName); 

document.write("Old string = " + myOldString); 
document.write("<br />New string = " + myNewString); 

</script> 

wyjściowy powyżej.

Stary ciąg = Witaj nazwę użytkownika! Mam nadzieję, że spodoba Ci się nazwa użytkownika Twojego pobytu.
Nowy ciąg = Witaj Chuck! Mam nadzieję, że spodoba Ci się nazwa użytkownika Twojego pobytu.

+0

@mkoryak, on nie używa regex .. –

1

Nie ma nic takiego jak funkcja C printf() lub PHP sprintf() wbudowana w JavaScript. Istnieje metoda replace() obiektu typu string, która może być użyta do zastąpienia jednej rzeczy inną, która może być użyta w tym konkretnym przypadku, ale jest ograniczona.

Istnieje kilka implementacji wokół innych, które napisano, które obejmują podzbiór zachowania sprintf().

1

Właśnie napisał nową funkcję do obsługi to:

function sprint(str, o) { 
    if (typeof str !== "string" || typeof o !== "object") { 
     return; 
    } 
    var regex = /%s\(([a-zA-Z0-9_]{1,15})\)/g, 
     i; 
    if (regex.test(str)) { 
     str = str.replace(regex, function (found, match) { 
      return o[match]; 
     }); 
    } else { 
     for (i in o) { 
      str = str.replace(/%s/, o[i]); 
     } 
    } 
    return str; 
} 

i kilka testów:

// Ordered Array mode 
var s0 = sprint("This is %s %s call, using an %s in order", ["a", "function", "array"]); 

// Ordered|Unordered Obejct Literal mode 
var s1 = sprint("This is a %s(sw) function, %s(ma)! You need to %s(ch) this out...", { 
    ma: "mang", 
    sw: "sweet", //This is purposely out of order 
    ch: "check" 
}); 

console.log(s0); 
console.log(s1); 

https://gist.github.com/mbjordan/5807011

+0

Dzięki to działa. Bardzo przydatne, gdy masz tablicę łańcuchów do mapowania dla każdego% s% s% s ... – JLavoie

3

Poniżej znajduje się przykład, dzięki.

/** 
* @param {String} template 
* @param {String[]} values 
* @return {String} 
*/ 
function sprintf(template, values) { 
    return template.replace(/%s/g, function() { 
    return values.shift(); 
    }); 
} 

Przykład użycia:

sprintf('The quick %s %s jumps over the lazy %s', [ 
    'brown', 
    'fox', 
    'dog' 
]); 

produktowa:

"The quick brown fox jumps over the lazy dog" 
+0

Właśnie tego szukałem, dzięki! – Brady

+0

Nie ma za co, dzięki Brady –

7

rozwiązanie 'Nowoczesne' ES6: stosować szablon literały. Zwróć uwagę na backticks!

var email = '[email protected]'; 
var error_message = `An account already exists with the email: ${email}`; 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals

+0

Uwaga: działa to tylko wtedy, gdy 'email' jest w zasięgu. Jeśli planujesz zapisywać sformatowane wiadomości w innym kontekście (takim jak i18n lub plik zasobów), to nie zadziała. –

Powiązane problemy