number money ejemplo before c# .net string string-formatting

money - string.format c# number



¿Existe un "String.Format" que puede aceptar parámetros de entrada con nombre en lugar de marcadores de posición de índice? (9)

Con C # 6 puede usar la Interpolación de cadenas para agregar directamente variables a una cadena.

Por ejemplo:

string name = "List"; int age = 10; var str = $"Her name is {name} and she''s {age} years old";

Tenga en cuenta que el uso del signo de dólar ( $ ) antes del formato de cadena.

Esta pregunta ya tiene una respuesta aquí:

Esto es lo que se

str = String.Format("Her name is {0} and she''s {1} years old", "Lisa", "10");

Pero quiero algo como

str = String("Her name is @name and she''s @age years old"); str.addParameter(@name, "Lisa"); str.addParameter(@age, 10);


En C # 6 puede usar la interpolación de cadenas :

string name = "Lisa"; int age = 20; string str = $"Her name is {name} and she''s {age} years old";

Como Doug Clutter mencionó en su comentario , la interpolación de cadenas también admite el formato de cadenas . Es posible cambiar el formato especificándolo después de dos puntos. El siguiente ejemplo generará un número con una coma y 2 decimales:

var str = $"Your account balance is {balance:N2}"

Como Bas mencionó en su respuesta , la interpolación de cadenas no admite cadenas de plantilla. En realidad, no tiene soporte incorporado para eso. Afortunadamente existe en algunas grandes bibliotecas.

SmartFormat.NET por ejemplo, admite el marcador de posición con nombre:

Smart.Format("{Name} from {Address.City}, {Address.State}", user) // The user object should at least be like that public class User { public string Name { get; set; } public Address Address { get; set; } } public class Address { public string City { get; set; } public string State { get; set; } }

Está disponible en NuGet .

Mustache también es una gran solución. Bas ha descrito bien sus ventajas en su respuesta .


Entonces, ¿por qué no solo reemplazar?

string str = "Her name is @name and she''s @age years old"; str = str.Replace("@name", "Lisa"); str = str.Replace("@age", "10");


La interpolación de cadenas es una buena solución, sin embargo, requiere C # 6.

En tal caso estoy usando StringBuilder

var sb = new StringBuilder(); sb.AppendFormat("Her name is {0} ", "Lisa"); sb.AppendFormat("and she''s {0} years old", "10"); // You can add more lines string result = sb.ToString();


No hay una forma integrada de hacerlo, pero puede escribir una clase que lo haga por usted.
Algo como esto puede ayudarlo a comenzar:

public class ParameterizedString { private string _BaseString; private Dictionary<string, string> _Parameters; public ParameterizedString(string baseString) { _BaseString = baseString; _Parameters = new Dictionary<string, string>(); } public bool AddParameter(string name, string value) { if(_Parameters.ContainsKey(name)) { return false; } _Parameters.Add(name, value); return true; } public override string ToString() { var sb = new StringBuilder(_BaseString); foreach (var key in _Parameters.Keys) { sb.Replace(key, _Parameters[key]); } return sb.ToString(); } }

Tenga en cuenta que este ejemplo no fuerza ninguna convención de nombre de parámetro. Esto significa que debe tener mucho cuidado al elegir los nombres de sus parámetros; de lo contrario, podría terminar reemplazando partes de la cadena que no pretendía.


Si está bien asignando una variable local que contenga los datos que usa para reemplazar los parámetros de la plantilla, puede usar la función de interpolación de cadenas C # 6.0.

El principio básico es que puede hacer una lógica de reemplazo de cadena bastante avanzada basada en datos de entrada.

Ejemplo simple:

string name = "John"; string message = $"Hello, my name is {name}."

Ejemplo complejo:

List<string> strings = ... string summary = $"There are {strings.Count} strings. " + $"The average length is {strings.Select(s => s.Length).Average()}"

Inconvenientes:

  • No hay soporte para plantillas dinámicas (por ejemplo, desde un archivo de recursos)

Ventajas (principales):

  • Aplica controles de tiempo de compilación en su reemplazo de plantilla.

Una buena solución de código abierto que tiene casi la misma sintaxis es Mustache . Tiene dos implementaciones disponibles de C # de lo que pude encontrar: mustache-sharp y Nustache .

He trabajado con mustache-sharp y descubrí que no tiene el mismo poder que la interpolación de cuerdas, pero se acerca. Por ejemplo, puede hacer lo siguiente (robado de su página de github).

Hello, {{Customer.Name}} {{#newline}} {{#newline}} {{#with Order}} {{#if LineItems}} Here is a summary of your previous order: {{#newline}} {{#newline}} {{#each LineItems}} {{ProductName}}: {{UnitPrice:C}} x {{Quantity}} {{#newline}} {{/each}} {{#newline}} Your total was {{Total:C}}. {{#else}} You do not have any recent purchases. {{/if}} {{/with}}


Si no tiene C # 6 disponible en su proyecto, puede usar Linq''s .Aggregate ():

var str = "Her name is @name and she''s @age years old"; var parameters = new Dictionary<string, object>(); parameters.Add("@name", "Lisa"); parameters.Add("@age", 10); str = parameters.Aggregate(str, (current, parameter)=> current.Replace(parameter.Key, parameter.Value.ToString()));

Si desea algo que coincida con la sintaxis específica en la pregunta, puede armar una clase bastante simple basada en Agregado:

public class StringFormatter{ public string Str {get;set;} public Dictionary<string, object> Parameters {get;set;} public StringFormatter(string p_str){ Str = p_str; Parameters = new Dictionary<string, object>(); } public void Add(string key, object val){ Parameters.Add(key, val); } public override string ToString(){ return Parameters.Aggregate(Str, (current, parameter)=> current.Replace(parameter.Key, parameter.Value.ToString())); } }

Utilizable como:

var str = new StringFormatter("Her name is @name and she''s @age years old"); str.Add("@name", "Lisa"); str.Add("@age", 10); Console.WriteLine(str);

Tenga en cuenta que este es un código de aspecto limpio que está orientado a ser más fácil de entender que el rendimiento.


También puede usar expresiones con la interpolación de cadenas de C # 6:

string name = "Lisa"; int age = 20; string str = $"Her name is {name} and she''s {age} year{(age == 1 ? "" : "s")} old";


string name = "Lisa"; int age = 20; string str = $"Her name is {name} and she''s {age} years old";

Esto se llama una cadena interpolada , que es básicamente una cadena de plantilla que contiene expresiones dentro de ella.