Y at-il un moyen de String.Format
un message sans avoir à spécifier {1}, {2},
etc? Est-il possible d'avoir une forme d'auto-incrément? (Similaire à vieux plaine printf
)Puis-je transmettre des paramètres à String.Format sans spécifier de nombres?
Répondre
Peur pas - où mettrait-il les objets dans la chaîne? En utilisant printf, vous devez toujours placer des spécificateurs quelque part.
Oui, cela ne me dérange pas d'utiliser des spécificateurs, mais je ne veux pas coder les index. –
@Hosam - est-ce dans le but d'intégrer d'autres chaînes de formatage dans des chaînes de formatage, puis en ajoutant tous les paramètres à un stade ultérieur? – BenAlabaster
@balabaster: non, c'est un appel à 'String.Format' pour insérer quelques variables. –
Vous pouvez utiliser une solution named string formatting, ce qui peut résoudre vos problèmes.
Merci. C'est bon à savoir à ce sujet. –
Il existe une méthode implémentation C# de printf available here
On pourrait toujours utiliser (non testé), mais je pense qu'il est plus complexe:
public static string Format(char splitChar, string format,
params object[] args)
{
string splitStr = splitChar.ToString();
StringBuilder str = new StringBuilder(format + args.Length * 2);
for (int i = 0; i < str.Length; ++i)
{
if (str[i] == splitChar)
{
string index = "{" + i + "}";
str.Replace(splitStr, index, i, 1);
i += index.Length - 1;
}
}
return String.Format(str.ToString(), args);
}
je suis venu avec cela, encore une fois, il est un peu encombrant mais cela fonctionne bien pour ce que je devais faire qui était de passer un nombre variable ou des arguments à ma propre fonction de la même manière que j'utiliserais WriteLine. J'espère que ça aide quelqu'un
protected void execute(String sql, params object[] args)
{
for (int i = 0; i < args.Count(); i++)
{
sql = sql.Replace(String.Format("{{{0}}}", i), args[i].ToString());
}
//...
}
pourriez-vous me dire dans quel programme vous l'avez mis en œuvre? Je voudrais faire une injection SQL. Donc, pour être honnête, vous devriez vraiment penser à remplacer ceci en utilisant le ['SqlParameter'] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx) dans le [' SqlCommand'] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx) – Oliver
Je pense que le meilleur moyen serait de passer les noms de propriété au lieu de Numbers. utiliser cette méthode:
using System.Text.RegularExpressions;
using System.ComponentModel;
public static string StringWithParameter(string format, object args)
{
Regex r = new Regex(@"\{([A-Za-z0-9_]+)\}");
MatchCollection m = r.Matches(format);
var properties = TypeDescriptor.GetProperties(args);
foreach (Match item in m)
{
try
{
string propertyName = item.Groups[1].Value;
format = format.Replace(item.Value, properties[propertyName].GetValue(args).ToString());
}
catch
{
throw new FormatException("The string format is not valid");
}
}
return format;
}
Imaginez que vous avez une classe d'étudiant avec des propriétés telles que: Nom, LastName, BirthDateYear et de l'utiliser comme:
Student S = new Student("Peter", "Griffin", 1960);
string str = StringWithParameter("{Name} {LastName} Born in {BithDate} Passed 4th grade", S);
et vous obtiendrez: Peter Griffin né en 1960 a passé la 4ème année.
Si quelqu'un est intéressé, j'ai modifié la solution de Ashkan pour pouvoir l'exécuter sous WinRT:
/// <summary>
/// Formats the log entry.
/// /// Taken from:
/// http://stackoverflow.com/questions/561125/can-i-pass-parameters-to-string-format-without-specifying-numbers
/// and adapted to WINRT
/// </summary>
/// <param name="format">The format.</param>
/// <param name="args">The arguments.</param>
/// <returns></returns>
/// <exception cref="System.FormatException">The string format is not valid</exception>
public static string FormatLogEntry(string format, object args)
{
Regex r = new Regex(@"\{([A-Za-z0-9_]+)\}");
MatchCollection m = r.Matches(format);
var properties = args.GetType().GetTypeInfo().DeclaredProperties;
foreach (Match item in m)
{
try
{
string propertyName = item.Groups[1].Value;
format = format.Replace(item.Value, properties.Where(p=>p.Name.Equals(propertyName))
.FirstOrDefault().GetValue(args).ToString());
}
catch
{
throw new FormatException("The string format is not valid");
}
}
return format;
}
- 1. Flex: Transmettre des paramètres à plusieurs applications
- 2. Comment puis-je transmettre plusieurs paramètres à un tableau de paramètres dans une extension MarkFWext?
- 3. String.Format considère les paramètres régionaux ou non?
- 4. Comment transmettre des paramètres à un sous-programme?
- 5. Comment spécifier des actions sans utiliser d'aide
- 6. Comment puis-je transmettre des paramètres à une page Web à l'aide de formulaires Oracle?
- 7. Comment transmettre des variables ou des paramètres à un package à partir de .NET?
- 8. String.format()
- 9. Comment transmettre plusieurs paramètres de chaîne à un script PowerShell?
- 10. Stockage des paramètres sans base de données
- 11. Comment transmettre des paramètres au rapport SSRS par programme
- 12. Comment comparer les nombres flottants dépendants des paramètres régionaux?
- 13. Comment transmettre des paramètres dans eval sous forme d'objet?
- 14. Transmettre le type de variable à une méthode sans énumérer
- 15. Typedef une classe de modèle sans spécifier les paramètres de modèle
- 16. Comment transmettre plusieurs paramètres à une requête logparser sql?
- 17. Transmettre les paramètres $ _GET [] à un script avec Jumi?
- 18. Transmettre des données à swingWorker?
- 19. Comment puis-je transmettre tous les paramètres à un décorateur?
- 20. Inverser de String.Format?
- 21. Comment transmettre des paramètres à un fichier jar au moment de l'exécution?
- 22. Est-il correct de transmettre des paramètres à une méthode Factory?
- 23. Puis-je transmettre des paramètres à partir de et .swf externe en utilisant Actionscript 3.0?
- 24. Tableau de passes XSLT de nombres entiers
- 25. Echapper guillemet dans String.Format()
- 26. y compris les fichiers sans avoir à spécifier $ _SERVER [ « DOCUMENT_ROOT »]
- 27. Comment spécifier un fichier à transmettre à un processus Java exécuté par une tâche Ant?
- 28. ASP.NET MVC Transmettre plusieurs paramètres de getJson au contrôleur
- 29. Comment transmettre des données à un UITabBarController
- 30. Transmettre des ensembles de données
Quel est le but de ne pas utiliser les numéros? Peut-être que si nous pouvons suivre la raison pour laquelle vous voulez éviter de les utiliser, nous vous aiderons avec une solution plus utile ... – BenAlabaster
J'ai environ 20 paramètres, et écrire un nombre pour chacun est lourd. J'ai également peur de manquer un numéro ou d'utiliser un numéro deux fois. Et je pense que la maintenabilité sans chiffres peut être plus facile. –
Compréhensible je suppose ... Je trouve toujours laborieux si je veux encore incorporer des cordes formatées dans d'autres chaînes encore à être formatées ... et ensuite ajouter les params à la fin du processus qui a aussi les mêmes inconvénients. – BenAlabaster