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

时间:2009-04-03 10:49:25

标签: c# asp.net localization culture

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

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;

当用户文化设置为期望“1,5”格式(逗号作为小数分隔符)的文化时 - 例如“ro-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;

案例1:当前文化是“en-GB” - 接受的输入是“1.5”,exchangeRate设置为1.5 - 一切正常。

案例2:当前文化是“ro-RO” - 接受的输入是“1,5”,但在执行decimal.TryParse ...行之后, exchangeRate设置为15 - 错误,显然。 我还要提一下,在这种情况下,txtExchangeRate.Text的值在我的Watch窗口中也显示为“1.5”。

所以,它看起来像decimal.TryParse将考虑当前的文化,但我找不到一种方法来实际让它适合我。有什么建议?

4 个答案:

答案 0 :(得分:2)

  1. 显然,int不能容纳1.5! :-)使用float代替。

  2. 使用CurrentCulture而不是CurrentUICulture。我的文化是fr-BE(因此接受1,5但我的Windows用户界面是英文,但没有。)

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

答案 1 :(得分:2)

好的,这里的代码似乎适用于我在上面的文章中描述的两种情况(1.文化“ro-RO”,逗号作为小数分隔符和2.文化“en-GB”,点作为小数分隔符) :

decimal exchangeRate;
decimal.TryParse(txtExchangeRate.Text, NumberStyles.Any, 
       CultureInfo.InvariantCulture, out exchangeRate);
entity.ExchangeRate = exchangeRate;

答案 2 :(得分:1)

仅供参考我知道这不是你的问题,而是指向其他可能会这样做的人:

当您设置文化时,您无法让您的应用程序能够处理不同文化的输入。它必须是您指定的类型。

因此,如果你将ro-RO设置为文化,它将不会同时理解1.5和1,5.

答案 3 :(得分:0)

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