如何将布尔值一般格式化为是/否字符串?

the*_*row 45 c# formatting coding-style string-formatting

我想根据一些布尔变量在不同的语言中显示是/否.
是否有一种通用的方法根据传递给它的语言环境对其进行格式化?
如果没有,那么格式化布尔值的标准方法是什么boolVar ? Resources.Yes : Resources.No.
我猜这boolVar.ToString(IFormatProvider)涉及到了.
我的假设是否正确?

Fre*_*örk 61

框架本身并没有为你提供这个(据我所知).翻译true/falseyes/no不罢工我比其他潜在的翻译更常见(如on/off,checked/unchecked,read-only/read-write或其他).

我想,封装行为的最简单方法是创建一个扩展方法,它包含你在问题中建议的构造:

public static class BooleanExtensions
{
    public static string ToYesNoString(this bool value)
    {
        return value ? Resources.Yes : Resources.No;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

bool someValue = GetSomeValue();
Console.WriteLine(someValue.ToYesNoString());
Run Code Online (Sandbox Code Playgroud)

  • 对于可空的bool,将这个重载添加到类中:public static string ToYesNoString(this bool?value){return value.HasValue?value.Value.ToYesNoString():String.Empty; } (3认同)

jha*_*amm 44

正如其他答案所示,框架不允许布尔值具有自定义格式化程序.但是,它确实允许数字具有自定义格式.布尔值上的GetHashCode方法将返回1表示true,0表示false.

根据MSDN自定义数字格式字符串,当有3个部分";"时 指定的格式将应用于"正数;负数;零".

可以在bool值上调用GetHashCode方法以返回一个数字,以便您可以使用自定义数字格式字符串返回Yes/No或On/Off或该情况所需的任何其他单词集.

这是一个返回开/关的示例:

var truth   = string.Format("{0:on;0;OFF}", true.GetHashCode());
var unTruth = string.Format("{0:on;0;OFF}", false.GetHashCode());
Run Code Online (Sandbox Code Playgroud)

收益:

truth   = on
unTruth = OFF
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常好的技巧,但它是hackish所以我保持已接受的答案.非常感谢你. (6认同)
  • 比GetHashCode()更少的hackish是使用Convert.ToInt32(value); 它也会返回0和1. (2认同)

Hei*_*nzi 11

不幸的是,Boolean.ToString(IFormatProvider)在这里没有帮助:

提供参数被保留.它不参与此方法的执行.这意味着与大多数带有provider参数的方法不同,Boolean.ToString(IFormatProvider)方法不反映特定于文化的设置.

在任何情况下,布尔代表是真和假,而不是是和否.如果你想映射真 - >是和假 - >否,你必须自己做(包括本地化); 框架中没有内置的支持.您提出的解决方案(Resources.Yes/No)对我来说很好.


小智 5

在我的剃须刀页面中是这样工作的: @(item.Active.GetValueOrDefault() ? "Yes" : "No")

如果属性是必需的(可为空的)与否,这里很重要,如果需要,它应该适合:

@(item.Active ? "Yes":"No")
Run Code Online (Sandbox Code Playgroud)

我在其他一些帖子中找到了这个,只是重播,希望它对某些人有所帮助。