C# ASP.NET-转换本地化的数字

C# ASP.NET-转换本地化的数字,c#,asp.net,localization,culture,C#,Asp.net,Localization,Culture,我有一个接受用户输入的文本框;我正在尝试使用此用户输入来填充我的一个业务对象的此成员: public System.Decimal? ExchangeRate 公共系统,十进制?兑换 应用程序是本地化的-我需要同时支持接受这些作为有效输入的区域性:“1,5”和“1.5” 我现在的代码是: var culture = Thread.CurrentThread.CurrentUICulture; int exchangeRate; int.TryParse(txtExchangeRate.Text

我有一个接受用户输入的文本框;我正在尝试使用此用户输入来填充我的一个业务对象的此成员:

public System.Decimal? ExchangeRate 公共系统,十进制?兑换 应用程序是本地化的-我需要同时支持接受这些作为有效输入的区域性:“1,5”和“1.5”

我现在的代码是:

var culture = Thread.CurrentThread.CurrentUICulture; int exchangeRate; int.TryParse(txtExchangeRate.Text, NumberStyles.Number, culture, out exchangeRate); entity.ExchangeRate = exchangeRate; var culture=Thread.CurrentThread.CurrentUICulture; 国际汇率; int.TryParse(txtExchangeRate.Text,NumberStyles.Number,区域性, 汇率); entity.ExchangeRate=ExchangeRate; 当用户区域性设置为期望“1,5”格式(逗号作为十进制分隔符)的区域性时,例如“ro”,我希望存储在entity.ExchangeRate中的值为1.5;但是,当运行上面的代码时,它会被转换为15

有没有关于如何转换这些不同格式的建议,以便存储在我的业务实体中的数据是“1.5”(小数点分隔符)

谢谢


你们说得对-使用Thread.CurrentThread.CurrentCulture而不是Thread.CurrentThread.CurrentUICulture和decimal.TryParse而不是int.TryParse是有意义的

但是这些改变仍然不能解决我的问题。在进一步研究代码之后,我现在可以将问题简化为:

我使用的是telerik RadNumericTextBox控件,它强制用户根据他们的文化使用正确的格式。因此,当Thread.CurrentThread.CurrentCulture设置为“ro-ro”时,它将只接受“1,5”格式,而当设置为“en GB”时,它将只接受“1.5”格式

以下是我现在使用的代码:

decimal exchangeRate; decimal.TryParse(txtExchangeRate.Text, out exchangeRate); entity.ExchangeRate = exchangeRate; 十进制汇率; decimal.TryParse(txtExchangeRate.Text,out-exchangeRate); entity.ExchangeRate=ExchangeRate; 案例1:当前区域性为“en GB”-接受的输入为“1.5”,exchangeRate设置为1.5-一切正常

案例2:当前区域性为“ro”-接受的输入为“1,5”,但在执行decimal.TryParse后。。。行,exchangeRate设置为15-显然错误。 我还应该提到,在本例中,txtExchangeRate.Text的值在我的监视窗口中也显示为“1.5”


因此,它看起来像decimal.TryParse将考虑当前的文化,但我找不到一种方法使它真正适合我。有什么建议吗

您可能应该使用CurrentCulture(而不是CurrentUICulture)进行本地化(例如日期/数字格式)。

仅供参考,我知道这不是您的问题,但它是其他可能正在进行本地化的人的一个指针:

设置区域性时,应用程序无法处理不同区域性的输入。它必须是您指定的类型

因此,如果您将ro设置为文化,它不会将1.5和1.5理解为同一事物

  • 显然,int不能容纳1.5!:-)改用float

  • 使用CurrentCulture而不是CurrentUICulture。我的文化背景是fr BE(因此接受1,5,但我的Windows UI是英语,而不是英语)

  • 我将使用CurrentCulture和InvariantCulture进行float.Parse()测试:当一些程序学会接受“1,5”时,每个人都习惯于键入“1.5”。没有什么比Excel要求我在说1.5时输入1,5更让我烦恼的了!此外,在比利时,第一年政府推出了基于网络的纳税申报,该网站强迫您使用逗号而不是句点作为小数点。每个人都想知道为什么输入的数字被拒绝! 因此,对你的用户友好,并接受两者


  • 好的,下面的代码似乎适用于我在上述帖子中描述的两种情况(1.区域性“ro-ro”,逗号作为小数分隔符,2.区域性“en-GB”,点作为小数分隔符):

    十进制汇率; decimal.TryParse(txtExchangeRate.Text,numberstyle.Any, CultureInfo.InvariantCulture,out exchange); entity.ExchangeRate=ExchangeRate;
    你不应该使用decimal和decimal.TryParse吗?当您将其解析为int时,它应该返回为1,而不是15,因为小数部分将被截断。@tvanfosson:这应该是一个答案,在使用CurrentCulture(“35”而不是“3.5”)时,我仍然得到相同的结果。 decimal exchangeRate; decimal.TryParse(txtExchangeRate.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out exchangeRate); entity.ExchangeRate = exchangeRate;