如何将布尔值通用格式化为“是”/“否”字符串?

51

我希望根据布尔变量在不同语言中显示“是/否”。
有没有一种通用的方式可以根据传递给它的语言环境进行格式化?
如果没有,除了boolVar ? Resources.Yes : Resources.No之外,还有什么标准的格式化布尔值的方法。
我猜测boolVar.ToString(IFormatProvider)会被使用。
我的猜测正确吗?


什么类型的应用程序,是WinForm,还是ASP.NET……? - V4Vendetta
3
@V4Vendetta:这有关系吗?问题是由框架引起的。在这种情况下,是ASP.NET MVC,但后来也可能是winforms或WPF。 - the_drow
你可以在user32.dll中找到Yes/No的本地化版本:https://dev59.com/gFXTa4cB1Zd3GeqP6fWd#5577735 - Maxence
1
我为此创建了一个UserVoice,请前往投票 - Martin Brown
4个回答

76
据我所知,该框架本身不会为您提供此功能。将true/false翻译为yes/no似乎并不比其他潜在的翻译方式更常见(如on/offchecked/uncheckedread-only/read-write或其他方式)。
我认为最简单的方法是创建一个扩展方法,包装您在问题中提出的构造函数。
public static class BooleanExtensions
{
    public static string ToYesNoString(this bool value)
    {
        return value ? Resources.Yes : Resources.No;
    }
}

使用方法:

bool someValue = GetSomeValue();
Console.WriteLine(someValue.ToYesNoString());

我已经在做了,但我想知道是否有更好的解决方案。 - the_drow
3
为可空布尔值添加此重载到类中:public static string ToYesNoString(this bool? value) { return value.HasValue ? value.Value.ToYesNoString() : String.Empty; } (说明:该代码是为一个类增加的方法,可以将可空布尔值转换为“是”或“否”的字符串表示形式,并在值为空时返回空字符串。) - Jimmy

56

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

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

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

以下是返回on / OFF的示例:

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

返回:

truth   = on
unTruth = OFF

7
这个技巧很不错,但有些取巧,所以我会保留已接受的答案。非常感谢你的帮助。 - the_drow
3
比使用GetHashCode()更好的方法是使用Convert.ToInt32(value);它也会返回0和1。 - daveidmx
在ASP.NET中,可以通过FormatString属性来实现这个技巧,比如GridViewBoundField.DataFormatString。只需在模型中添加一个Byte(或Int16或Int32等)属性,返回布尔值的数字转换即可。就是这样。非常感谢。 - T-moty
https://github.com/dotnet/corefx/issues/8126 允许布尔值使用自定义格式字符串。该问题目前被标记为“将来里程碑”。 - jhamm
Boolean.GetHashCode() 的代码就是 value ? 1 : 0,所以你只是通过使用它来添加更多的条件评估。我看不出有什么意义。(在速度上你永远不会注意到差别,只会更加混乱而没有任何好处) - Gabriel Luci
这个技巧是一种有用的性能改进器,适用于使用相同格式字符串技术的分析服务Tabular模型。客户端通过.NET格式字符串高效地格式化少量数据。一个好的技巧! - Brett

11

很遗憾,Boolean.ToString(IFormatProvider)在这里没有帮助:

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

无论如何,布尔值表示True和False,而不是Yes和No。如果您想将True映射为Yes和False映射为No(包括本地化),则必须自己完成;框架中没有内置支持。您提议的解决方案(Resources.Yes/No)看起来很好。


7

我的 Razor 页面中正在运行以下代码:

@(item.Active.GetValueOrDefault() ? "是" : "否")

在这里,重要的是属性是否为必填项(可为 null),如果是必填项,则应使用以下代码:

@(item.Active ? "Yes":"No")

我在另一个帖子上找到了这个,并进行了回复,希望能帮助到某些人。


非常好,谢谢。我在我的控制器中用它来提取Excel。sw.WriteLine(string.Format(""{0}" ... ", item.IsCycle1 ? "1" : "", ... )) - ARLibertarian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接