34 votes

nommé String.Format, est-ce possible ?

Au lieu d'utiliser {0} {1} etc. Je veux utiliser {title} à la place. Ensuite, remplissez ces données d'une manière ou d'une autre (ci-dessous, j'ai utilisé un fichier Dictionary ). Ce code est invalide et lève une exception. Je voulais savoir si je pouvais faire quelque chose de similaire à ce que je veux. En utilisant {0 .. N} n'est pas un problème. J'étais juste curieux.

Dictionary<string, string> d = new Dictionary<string, string>();
d["a"] = "he";
d["ba"] = "llo";
d["lol"] = "world";
string a = string.Format("{a}{ba}{lol}", d);

16voto

LPCRoy Points 420

Non, mais cette méthode d'extension le fera

static string FormatFromDictionary(this string formatString, Dictionary<string, string> valueDict) 
{
    int i = 0;
    StringBuilder newFormatString = new StringBuilder(formatString);
    Dictionary<string, int> keyToInt = new Dictionary<string,int>();
    foreach (var tuple in valueDict)
    {
        newFormatString = newFormatString.Replace("{" + tuple.Key + "}", "{" + i.ToString() + "}");
        keyToInt.Add(tuple.Key, i);
        i++;                    
    }
    return String.Format(newFormatString.ToString(), valueDict.OrderBy(x => keyToInt[x.Key]).Select(x => x.Value).ToArray());
}

7voto

Pavlo Neyman Points 3100

Vérifiez celui-ci, il supporte le formatage :

    public static string StringFormat(string format, IDictionary<string, object> values)
    {
        var matches = Regex.Matches(format, @"\{(.+?)\}");
        List<string> words = (from Match matche in matches select matche.Groups[1].Value).ToList();

        return words.Aggregate(
            format,
            (current, key) =>
                {
                    int colonIndex = key.IndexOf(':');
                    return current.Replace(
                        "{" + key + "}",
                        colonIndex > 0
                            ? string.Format("{0:" + key.Substring(colonIndex + 1) + "}", values[key.Substring(0, colonIndex)])
                            : values[key].ToString());
                });
    }

Comment l'utiliser :

string format = "{foo} is a {bar} is a {baz} is a {qux:#.#} is a really big {fizzle}";
var dictionary = new Dictionary<string, object>
    {
        { "foo", 123 },
        { "bar", true },
        { "baz", "this is a test" },
        { "qux", 123.45 },
        { "fizzle", DateTime.Now }
    };
StringFormat(format, dictionary)

4voto

eulerfx Points 16320

Vous pouvez mettre en œuvre le vôtre :

public static string StringFormat(string format, IDictionary<string, string> values)
{
    foreach(var p in values)
        format = format.Replace("{" + p.Key + "}", p.Value);
    return format;
}

3voto

Sean Carpenter Points 5588

Phil Haack a évoqué plusieurs méthodes pour y parvenir sur son blog il y a quelque temps : http://haacked.com/archive/2009/01/14/named-formats-redux.aspx . J'ai utilisé la version "Hanselformat" sur deux projets sans me plaindre.

3voto

fabriciorissetto Points 100

C'est possible maintenant

Avec Cordes interpolées de C# 6.0, vous pouvez le faire :

string name = "John";
string message = $"Hi {name}!";
//"Hi John!"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X