Tag: 全球化

如何在.Net中更改整个流程(不仅仅是当前线程)的CurrentCulture?

我有一种情况需要将我的进程’locale设置为en-US。 我知道如何为当前线程执行此操作: System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(“en-US”); 但我的应用程序使用BackgroundWorkers进行一些处理,并且这些工作线程的区域设置似乎不受上述对其产生主线程的更改的影响。 那么如何在我的应用程序中为所有线程设置区域设置而不在每个线程中手动设置?

CultureInfo&DateTimeInfo:如何检查是否是24小时?

我正在修改一个全球化的Web应用程序,它为每个登录用户使用存储的CultureInfo。 客户希望时间数据输入被本地化。 显示不是问题,因为格式化已经可用。 但是我需要检测当前cultureinfo是24小时还是上午/下午所以我可以显示正确的输入框(而不仅仅是文本字段)。 我最初的想法是检查CultureInfo的DateTimeInfo属性,看看ShortTimePattern是否包含大写H或小写h,但这对我来说不够健壮。 有没有更好的办法? 我已经阅读了两者的类属性,但除非我遗漏了什么,否则我看不到任何现有的方法或属性。

为什么对象没有接受IFormatProvider的重载?

将例如decimal转换为string ,使用CultureInfo.InvariantCulture并将其作为IFormatProvider传递。 但为什么这个超载不在object呢? 一个很好的实现是: public virtual string ToString() { // yadayada, usual ToString } public virtual string ToString(IFormatProvider provider) { return ToString(); } 这对object类没有任何伤害或好处,但是从它派生的对象可以覆盖重载,当你不确定类型时调用它会容易得多。 让我遇到这个的问题是当我创建一个方法来获取类的所有属性并将其写入xml时。 因为我不想检查对象的类型,所以我只调用了ToString 。 但这是一个小数,输出将基于线程的CurrentCulture ,这不是最佳的。 我能看到的唯一解决方法是将CurrentCulture更改为InvariantCulture ,然后将其更改回以前的状态。 但那只会是丑陋的,因为我必须先写下试试块等等。 我目前的代码是: foreach (var property in typeof(Order).GetProperties(BindingFlags.Public | BindingFlags.Instance). Where(c => ValidTypes.Contains(c.PropertyType))) { var value = property.GetValue(order, null); if (value != null) { writer.WriteElementString(property.Name, […]

检测小数分隔符

我必须在当前窗口设置中检测小数点分隔符。 我使用visual studio 2010,windows窗体。 特别是,如果DecimalSeparator是逗号,如果用户在textbox1中输入点,我需要在textbox2中显示零。 我尝试使用此代码,但不起作用: private void tbxDaConvertire_KeyPress(object sender, KeyPressEventArgs e) { string uiSep = CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator; if (uiSep.Equals(“,”)) { while (e.KeyChar == (char)46) { tbxConvertito.Text = “0”; } } } 我也尝试过这段代码,但不能正常工作: private void tbxDaConvertire_KeyPress(object sender, KeyPressEventArgs e) { string uiSep = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; if (uiSep.Equals(“,”)) { if (e.KeyChar == (char)46) { tbxConvertito.Text = “0”; } […]

处理不同文化validation的最佳方法是什么?

我正在尝试构建一个多语言MVC应用程序。 我的应用程序中有一个表单,我有字段输入成本。 我能够使用西class牙文化创建一个记录。 但是在尝试更新记录时,我得到了jqueryvalidation错误。 我收到一条默认错误消息: 该字段必须是数字。 在我的视图模型中,我设置了以下属性。 [LocalizedDisplayName(“Label_Cost”)] [RegularExpression(“^[^,]+$”, ErrorMessage = null, ErrorMessageResourceName = “Error_Message_Html_Tags_Prevented”, ErrorMessageResourceType = typeof(Resources))] [Range(0, 9999.99, ErrorMessage = null, ErrorMessageResourceName = “Error_Message_Cost_Not_Valid”, ErrorMessageResourceType = typeof(Resources))] public decimal? Cost { get; set; } 我已经在我的Gobal.asax文件中设置了以下内容 protected void Application_AcquireRequestState(object sender, EventArgs e) { try { HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(“CurrentCulture”); string culutureCode = cookie != […]

如何对非阿拉伯语等非英语语言使用DateTime.TryParse()?

我需要将字符串转换为非英语语言的DateTime对象。 我已经看到很多将DateTime转换为其他语言的字符串的例子,但不是相反。 这似乎不起作用: CultureInfo provider = new CultureInfo(“ar-AE”); // Arabic – United Arab Emirates string sample = “الاربعاء 16 مارس 2011”; // Arabic date in Gregorian calendar DateTime result; DateTime expected = new DateTime(2011, 3, 16); // the expected date bool b; b = DateTime.TryParse(sample, provider, DateTimeStyles.None, out result); Assert.IsTrue(b); Assert.AreEqual(expected, result); 另外,我需要处理其他日历中的字符串。 这是我尝试过的,它似乎也没有用。 CultureInfo […]

如何使用NumberFormatInfo删除负值的括号

我们目前正在使用以下内容在我们的网络应用程序中创建美元价值: string.Format(“{0:C0}”, dollarValue ); 在这个例子中,如果dollarValue是145,那么我们将看到:145美元。 如果它是-145,那么我们将看到(145美元)而不是 – 145美元。 请注意,对于我们来说,dollarValue是一个double,但它可以是任何数字类型。 我认为。 无论如何,我想要的是145美元或145美元。 现在,根据我的研究,可以使用NumberFormatInfo类来完成此操作。 我无法弄清楚如何使用它,我找不到任何有效的例子。 我确实在这里看到了这个问题: 当货币值为0.00美元时,C#创建一个自定义的NumberFormatInfo来显示“Free”但是来自这个问题的MSDN示例似乎与我真正想做的有点不同。 我知道,我需要做以下事情: double dollarValue = -145d; string myMoney = dollarValue.ToString( “C0”, someIFormatProvider ); someIFormatProvider可能是NumberFormatInfo类型。 现在,我所做的就是: NumberFormatInfo ni = new NumberformatInfo(); ni.CurrencyNegativePattern = 1; // The value 1 should mean not to use parenthesis string myMoney = dollarValue.ToString( “C0”, ni ); …我得到一个“Instance […]

将数字格式化为字符串,使用逗号代替小数

我有以下号码: 4.3 对于我们的一些欧洲朋友,我想将这个数字显示为4,3 。 我的印象是以下行可以解决问题: string ret = string.Format(“{0:0,0}”, 4.3); // returns “04”, not “4,3” 我使用的是不正确的字符串吗?

.NET(3.5)使用点而不是冒号来格式化时间作为它的IT文化的TimeSeparator?

根据维基百科 (并在Dario Solera的回答中证实),在意大利,他们使用冒号格式化时间: 24小时表示法以书写forms使用冒号作为分隔符。 示例:14:05。 会议记录以两位数字写成; 小时数可以带或不带前导零写入。 但是,运行以下代码似乎输出点: using System.Globalization; Thread.CurrentThread.CurrentCulture = new CultureInfo(“it-IT”); Thread.CurrentThread.CurrentUICulture = new CultureInfo(“it-IT”); // Outputs “11.08” Console.WriteLine(DateTime.Now.ToShortTimeString()); // Outputs “.” Console.WriteLine(new CultureInfo(“it-IT”).DateTimeFormat.TimeSeparator); 这是一个框架错误吗? 什么是“修复”它的最佳方法? TimeSeparator是可设置的 – 我们应该在分配给Thread.CurrentThread.CurrentCulture等之前覆盖它吗?

在运行时更改语言的正确方法

在运行时更改Form语言的正确方法是什么? 使用这样的递归手动设置所有控件 将语言选择保存到文件>重新启动应用程序>在InitializeComponent();之前加载语言选项InitializeComponent(); 使用Form构造函数替换active的实例(如果这是可能的话) 还有别的 关于这个问题有很多半成文,但没有一个能提供真正的答案,说明什么是正确的方法呢? 更新: 澄清我的问题: 做这样的事情: public Form1() { Thread.CurrentThread.CurrentUICulture = new CultureInfo(“de”); this.InitializeComponent(); } 工作正常,我的所有控件和资源中的其他所有内容都可以正确转换。 做类似的事情: private void button1_Click(object sender, EventArgs e) { Thread.CurrentThread.CurrentUICulture = new CultureInfo(“en”); } 什么都不做,Form保留在我在InitializeComponent();之前设置的语言中InitializeComponent();