【问题标题】:Validate double number in current culture验证当前文化中的双数
【发布时间】:2015-06-17 13:10:33
【问题描述】:

在当前文化中有一种方法可以验证双数吗?我试过这个:

var number ="10,10";
double value = double.Parse(number,
                    NumberStyles.Float, 
                    CultureInfo.CurrentCulture);

如果我尝试使用“es-ES”(其中小数分隔符为“,”),那么解析工作完美,我得到一个双 10.10,但如果我尝试使用“en-US”(其中小数分隔符是".") 解析无法理解小数点,所以就省略了,所以我得到一个1010不正确的数字。

当我尝试为指定的文化转换错误的数字时,有办法让我得到一个异常吗?

编辑:“,”不是千位分隔符,我指的是像 es-ES 这样的文化的小数分隔符

【问题讨论】:

  • 不,因为你必须知道"10,10"的含义。所以你必须依赖CurrentCulture 或者知道最初使用的是什么。
  • 我知道正在使用的 CurrentCulture 是什么,但我要求使用正确的格式,我插入了错误的格式,我应该无法将一种文化转换为另一种文化,我只是想要一个错误弹出,不是转换失败
  • double.TryParse 怎么样?
  • 如果指定NumberStyles.Float,则不使用组分隔符,因此10,10不应被解释为“en-US”中的组分隔符。相反,您会根据需要获得异常。
  • 就像@TimSchmelter 说的那样,没有任何事情可以 100% 确定 - 100.000 和 100,000 可能是相同的数字,具体取决于 source 文化是什么。如果您根据客户端文化将数字格式化为字符串,那么您必须知道客户端文化才能将其解析回数字。

标签: c# parsing double cultureinfo currentculture


【解决方案1】:

在我的机器上,正如预期的那样,以下会引发 FormatException:

var number ="10,10";
double value = double.Parse(number,
NumberStyles.Float, 
CultureInfo.InvariantCulture);

我怀疑您使用的是NumberStyles.AllowThousands。例如,以下将返回 1010:

var number ="10,10";
double value = double.Parse(number,
NumberStyles.Float | NumberStyles.AllowThousands, 
CultureInfo.InvariantCulture);

更新

回应评论:

...但是如果我使用 en-US “10,10” 变成 “1010” 而不是抛出错误

这不是我所期望的;例如,以下将抛出FormatException

var number ="10,10";
double value = double.Parse(number,
NumberStyles.Float, 
new CultureInfo("en-US"));

【讨论】:

  • 是的,这是真的,因为 "," 在 InvariantCulture 中不是有效的分隔符,但是我使用多种文化来呈现我的应用程序,如果我使用 es-ES "10,10" 会打开10.10,但如果我使用 en-US,“10,10”变成“1010”而不是抛出错误(这就是我想要的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2020-10-02
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多