在.NET CultureInfo
中,System.Globalization
命名空间中有类.它有两个类似的属性,都返回CultureInfo
类型的值:CurrentCulture
和CurrentUICulture
.
他们之间有什么区别?
我何时以及为何使用哪一个?
我似乎无法让本地化工作.
我有一个类库.现在我想在那里创建resx文件,并根据线程文化返回一些值.
我怎样才能做到这一点?
有没有办法为整个应用程序设置文化?所有当前线程和新线程?
我们将文化的名称存储在数据库中,当我们的应用程序启动时,我们就会这样做
CultureInfo ci = new CultureInfo(theCultureString);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
Run Code Online (Sandbox Code Playgroud)
但是,当然,当我们想要在新线程中做某事时,这会"丢失".有没有办法设置CurrentCulture
和CurrentUICulture
整个应用程序?那么新线程也会获得这种文化?或者,只要创建了一个我可以连接的新线程,就会触发某个事件?
我想知道是否有一种简洁而准确的方法来提取十进制值中的小数位数(作为int),可以安全地在不同的文化信息中使用?
例如:
19.0应该返回
1,27.5999应该返回4,19.12
应该返回2,
等等.
我写了一个查询,在一个句点上执行字符串拆分以查找小数位:
int priceDecimalPlaces = price.ToString().Split('.').Count() > 1
? price.ToString().Split('.').ToList().ElementAt(1).Length
: 0;
Run Code Online (Sandbox Code Playgroud)
但我发现这只适用于使用'.'的地区.作为小数分隔符,因此在不同系统中非常脆弱.
我有代码:
DateTime.Now.DayOfWeek.ToString()
Run Code Online (Sandbox Code Playgroud)
这给了我一周的英文日名称,我希望有德文版,如何在这里添加CultureInfo以获得德文日的名字?
我正在运行ReSharper的测试版,它给了我以下代码的警告:
int id;
// ...
DoSomethingWith(id.ToString());
Run Code Online (Sandbox Code Playgroud)
警告在id.ToString()
通话中,它告诉我"明确指定字符串转换中的文化".我理解这个警告,而且我知道如何修复它 - 只需将代码更改为更加笨拙id.ToString(CultureInfo.InvariantCulture)
.
但我的问题是:这是必要的吗?我的意思是,显然,当您使用类型DateTime
(不同的文化具有不同的日期格式)和Double
(用于小数点的不同字符)时,指定文化很重要.但是Int32.ToString()
,至少在en-US和invariant文化中,根本不添加任何格式.没有逗号,没有小数点,没有美元符号,没有.那么文化会有什么不同?
当您调用无参数时,是否有一些文化实际上会添加某种格式Int32.ToString()
?或者这是ReSharper测试版中的错误,这个警告真的不适用Int32
(在这种情况下我会提交ReSharper错误报告)?
我正在解析ASP.NET WebForms
页面中的DateTime值,并且日期字符串一直被DateTime.TryParseExact()
方法拒绝,即使它明确匹配提供的格式字符串之一.
它似乎在我家的开发机器上失败但在生产服务器上工作,所以我在考虑涉及本地日期设置,但即使我提供一个IFormatProvider (CultureInfo)
对象作为参数,也会发生此错误
这是代码:
DateTime startDate;
string[] formats = { "dd/MM/yyyy", "dd/M/yyyy", "d/M/yyyy", "d/MM/yyyy",
"dd/MM/yy", "dd/M/yy", "d/M/yy", "d/MM/yy"};
var errStart = row.FindControl("errStartDate"); //my date format error message
if (!DateTime.TryParseExact(txtStartDate.Text, formats, null, DateTimeStyles.None, out startDate))
{
errStart.Visible = true; //we get here even with a string like "20/08/2012"
return false;
}
else
{
errStart.Visible = false;
}
Run Code Online (Sandbox Code Playgroud)
注意我null FormatProvider
在上面给出了一个,但是当我为这个参数提供一个CultureInfo
对象
时会出现同样的问题(CultureInfo provider = new CultureInfo("en-US"))
.
我错过了什么?
我有一个看起来像这样的字符串:"9/1/2009".我想将其转换为DateTime对象(使用C#).
这有效:
DateTime.Parse("9/1/2009", new CultureInfo("en-US"));
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么这不起作用:
DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);
Run Code Online (Sandbox Code Playgroud)
日期中没有单词(如"九月"),我知道具体的格式,所以我宁愿使用ParseExact(我不明白为什么需要CultureInfo).但我继续得到可怕的"字符串未被识别为有效的DateTime"异常.
谢谢
一点点跟进.以下是3种有效的方法:
DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", null);
DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture);
DateTime.Parse("9/1/2009", new CultureInfo("en-US"));
Run Code Online (Sandbox Code Playgroud)
这里有3个不起作用:
DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.CurrentCulture);
DateTime.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US"));
DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);
Run Code Online (Sandbox Code Playgroud)
所以,Parse()适用于"en-US",但不适用于ParseExact ...意外?
我正在从配置文件中读取加密的凭证/连接字符串.Resharper告诉我,"String.IndexOf(string)在这里是特定于文化的"这一行:
if (line.Contains("host=")) {
_host = line.Substring(line.IndexOf(
"host=") + "host=".Length, line.Length - "host=".Length);
Run Code Online (Sandbox Code Playgroud)
......所以想把它改成:
if (line.Contains("host=")) {
_host = line.Substring(line.IndexOf("host=", System.StringComparison.Ordinal) + "host=".Length, line.Length - "host=".Length);
Run Code Online (Sandbox Code Playgroud)
无论应用程序在何处部署,我正在阅读的值始终为"host =".添加这个"System.StringComparison.Ordinal"位是否真的明智?
更重要的是,它可以伤害任何东西(使用它)吗?
c# resharper cultureinfo configuration-files string-comparison
有没有办法从应用程序文化设置动态获取当前信息?基本上,如果用户已将文化设置为美国,我想知道货币是美元,或者如果他们将其设置为英国我想要英镑等...等等.
这样我就可以在付款时将此信息发送给PayPal
cultureinfo ×10
c# ×8
.net ×4
datetime ×2
resharper ×2
asp.net ×1
currency ×1
decimal ×1
localization ×1
parsing ×1