【问题标题】:String with suffix fails parsing带后缀的字符串解析失败
【发布时间】:2015-12-17 14:18:07
【问题描述】:

如果有人将带有后缀的字符串传递给decimal,则会失败。

decimal testValue;
decimal.TryParse("5M", NumberStyles.Number, CultureInfo.CurrentCulture, out testValue)

以下解析将返回false

为什么TryParse传入带后缀的字符串会失败?

【问题讨论】:

  • 为什么要成功? M 是什么意思?它没有任何意义,例如 RAM 或磁盘大小。在某些领域,这可能意味着百万。或者不。
  • 当你已经知道你想要它是哪种类型时,我认为后缀没有多大意义用于解析。 C# 代码本身的 m 后缀的意义在于,当你通常会得到另一种类型时,选择 decimal 类型。
  • 5M 在这个例子中的实际含义是什么?是 5 还是 5000000 ?

标签: c# string parsing decimal


【解决方案1】:

因为Decimal.TryParsedoes not support it

根据style的值,s参数可能包含以下元素:

[ws][$][sign][digits,]digits[.fractional-digits][e[sign]digits][ws]

方括号([ 和 ])中的元素是可选的。下表描述了每个元素。

ws:可选空格。如果 style 包含 NumberStyles.AllowLeadingWhite 标志,则空格可以出现在 s 的开头。如果 style 包含 NumberStyles.AllowTrailingWhite 标志,它可以出现在 s 的末尾。

$:特定于文化的货币符号。它在字符串中的位置由 provider 参数的 IFormatProvider.GetFormat 方法返回的 NumberFormatInfo 对象的 NumberFormatInfo.CurrencyNegativePattern 或 NumberFormatInfo.CurrencyPositivePattern 属性定义。如果 style 包含 NumberStyles.AllowCurrencySymbol 标志,则货币符号可以出现在 s 中。

sign:可选符号。

digits:从 0 到 9 的数字序列。

.:特定于文化的小数点符号。

fractional-digits:从 0 到 9 的数字序列。

【讨论】:

    【解决方案2】:

    因为在不删除M 部分的情况下,无法解析您的字符串。而NumberStyles 都没有这样的功能。

    可以建议Replace你的M使用空字符串,但这只能解决你的情况,它不是一个通用的解决方案。

    decimal testValue;
    decimal.TryParse("5M".Replace("M", ""), NumberStyles.Number, 
                                            CultureInfo.CurrentCulture, out testValue);
    

    real-type-suffix 指定数字类型。它向 C# 编译器教授什么是数字文字类型。在字符串中,它表示 nothing。它只是另一个角色。

    【讨论】:

    • @Carl 你应该发布一个单独的 问题,询问你想要什么 - 如何解析5M,这意味着(我假设)500 万。不过先检查重复的问题
    • @PanagiotisKanavos 实际上我猜 OP 有那个因为M 是十进制的后缀。
    • @juharr 证明了我的观点 - 相同的后缀对于不同的 意味着不同的含义。不能指望框架函数来处理这个问题。这是特定领域库的工作,例如数学库
    • @Downvoter 至少愿意发表评论,这样我才能看到我可能哪里错了?
    猜你喜欢
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2019-02-04
    • 2018-02-15
    相关资源
    最近更新 更多