separador number miles ejemplo c# string.format

c# - number - llamado String.Format, ¿es posible?



string.format c# number (9)

En lugar de usar {0} {1} , etc. quiero usar {title} lugar. Luego llene los datos de alguna manera (a continuación utilizo un Dictionary ). Este código no es válido y lanza una excepción. Quería saber si puedo hacer algo similar a lo que quiero. Usar {0 .. N} no es un problema. Solo tenía curiosidad.

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);


Es posible ahora

Con las cadenas interpoladas de C # 6.0 puede hacer esto:

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


(su Dictionary + foreach + string.Replace) envuelto en una sub-rutina o método de extensión?

Obviamente no optimizado, pero ...


Aquí hay una buena solución que es muy útil al formatear correos electrónicos: http://www.c-sharpcorner.com/UploadFile/e4ff85/string-replacement-with-named-string-placeholders/

Editado:

public static class StringExtension { public static string Format( this string str, params Expression<Func<string,object>>[] args) { var parameters = args.ToDictionary( e=>string.Format("{{{0}}}",e.Parameters[0].Name), e=>e.Compile()(e.Parameters[0].Name)); var sb = new StringBuilder(str); foreach(var kv in parameters) { sb.Replace( kv.Key, kv.Value != null ? kv.Value.ToString() : ""); } return sb.ToString(); } }

Ejemplo de uso:

public string PopulateString(string emailBody) { User person = _db.GetCurrentUser(); string firstName = person.FirstName; // Peter string lastName = person.LastName; // Pan return StringExtension.Format(emailBody.Format( firstname => firstName, lastname => lastName )); }



Marque esta, soporta el formateo:

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()); }); }

Cómo utilizar:

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)


No, pero este método de extensión lo hará.

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()); }



Puede implementar su propio:

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


static public class StringFormat { static private char[] separator = new char[] { '':'' }; static private Regex findParameters = new Regex( "//{(?<param>.*?)//}", RegexOptions.Compiled | RegexOptions.Singleline); static string FormatNamed( this string format, Dictionary<string, object> args) { return findParameters.Replace( format, delegate(Match match) { string[] param = match.Groups["param"].Value.Split(separator, 2); object value; if (!args.TryGetValue(param[0], out value)) value = match.Value; if ((param.Length == 2) && (param[1].Length != 0)) return string.Format( CultureInfo.CurrentCulture, "{0:" + param[1] + "}", value); else return value.ToString(); }); } }

Un poco más complicado que el otro método de extensión, pero esto también debería permitir valores de cadenas y patrones de formato utilizados en ellos, por lo que en su ejemplo original:

Dictionary<string, object> d = new Dictionary<string, object>(); d["a"] = DateTime.Now; string a = string.FormatNamed("{a:yyyyMMdd-HHmmss}", d);

También funcionará ...