我有一个接受用户输入的文本框;我正在尝试使用此用户输入来填充我的一个业务对象的成员:
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将考虑当前的文化,但我找不到一种方法来实际让它适合我。有什么建议?
答案 0 :(得分:2)
显然,int不能容纳1.5! :-)使用float代替。
使用CurrentCulture而不是CurrentUICulture。我的文化是fr-BE(因此接受1,5但我的Windows用户界面是英文,但没有。)
我会使用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)进行本地化(例如日期/数字格式化)。