fork download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text.RegularExpressions;
  4.  
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var p = new Product("A123456", "hogehoge");
  10. Console.WriteLine(p.ToString("%y年%m月%d日 - %c - %n"));
  11. Console.ReadKey();
  12.  
  13. }
  14. }
  15.  
  16. class SymbolTranslator
  17. {
  18. private Dictionary<string, Func<string>> mRuleTable
  19. = new Dictionary<string, Func<string>>();
  20.  
  21. public void AddRule(string symbol, Func<string> func)
  22. {
  23. mRuleTable.Add(symbol, func);
  24. }
  25.  
  26. public void AddRule(string symbol, string translation)
  27. {
  28. mRuleTable.Add(symbol, () => translation);
  29. }
  30.  
  31. public string Translate(string symbol)
  32. {
  33. return mRuleTable.ContainsKey(symbol) ? mRuleTable[symbol]() : symbol;
  34. }
  35. }
  36.  
  37. class Product : IFormattable
  38. {
  39. SymbolTranslator mTranslator = new SymbolTranslator();
  40.  
  41. public Product(string code, string name)
  42. {
  43. Code = code; Name = name;
  44. mTranslator.AddRule("c", code);
  45. mTranslator.AddRule("n", name);
  46. mTranslator.AddRule("y", () => DateTime.Now.ToString("yyyy"));
  47. mTranslator.AddRule("m", () => DateTime.Now.ToString("MM"));
  48. mTranslator.AddRule("d", () => DateTime.Now.ToString("dd"));
  49.  
  50. }
  51.  
  52. public string Code { get; private set; }
  53. public string Name { get; private set; }
  54.  
  55. // Object.ToStringのオーバーライド
  56. public override string ToString()
  57. {
  58. // 書式と書式プロバイダを指定せずにToStringを呼ぶ
  59. return ToString("", null);
  60. }
  61.  
  62. public string ToString(string format)
  63. {
  64. // 書式プロバイダを指定せずにToStringを呼ぶ
  65. return ToString(format, null);
  66. }
  67. public string ToString(string format, IFormatProvider formatProvider)
  68. {
  69. var regex = new Regex(@"(?<pre>[^%]*)%(?<symbol>[^%])");
  70. return regex.Replace(format, Evaluator);
  71. }
  72.  
  73. private string Evaluator(Match m)
  74. {
  75. return m.Groups["pre"].Value + mTranslator.Translate(m.Groups["symbol"].Value);
  76. }
  77. }
  78.  
Success #stdin #stdout 0.08s 21804KB
stdin
Standard input is empty
stdout
2020年02月02日 - A123456 - hogehoge