2

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

公共 System.Decimal?汇率

该应用程序已本地化 - 我需要同时支持接受这些作为有效输入的文化:“1,5”和“1.5”

我现在的代码是:

varculture = Thread.CurrentThread.CurrentUICulture;

国际汇率;
int.TryParse(txtExchangeRate.Text, NumberStyles.Number, 文化,
    出汇率);

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.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 的值在我的监视窗口中也显示为“1.5”。

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

4

4 回答 4

2
  1. 显然, int 不能容纳 1.5 !:-) 改用浮点数。

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

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

于 2009-04-03T11:49:34.817 回答
2

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

十进制汇率;
decimal.TryParse(txtExchangeRate.Text, NumberStyles.Any,
       CultureInfo.InvariantCulture, out exchangeRate);
entity.ExchangeRate = exchangeRate;
于 2009-04-04T08:04:09.513 回答
1

仅供参考,我知道这不是您的问题,但它为其他可能正在这样做的人提供了指导:

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

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

于 2009-04-03T11:34:46.520 回答
0

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

于 2009-04-03T11:04:57.887 回答