抛出异常时,我经常传入一个格式化的字符串,该字符串公开有关已发生问题的详细信息.如果可能的话,我总是指定格式化提供程序(这是一种很好的做法,因为否则您可能会忘记确定哪种文化是合适的,并且默认情况下是当前文化,这可能会导致许多错误).
这是一个例子:
throw new InvalidOperationException(
string.Format(
CultureInfo.CurrentCulture,
"{0} is a bad number.",
number));
Run Code Online (Sandbox Code Playgroud)
我很想使用CurrentCulture
,如上所示,因为异常消息是针对人类的(当然,代码永远不会对异常消息本身起作用).消息将使用客户端的文化格式化,因此每当我需要将其显示给我的客户端时,它看起来很不错.
但是,除了向用户显示消息外,还可以将异常记录到日志文件中.我看到很多邮件都放在我的日志文件中,各种文化用于格式化它们.蛮丑的!在这种情况下,InvariantCulture
更合适或者可能是托管日志文件的服务器的文化.
这里的要点是,在格式化异常时,您永远不会知道您的受众,因此在格式化时似乎无法确定要使用的文化.如果能够将格式推迟到捕获异常的位置,那将会很棒,但这将远远超出.NET中实现异常的方式.
那你对此有何看法?
所以,我有一些资源文件用于本地化.它们是可以格式化的字符串.
例如:
MyResource.resx
Title: "MyApp - Ver: {0}"
Run Code Online (Sandbox Code Playgroud)
我然后通过这样做返回它:
public String Title
{
get { return String.Format(CultureInfo.CurrentUICulture, MyResources.Title, 1); }
}
Run Code Online (Sandbox Code Playgroud)
我理解CurrentUICulture和CurrentCulture之间的区别,但是FxCop告诉我使用CurrentCulture吗?
c# cultureinfo string-formatting currentculture currentuiculture
我在当前项目中做了一些全球化工作,我遇到了一个奇怪的行为.我在Windows 7上运行,只安装了英语 - 美国,我的应用程序在.NET 3.5上运行.
给出以下代码段:
var culture = new CultureInfo("zh-CN", true);
var formats = culture.GetAllDateTimePatterns('D');
Run Code Online (Sandbox Code Playgroud)
在.NET 4下,返回以下格式:
yyyy'?'M'?'d'?'
yyyy'?'M'?'d'?',dddd
dddd,yyyy'?'M'?'d'?'
Run Code Online (Sandbox Code Playgroud)
这是控制面板中的日期和时间格式对话框显示的内容(我的目标).
但是在.NET 3.5(及更早版本)中,返回以下内容:
yyyy'?'M'?'d'?'
yyyy-MM-dd
dddd, yyyy-MM-dd
dddd, yyyy'?'M'?'d'?'
Run Code Online (Sandbox Code Playgroud)
我去检查了使用EnumDateFormatsExEx(和早期版本)返回了什么值,它与.NET 4的结果相匹配.
差异不会打扰我; 我的问题是为什么结果不同?我认为底层实现是在呼唤EnumDateFormatsExEx
或类似,但在我解雇了Ilspy后,我没有看到任何类似的东西.我想显示控制面板中显示的相同列表,所以当格式不同时我感到很惊讶.我认为格式列表将来自操作系统,并且在运行时版本之间没有区别.
我有一个测试应用程序,允许用户从ComboBox中选择文化,并在多行TextBox中显示文化特定日期.代码如下:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox1.Items.AddRange(
CultureInfo.GetCultures(CultureTypes.SpecificCultures));
}
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
CultureInfo selectedCulture = comboBox1.SelectedItem as CultureInfo;
DateTime currentDate = DateTime.Now;
textBox1.Text =
"My Date : " + currentDate.ToString() + Environment.NewLine +
"Culture Specific Date: " + currentDate.ToString(selectedCulture);
}
}
Run Code Online (Sandbox Code Playgroud)
我注意到如果选择"ar-SA",阿拉伯语(沙特阿拉伯),那么当我在不同的机器上运行应用程序时,我会看到不同的结果.
在Windows 7计算机上,文本框显示:
My Date : 4/11/2012 4:07:09 PM Culture Specific Date: 19/05/33 04:07:09 ?
在Windows XP计算机上,文本框显示:
My Date : 4/11/2012 4:07:09 PM Culture Specific Date: 20/05/33 04:07:09 ? …
我正在申请.该应用程序使用日期格式,如
"2012-11-21 15:22:35"
.
我已经知道格式了"yyyy-MM-dd HH:mm:ss"
.但是,如何以编程方式查找任意输入字符串的日期和时间格式?有没有办法做到这一点?
我在CultureInfo类中发现了一件有趣的事情.我在ASP.NET中编写了一个应用程序,我正在使用Thread.CurrentThread.CurrentCulture
当前选择的语言,并且:
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(alias);
Run Code Online (Sandbox Code Playgroud)
有两个地方我可以在一个地方设置当前线程的文化,就像这样:
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("ru");
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("ru-RU");
然后我突然发现文化(1)与文化(2)不同,但两者都是俄语.
我做错了还是微软喝醉了?
编辑
@Tim Schmelter
var culture = CultureInfo.GetCultureInfo("ru");
var culture2 = CultureInfo.GetCultureInfo("ru-RU");
if (Equals(culture, culture2))
{
Console.Write(true);
return;
}
Console.Write(false);
Run Code Online (Sandbox Code Playgroud)
问题是 - "为什么微软将"ru"和"ru-RU"分开?
我正在寻找一种CultureInfo
从ISO 639-3语言代码构造对象的方法.我没有在MSDN中找到任何关于它的内容,并试图从所有文化列表中获取它不起作用...
CultureInfo cInfo = CultureInfo.GetCultures(CultureTypes.AllCultures)
.FirstOrDefault(r => String.Equals(r.ThreeLetterISOLanguageName, "CCH", StringComparison.CurrentCultureIgnoreCase));
Run Code Online (Sandbox Code Playgroud)
将始终返回null(请注意,"CCH"是ISO-639-3列表中的一种语言).
任何想法都表示赞赏,谢谢!
可能是愚蠢的问题,但我以前没有和Culture一起工作过.该日期的资产需要是:
MMMM dd"de"yyyy(没有引用"de").
junio 1 de 2015
我现在拥有的:
CultureInfo ci = new CultureInfo("es-ES", false);
string date = DateTime.Now.ToString("MMMM dd REPLACE yyyy", ci).Replace("REPLACE", "de");
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种"编程更正确"的做法,我不知道这样做而不是做 string.Replace
我正在尝试使用c#从国家/地区代码中获取国家/地区名称
例如 :
fr-fr
让我成为法国it-it
让我意大利我的代码的问题是我没有得到这个名字,而是这样的信息:
French (France)
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
var cultureInfo = new CultureInfo("fr-fr");
var result : cultureInfo.EnglishName
Run Code Online (Sandbox Code Playgroud)
我的结果是"French (France)"
代替法国.
我已经设法通过使用cultureInfo的parent属性获得我想要的东西,但我不确定它是否是一个好方法.
将Visual Studio 2019从v16.2.5更新到v16.3.5之后,在我使用字符串连接的每个位置的应用程序中都发生了一些错误。
例如:
int x = 5;
string y = x + " years";
Run Code Online (Sandbox Code Playgroud)