【问题标题】:How can I tell if a .Net format string is valid? [duplicate]如何判断 .Net 格式字符串是否有效? [复制]
【发布时间】:2021-02-18 03:31:15
【问题描述】:

.Net 包含一个wide range of built in formatters,用于在将对象转换为字符串时控制输出,例如ToString("N2")。如何测试给定的格式字符串是否真的有效?

如果我传递垃圾格式化程序ToString(...),那么输出似乎是该格式化程序的文字。例如(在我的en 语言环境中):

10.ToString("F");    // Outputs '10.00'
10.ToString("typo"); // Outputs 'typo'

我正试图发现格式已在我们的一个翻译中被覆盖(可能由非开发人员)并且格式被意外拼写错误的情况。

一个无效的格式化程序毫无例外地被允许通过似乎很奇怪,更奇怪的是,当这种情况发生时,无效的格式化程序被用作输出而不是回退到源对象。

【问题讨论】:

  • 您将如何区分错误格式字符串与覆盖 ToString 的情况?
  • 编写单元测试预期输出
  • 谢谢@41686d6564 - 我在搜索时没有看到。验证列表的蛮力方法将涵盖我们需要的内容。虽然实现起来会相当冗长,因为我们不仅限于数字类型,而是所有内置函数。
  • 它可能不是我们想要的,但"typo" 一个有效的格式字符串。参见the docs about character literals,关于“所有其他字符...”的部分
  • @AndySavage 请注意,如果您只是不将格式化字符串放入本地化资源中,那么整个问题就会消失......在代码中保持格式化并在本地化字符串中仅使用非格式化 "The value is {0}" 占位符。

标签: c# .net


【解决方案1】:

请注意确定这是否真的是最好的方法,但请使用types that implement IFormattable

注意:在某些格式中,这可能会给您带来误报和意外行为。唯一的其他选择是创建一个白名单(在任何实现中都同样有缺陷)

public static bool TryFormat<T>(this T target, string format, out string result)
   where T : IFormattable
{
   result = null;
   try
   {
      return (result = target.ToString(format,null)) != format;
   }
   catch 
   {
      return false;
   }
}

用法

if(!10.TryFormat("Typo", out var test))
   Console.WriteLine("yeah nah");

【讨论】:

  • DateTime 实现了IFormattable,但将无法通过此测试,因为Typo 中的y 将被解释为the "y custom format specifier。我认为其他类型及其各自的令牌也会出现类似问题。
  • @MattJohnson-Pint 确实你是对的。我应该提出一个很大的免责声明
  • @00110001 哦,如果你要被任何人纠正,至少它的 jon skeet nodatime Microsoftie 等效!祝你们两个美好的一天。
猜你喜欢
  • 2010-11-14
  • 1970-01-01
  • 2010-10-12
  • 2012-08-04
  • 2017-01-29
  • 2010-09-21
  • 1970-01-01
  • 2020-08-26
相关资源
最近更新 更多