通常你可以写一些像这样的东西
CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
但是这样您只能获得在启动应用程序时配置的CultureInfo,如果之后设置已更改,则不会更新.
那么,如何在控制面板 - >区域和语言设置中获取当前配置的CultureInfo?
我有一个用C#编写的应用程序,它没有GUI或UI,而是编写由另一个应用程序解析的文件(在XML和其他应用程序中).
我有一个客户,其CultureInfo将NumberDecimalSeparator设置为逗号,导致浮点数解析错误(PI最终为3,1415).
我想要一种在应用程序中为所有线程全局设置CultureInfo的方法.我试过了:
更改为使用显式格式不是一种选择(150K +行,大多数由前雇员编写).
[编辑] 应用程序绑定到套接字并处理来自专用客户端的请求.根据请求类型,它会生成不同的处理程序类.
对不起,当我第一次发布时,我应该在#1中澄清(我虽然)我已经在所有明确生成的处理程序中完成了这一点.
事实证明我错过了导致问题的线程/处理程序. 所以应用程序现在正常工作,但问题仍然是关于是否可以在所有线程上设置文化.
如果它可以迭代所有线程,它也会解决问题.所以:
如何在当前进程中获取所有Thread对象(而不是ProcessThread)?
我有以下代码以en-us格式生成日期字符串.我想传入LCID(或本地化语言的等效值)来生成日期字符串的本地化版本.我怎么做到这一点?
public static string ConvertDateTimeToDate(string dateTimeString) {
CultureInfo culture = CultureInfo.InvariantCulture;
DateTime dt = DateTime.MinValue;
if (DateTime.TryParse(dateTimeString, out dt))
{
return dt.ToShortDateString();
}
return dateTimeString;
}
Run Code Online (Sandbox Code Playgroud) 这行代码:
DateTime dt = DateTime.ParseExact(time, "hh:mm", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
解析"时间"值"12:45"就好了,但抛出了"13:00"的异常
我应该使用其他一些CultureInfo值,还是我需要将"pm"附加到12以上的小时值,或者......?
错误消息是:System.FormatException未处理Message = String未被识别为有效的DateTime.
我知道有三种方法可以获得CultureInfo对象的完整语言名称.
CultureInfo.DisplayName
CultureInfo.NativeName
CultureInfo.EnglishName
Run Code Online (Sandbox Code Playgroud)
DisplayName以已安装的.net语言提供名称.
NativeName以"CultureInfos"语言提供名称.
EnglishName用英文命名(令人惊讶......)
因此,对于CultureInfo de-DE,这(在英语.net上安装)
德语
德语
德语
现在我的问题是:有没有办法用另一种语言来询问de-DE的语言名称?例如,我想要荷兰语的de-DE语言名称(这将是'Duits').
我在一个相当大的ASP .NET Web Forms应用程序上工作,该应用程序目前主要在美国使用.我们正在将其推广到世界其他地区,这当然意味着我们正在努力本地化应用程序的所有领域.一般来说,我们的方法是在每个请求开始时设置当前线程的CurrentCulture和CurrentUICulture属性,以支持基于当前用户的语言环境进行正确的格式化和资源提取.
但是,在某些情况下,我们需要使用除当前用户文化之外的文化来运行某些代码.例如,"用户A"居住在德国,但适用于与法国其他公司有业务往来的公司.当"用户A"想要为其中一家法国公司创建发票(PDF)时,我们希望发票生成代码以"fr-FR"文化而非"de-DE"文化运行.
我已经考虑过几种方法可以很容易地做到这一点,我想知道我是否正确地做到了这一点.我主要关心的是性能和线程安全性.
一种方法涉及一种静态方法,旨在使用提供的文化来运行给定任务.像这样的东西:
public static void RunWithCulture(CultureInfo culture, Action task)
{
if (culture == null)
throw new ArgumentNullException("culture");
var originalCulture = new
{
Culture = Thread.CurrentThread.CurrentCulture,
UICulture = Thread.CurrentThread.CurrentUICulture
};
try
{
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
task();
}
finally
{
Thread.CurrentThread.CurrentCulture = originalCulture.Culture;
Thread.CurrentThread.CurrentUICulture = originalCulture.UICulture;
}
}
Run Code Online (Sandbox Code Playgroud)
然后可以像这样调用此方法:
var customerCulture = new CultureInfo(currentCustomer.Locale);
CultureRunner.RunWithCulture(customerCulture, () => invoiceService.CreateInvoice(currentCustomer.CustomerId));
Run Code Online (Sandbox Code Playgroud)
我还考虑创建一个实现IDisposable的类,它负责在它的ctor中设置线程文化,然后在Dispose方法中返回原始文化,所以你可以像这样调用它:
var customerCulture = new CultureInfo(currentCustomer.Locale);
using(new CultureRunner(currentCustomer.Locale))
{
invoiceService.CreateInvoice(currentCustomer.CustomerId);
}
Run Code Online (Sandbox Code Playgroud)
我错了吗?哪个,如果这些方法中的任何一个更可取?
我想将数值转换为字符串,显示特定于文化的数字.例如,阿富汗使用的Dari语言(文化名称"prs-AF")使用东方阿拉伯数字而不是大多数西方文化中使用的阿拉伯数字(0,1,2,3,4,5,6,7,8,9
).
在检查Framework内置的CultureInfo类时,它会列出正确的本机数字(从LinqPad的输出中截取):
CultureInfo.CreateSpecificCulture("prs-AF").NumberFormat.NativeDigits
Run Code Online (Sandbox Code Playgroud)
但是,当尝试将数字转换为字符串以在该文化中显示时,我没有获得原始数字:
var number = 123.5;
var culture = CultureInfo.CreateSpecificCulture("prs-AF");
Thread.CurrentThread.CurrentUICulture = culture;
Thread.CurrentThread.CurrentCulture = culture;
var text = number.ToString(culture);
Console.WriteLine(text);
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何显示原生数字?
指定CurrentCulture或InvariantCulture而不指定文化的最佳做法是什么?
例如,根据我的阅读,如果您正在进行序列化,则需要使用InvariantCulture作为指定数据值的规范表示的方法.这是基于文化的字符串操作的相对较小的百分比.
我发现它很长,很冗长,而且大部分时间都是丑陋的,每次我都说出来,比如说:
var greeting = string.Format(CultureInfo.CurrentCulture, "Hello ", userName);
Run Code Online (Sandbox Code Playgroud)
然而,我的团队最近开启了FxCop,现在总是在每个地方都使用CultureInfo.结合简洁性,可读性和功能性的最佳技术是什么?
一些好的阅读材料:
我的应用程序在web.config中设置了pt-BR文化(日期是dd-mm-yyyy):
<globalization enableClientBasedCulture="false" requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="iso-8859-15" responseHeaderEncoding="utf-8" resourceProviderFactoryType="string" enableBestFitResponseEncoding="true" culture="pt-BR" uiCulture="pt-BR" />
Run Code Online (Sandbox Code Playgroud)
在我的系统上创建的所有DateTime都是正确的格式,但我创建了一个控制器方法:
public ActionResult Test(DateTime date)
{
}
Run Code Online (Sandbox Code Playgroud)
当日期采用portuguese-br格式时,直接在浏览器中调用该方法传递null,如下所示:
mysite/Test/?date=19/01/2012 => date = null in my controller
mysite/Test/?date=01/01/2012 => date is fine, but in US format (mm-dd-yyyy)
Run Code Online (Sandbox Code Playgroud)
我如何解决这个问题,接受我的日期格式?
这真让我抓狂.我在ASP.NET 2.0 WebForm页面中有以下字符串
string s = "0.009";
Run Code Online (Sandbox Code Playgroud)
很简单.现在,如果我的文化是西班牙语 - 这是"es-ES" - 我尝试将字符串转换为Double,我会执行以下操作:
double d = Double.Parse(s, new CultureInfo("es-ES"));
Run Code Online (Sandbox Code Playgroud)
我期待的是0,009.相反,我得到9.我明白.NET认为它是千分隔符,在en-US中是一个逗号,但不应该把我传递给parse方法的文化信息并应用正确的格式转换?
如果我做
double d = 0.009D;
string formatted = d.ToString(new CultureInfo("es-ES"));
Run Code Online (Sandbox Code Playgroud)
格式化现在是0,009.任何人?
cultureinfo ×10
c# ×9
culture ×3
.net ×2
datetime ×2
localization ×2
double ×1
formatting ×1
string ×1